what is this site? #5 | virtual book

what is this site? #5

Mentioned in ideas for this site

On the surface, this is an ordinary blog. For its techno-literary lean, it could be categorized with the likes of robinsloan.com, craigmod.com, sive.rs, jsomers.net, and macwright.com. My goal, however, is not just to publish my thoughts on subjects that interest me but to promote

novel ways

what is a virtual book?

Mentioned in On Writing (2000), what is this site?, what is this site? #2, what I'm doing now #5, my pattern language, building this site, what is this site? #3, what is this site? #4, what I am doing in 2025, what is this site? #5, ideas for this site

I wrote an essay called The Virtual Book but I never defined the term. By virtual book I mean a book unbound by the traditional and physical constraints of printed books. Even though I think the greatest possibilities await in the virtual world of computers, I don’t think virtual books need to be digital. The possibilities that excite me challenge not only the physicality of books but also their intangible attributes.

A virtual book can be multimedia. It can consist of words, images, video, audio. There, we got the obvious one out of the way.

A virtual book can be readerdriven. Instead of forcing readers to follow the author’s thought process, a virtual book can let each reader steer the way. Wikipedia does this already. It lets you search the page for keywords, skip to the section you’re interested in, and even escape into a tangential topic, never to return. This is a natural way to consume Wikipedia because its form affords it.

Books generally have one start and one ending, but a virtual book can be nonlinear. Wikipedia is again the obvious example. But letting the reader drive is only one way to create a nonlinear book. It’s also possible to create multiple entrypoints, or even multiple endings, like Black Mirror: Bandersnatch.

A virtual book can be dynamic. It can change after its initial creation. Printed books, on the other hand, are static snapshots laboriously rendered by a particular author at a particular time. But what if a theory is debunked? Or a hypothesis confirmed? Or a record shattered? Or, in the case of storytelling, what if a loose end can be tied up neatly?

A virtual book can be nonmonolithic. It does not need to be discrete or selfcontained. It can consist of many interconnected parts that make up the whole but can exist without it. It can reference other virtual books, borrow bits from them, and lend bits of its own. For example, if Herbie Hancock’s memoir was a virtual audiobook, it could allow its snippets to be reconstrued into a documentary about jazz. (If Ken Burns’ Jazz documentary series was also ‘virtualized’, it could have been updated 15 years after its release to include bits of Herbie’s narration.) In fact, it could provide material for documentaries about many different topics: jazz, funk, hip hop, Miles Davis, Black Nationalism, Nichiren Buddhism, meditation, and crack addictions, to name some of the obvious ones.

A virtual book can be responsive. What if a reader could expect a book to field spontaneous questions? ChatGPT is an obvious candidate here, but the possibility is broader. What if Herbie Hancock returned to his memoir every now and then to answer questions that readers had left behind while reading it? What if readers could raise flags on issues that factcheckers would then verify or return to the author for amendment?

The possibilities are plenty, and they are thrilling. The difficulty in realizating them is not technological, but legal and political. Powerful companies – and therefore governments – are hugely incentivized to prevent the free exchange of “intellectual property”. To make virtual books possible, we need not only the technological power of software, but also its progressive politics.


Dedicated to Aaron Swartz.

of #reading and #writing. I attempt to do this not only through the ideas I discuss on site but also through the custom features I build into its interface, which allow readers to explore the content on this site according to their curiosity:

features motivation notes date implemented
tags tags are a great way to connect ideas without forcing them into a hierarchy. in general, a network is better way to organize information. it’s simple, meaningful, and less restrictive. I think the Composition Over Inheritance principle of programming depends on similar insight. others have written about this e.g. Folders Kill Creativity. originally implemented in okjuan.github.io repo, predecessor of vbook. hardest feature to implement because I knew the least about Jekyll and GitHub Pages at that point. see the PR description for more info. May ‘23
backlinks helps make this site explorable and interconnected

like Wikipedia

what is this site?

Mentioned in bookmarks, what is this site? #5

This site – okjuan.me/vbook – contains all my public writing. My

original idea

for it was to gather all my essays to create a wikipedia-like experience. Then I realized I should loosen the restriction on form and build a vaster network of ideas, one that may include notes, reviews, journal entries, poems, stories, pictures, videos, audio, or any form that is yet to occur to me or anyone else.

You can think of this site as a digital garden, but I hope it becomes a good example of what I call a

virtual book

.

.

implemented as a custom Liquid tag. Nov ‘23
hoverbox post previews allows readers to peek at linked posts without leaving the current context, like in Wikipedia. I’ve seen other interesting designs for this sort of thing. The original wiki opens hoverboxes on click instead of hover and leaves them open until the user clicks outside them. Links in Andy Matuschak’s Zettelkasten notes open in vertical columns to the right of the post, preserving the reading context and allowing the reader to see a progressive trail of thought in sequence. there are many possibilities. another that occurs to me is to reveal the linked post’s content as a dropdown on click. required JavaScript, although I intend to refactor them to rely only on HTML and CSS. Mar ‘24
sort by modification date discourages staleness of pieces by encouraging me to update and rework them. implemented with a git pre-commit hook. explained in the coding section of

this /now update

what I'm doing now #5

Mentioned in what I'm doing now #6, what I did in 2024, what is this site? #5

I’ve been traveling, furnishing, reading, writing, and more.

interior design

An odd perk of splitting my time between Seattle and Vancouver has been furnishing and decorating a second apartment, a task for which I have enough gusto to do twice over. More than twice, actually. I’ve starting telling friends that I would gladly help them lay out their spaces. I told one friend in particular, who finds furnishing and decorating stultifying, that when he buys his house, I will invite myself over and personally hang the artwork and mirror that have been leaning against his apartment walls for years. I routinely watch Never Too Small and Noah Daniel and have been toying with the idea of making TikToks or Instagram reels about my amateur interest in interior design. I already have the topic for the initial video: how to get cheap artwork that you love.

lounging on the balcony

Among the finest decisions I’ve made recently is buying patio furniture for our balcony. I bought it secondhand for $420 USD ($575 CAD), delivery included, and within a week have spent many more minutes (in either currency) lounging, reading, writing, and working on it. I expect to recoup a good deal of the principal when we resell in a year or two.

By furnishing the balcony we’ve added to our apartment a whole new space to be in. It’s like a tree house, perched up among a variety of leafy growth. Beyond the branches, in the evenings, lays the orange pink sunset silhouetting cranes on the port and past them the city skyline. It reminds me of this bit from Gail Sheehy’s memoir:

I had found a rent-stabilized apartment on Fifth Avenue, near the Metropolitan Museum of Art… It had a terrace overlooking Central Park. A small glass cubicle sat on one end of the terrace, where I wrote as if suspended in the sky. I could watch the leaves turn from scarlet to lemony pale and sit snug in a winter storm like being enclosed in a snow globe. It was as close to a writer’s heaven as one could get.

Unheated, the cubicle was also ideally suited to keeping the neurons jumping. In winter I typed in a hoodie, my feet encased in Alaskan mukluks. In spring, the terrace became my first garden. I filled the window boxes with swaying tulips. Tubs held bonsai mimosa trees and dwarf crabapple trees that bore fruit in the fall. It was a magical place to invite friends for drinks and outdoor supper.

My alcove is more modest, but magical still. A private little post embedded in the city. A perfect place to read and write.

reading

I’ve been sitting out on the balcony with a little stack of books and

taking turns with each one

.

thinking about ego and masculinity

I think the ongoing masculinity crisis can be understood as a

confused struggle for self-esteem

.

writing

Most of what I’ve

written

recently

has to do with New York, but I also finally wrote a review of

The Passenger

, the first of Cormac McCarthy’s last

two

novels. I also wrote a

fourth entry

in my series of how to coordinate metaphors.

traveling

Z and I went to Tofino with my family for a week to celebrate my mom’s birthday. We spent time together, ate great meals, surfed on beautiful beaches, hung out at a wonderful airbnb near the heart of town, spent a day in an outdoor spa in a private cove lounging in hot tubs filled with seaweed, and even saw the Northern Lights. Z and I want to go back.

A week later, Z and I went to

NYC

to affirm our suspicion that we would like to live there before we have kids. I have a bad habit of winging trips, but in the month leading up to this one I dedicated good hours to research and planning. The time spent was well worth it, rendering some of the most memorable experiences of the trip: Comedy Cellar, Village Vanguard,

Blue Note

, Whitney Museum (for free), Tiny Cupboard Comedy Club, Roberta’s, and SEY coffee. Some of these I booked in advance, and the others I was aware of and pounced on when the opportunity arose.

We recently also spent a weekend with friends at an airbnb in Lake Cowichan. The weather was a bit disappointing, but we had a great time hanging out in and around the hot tub.

working

I’ve delivered some good results at work recently. My tasks continue to be interesting and plenty. However, it looks like my next promotion, which I was expecting in September, won’t happen until December. I’m disappointed, but when I reflect on it carefully, I notice it’s not that important. By no means do I need to be promoted. It’s alluring because it’s a quantifiable and salient achievement. But it’s not important one.

coding

Spotify again rejected my request for an extended quota. I emailed them back asking to speak to a real person. No response. It looks like it’s going to be difficult to make my app available to all Spotify premium users, unfortunately. That project will sit on the backburner for a while.

As for my other recent programming project – this site – I have some interesting new ideas. To encourage myself to

revise and rework posted pieces

, I want to re-order posts by their most recently edited date rather than their original publish date. That way, I could breathe new life into old ideas that I failed to do justice on initial attempt and baptize them again as new pieces. This aligns with the dynamic aspect of my

virtual book

idea. A related idea I have for this site is to let (hypothetical) readers see past versions of each post, in the spirit of what I wrote in my essay

The Virtual Book

last year:

What if a memoirist publishes a piece overlaid with their revisions to show the process of expression and expose the artifice of memoir? … What if a novelist publishes a first-person novel in real time to make it feel like the character really exists and is experiencing events alongside the reader? What if the author then goes back and rewrites previous parts of the novel to show the decay of memory and its corruption in the construction of personal narratives?

One of my core interests, and one of the core passions behind this site, is the process of writing. Interfaces that illuminate and accentuate that process intrigue me.

watching TV

Peep Show. Second watch. So funny.

Curb Your Enthusiasm. Hilarious. Like Peep Show, soothing with its insanity.

Baby Reindeer, which was haunting, disturbing, and fantastic.

Welcome to Wrexham. S3 is less ambitious, but still good.

House of the Dragon. Good

not great

. Rewatched S1 in preparation for S2, which is currently airing.

Fantasmas. Unsettling in a very effective way, like a hyper-pop Black Mirror. Wonderfully weird and delightfully non-linear. By now I know I am a sucker for tangential and episodic storytelling.

watching movies

Dream Scenario. Unsettling. I kept oscillating between sympathy and disgust for the main character, an intended effect, I think. However, ultimately, it didn’t seem to have a cogent point to make. Or maybe I missed it.

Challengers. Very entertaining. I loved the toxic triangle between the three main characters: one chooses to be dominated, one needs to dominate, and one dominates himself to preclude others doing it. The codependence and power dynamics rang true until they fell a bit flat towards the end.

Radical Wolfe, documentary about writer Tom Wolfe (and former colleague of Gloria Steinem at New York magazine). Somewhat entertaining but suspiciously uncritical, as biopics and posthumous documentary tributes tend to be.


what’s next?

Enjoying the rare and splendid sunny days of PNW summer. Biking, paddleboarding, playing soccer, volleyball with friends.

I’m curious about playing goalkeeper for a new team. I’ve been an outfield player exclusively for years, but I used to play goalie part-time and fill in when needed. I miss it a bit. And goalies are always in demand, so it should be an easy way to get more playing time. Hopefully I’m not overestimating my skills in net. I think I’ll find out soon.

Cap Hill Block Party. Excited about seeing Chappell Roan, who is apparently great to see live.

Visit PEI, before Z’s mom and stepdad sell the house they have on the beach there.

. discussed in

this post

building this site

Mentioned in what I'm doing now #6, building this site #2, what is this site? #5

In the spirit of making this site dynamic

like a virtual book

, I added modified dates and revisions.

Firstly, I added modified dates to all posts and a way to sort them by post date or modified date. This discourages me from treating posts like static pieces and instead encourages me to edit, rework, and reimagine them. I didn’t want to be responsible for manually updating the modified date of a post, so I automated it.

For my first attempt at implementing it, I put together a plugin written in Ruby (mostly written by GitHub Copilot) that found the most recent commit’s date for each post by looking through the Git history. It worked, but it also slowed down my local build a lot. I found a much better solution: set up a git pre-commit hook that updates the modified_date in a post’s frontmatter when a change is committed to it. To implement sorting, I had to use JavaScript. Working on a static website has made me appreciate how much is possible without JavaScript and what isn’t.

More challenging to implement and more exciting to complete was a feature I’m calling Revisions, which shows past edits of select posts. This one was even more important to automate. Manually creating a revision for every new post would be a ponderous task that would deincentivize me from making changes. Automatically generated revisions, on the other hand, excite me to make changes. I want to see how posts change over time and how the converge to “final” form.

So, the main task was to plug into the Jekyll build to generate new pages that represent the difference between every pair of sequential commits in a post’s Git history. Once I had that, I just had to do some minor coding in HTML and Liquid to add links in a post’s metadata to link to its revisions.

After I figured out how to get the full Git word diff between two commits (the git gem’s API apparently doesn’t expose this part of Git’s functionality), most of the trouble had to do with formatting: stripping Git diff metadata, replacing diff markers with markdown formatting, transforming Markdown to HTML, and styling the HTML. After I finally got it working locally, I pushed it up to GitHub to kick off the build and publish job. But after the GitHub Actions finished, the site didn’t look any different!

It took me a while to figure out why the GitHub Pages build was passing but not generating any revisions. I figured the git gem wasn’t being installed since it isn’t in the list of packages supported by GitHub Pages. It seemed like the plugin wasn’t running at all. Only after I added print statements to it did I realize that it was running, but only finding a single commit. Finally, I fixed it by setting the fetch-depth of the checkout action to a pseudoinfinite number so that the full Git history would get processed.

I set it up so I can easily enable or disable revisions for a post by setting show_revisions in its frontmatter. So far, I’ve enabled revisions for

what makes a good shower?

,

how to think invisibly

, and

how to tell a story #3

.

.

Sept ‘24
revisions gives insight into my writing process by letting readers examine the evolution of select posts. discussed in

this post

building this site

Mentioned in what I'm doing now #6, building this site #2, what is this site? #5

In the spirit of making this site dynamic

like a virtual book

, I added modified dates and revisions.

Firstly, I added modified dates to all posts and a way to sort them by post date or modified date. This discourages me from treating posts like static pieces and instead encourages me to edit, rework, and reimagine them. I didn’t want to be responsible for manually updating the modified date of a post, so I automated it.

For my first attempt at implementing it, I put together a plugin written in Ruby (mostly written by GitHub Copilot) that found the most recent commit’s date for each post by looking through the Git history. It worked, but it also slowed down my local build a lot. I found a much better solution: set up a git pre-commit hook that updates the modified_date in a post’s frontmatter when a change is committed to it. To implement sorting, I had to use JavaScript. Working on a static website has made me appreciate how much is possible without JavaScript and what isn’t.

More challenging to implement and more exciting to complete was a feature I’m calling Revisions, which shows past edits of select posts. This one was even more important to automate. Manually creating a revision for every new post would be a ponderous task that would deincentivize me from making changes. Automatically generated revisions, on the other hand, excite me to make changes. I want to see how posts change over time and how the converge to “final” form.

So, the main task was to plug into the Jekyll build to generate new pages that represent the difference between every pair of sequential commits in a post’s Git history. Once I had that, I just had to do some minor coding in HTML and Liquid to add links in a post’s metadata to link to its revisions.

After I figured out how to get the full Git word diff between two commits (the git gem’s API apparently doesn’t expose this part of Git’s functionality), most of the trouble had to do with formatting: stripping Git diff metadata, replacing diff markers with markdown formatting, transforming Markdown to HTML, and styling the HTML. After I finally got it working locally, I pushed it up to GitHub to kick off the build and publish job. But after the GitHub Actions finished, the site didn’t look any different!

It took me a while to figure out why the GitHub Pages build was passing but not generating any revisions. I figured the git gem wasn’t being installed since it isn’t in the list of packages supported by GitHub Pages. It seemed like the plugin wasn’t running at all. Only after I added print statements to it did I realize that it was running, but only finding a single commit. Finally, I fixed it by setting the fetch-depth of the checkout action to a pseudoinfinite number so that the full Git history would get processed.

I set it up so I can easily enable or disable revisions for a post by setting show_revisions in its frontmatter. So far, I’ve enabled revisions for

what makes a good shower?

,

how to think invisibly

, and

how to tell a story #3

.

.

Sept ‘24
redirects another feature that promotes retroactive changes. it lets me easily change a post’s URL without breaking the old one. discussed in

this post

building this site #2

Mentioned in what is this site? #5

Many features I’ve implemented on this site – e.g.

revisions

– encourage retroactive editing of posts. Today, I implemented a minor feature in the same spirit: configurable redirects. This allows me to easily give a post a new URL without making its previous one(s) obsolete. All I have to do is make two configuration changes in the frontmatter of the relevant post:

  1. Specify the new URL via the usual permalink property e.g. '/why-write'.
  2. Add the old URL to the list specified by redirect_from e.g. ['/justify-writing'].

For example, I changed

okjuan.me/vbook/justify-writing

to

okjuan.me/vbook/why-write

. If I later decide to change the URL again e.g. to okjuan.me/vbook/why-i-write, I just have to set permalink: /why-i-write and redirect_from: ['why-write', '/justify-writing'] in the post’s frontmatter.

A nice side-effect of this change is that I can make a post’s URL match its title even if I change it. Another perk is that I can easily update okjuan.me/vbook/now to point to my latest what I’m doing now post. But probably this feature’s most useful effect, and the reason I thought to implement it in the first place, is that it lets me realign a post into a series. For example, by changing the title of how to justify writing to why write?, I can make it the first entry in a series that I can create by writing posts why write? #2, why write? #3, and so on.

.

Mar ‘25
post series links a simple but important ingredient that makes this site

booklike

what is this site? #3

Mentioned in bookmarks, what is this site? #4, what is this site? #5

I anticipate confusion regarding the name of this site. How is it a book? Sure, it abides by the criteria of a socalled

virtual book

– multimedia, readerdriven, nonlinear, etc – but it’s still basically just a blog, isn’t it?

Granted, this is not a book. Not yet. But over time, it may become one. In fact I hope it will become multiple, overlapping books. I intend to accumulate relevant and complementary content without prescribing a single vision or intention for it so that it can take a shape of its own. Shapes of its own. At points in the future I may be able to collect multiple pieces into discrete, booklike forms.

It’s been two years since I began this project and already emerging are various potential booklike projects. An obvious one is compiling posts from a title series like

how to revise a sentence

,

#2

,

#3

,

#4

, and so on, into a single work. Naturally, other pieces tagged as #writing would make good candidates for inclusion in that work. The same for

how to tell a story

,

#2

,

#3

, and future entries. These titles are intentionally broad so they can hold a variety of perspectives on the topic that may later be combined to serve unforeseen ends. I expect that any such attempts will prompt me to write new material that fuses all the pieces together, thereby creating a seamless new whole.

But that’s only one way in which I want “books” to develop from this site. I also want them to sprout organically from the haphazard crosspollination of ideas that features like tagging and backlinking enable. I recently implemented another feature called revisions – which I talked about in my Sept 30th 2024

/now

update – that adds yet another dimension through which a reader (including myself) can traverse the content on this site. Automation is a powerful way to highlight implicit relationships that already exist between pieces. They enable unplanned connections to grow across topics and time. The next feature I intend to automate is a simple and intuitive one: links between posts in a title series.

It’s fitting that this site itself is the fusion product of

various heterogenous inspirations

. As I’ve said before, the Zettelkasten method of knowledge management is one of them. The method, as noted by researcher Andy Matuschak on his own Zettelkasten-inspired website, enabled Germany sociologist Niklas Luhmann to publish more than 70 books. My writing ambitions are far more modest, but I am interested in adapting the method into a way of writing “books” directly, as opposed to its original purpose of amassing research into a network of information that may then be synthesized and captured in newly written prose. I want to start by writing prose in small chunks and see if the resulting pieces can themselves comprise a booklike thing.

And yet the point of this site is not to become a book, but to provide booklike experiences

without subjecting itself to the traditional limits

of a book. The point is not merely to create books through piecemeal writing, but also to offer pieces by themselves and as an assortment of nonlinear orderings, unlike the offering of the traditional book: single, linear, and monolithic. This site is not just a means but an end itself.

Finally, I want to say that, despite all this, I don’t look at books with contempt or ungratefulness. I love books. They have changed my life for the better and I’d like to return the favor.

.

implementation is similar to that of revisions, but simpler because it doesn’t involve generating new pages. Mar ‘25

I use GitHub Issues to track problems and potential improvements.

I started developing this site in February 2023. The fundamental unit of this site is a post. What you’re reading right now is a post. I often call them “pieces,” too. I write each post as a Markdown text file using a text editor, usually VS Code and occasionally vim. From those text files, Jekyll generates the site’s HTML and CSS using the Minima layout theme and the Solarized color palette. I have tweaked fonts, spacing, and other UI details by modifying the _sass/minima/_layout.scss file. The features described in the table above are implemented using Ruby plugins and Liquid.

The site is static and consists mostly of HTML and CSS and a little bit of JavaScript. It’s hosted for free on GitHub Pages. The only money I’ve spent so far was on the domain okjuan.me, which I bought in June 2023 from bookmyname.com for ten years for €156 and configured okjuan.github.io to point to it.

To publish a post, I commit it to the main branch of vbook GitHub repo. I configured that repo to publish on GitHub Pages as okjuan.github.io/vbook, which gets resolved by DNS to okjuan.me/vbook. GitHub provides a default process for building Jekyll sites and publishing them to the web, but I use the community-built Jekyll Deploy Action because I have several custom plugins and GitHub only supports a few select plugins.