2022-01-16 14:52:36.422 UTC

Markdown Demo

Commonmark should work with the usual extensions.


You can have sub-headings and more.


This works too.

Inline styling

You can italic, bold, or monospace.

Block styling

Blockquotes work.

Code blocks too:

module Main where
main = print 42
2022-01-16 14:46:00.439 UTC

Archive of inactive nodes.

2022-01-11 15:01:53.168 UTC

No more JavaScript files at top-level, thanks to tailwind-haskell.

2022-01-03 22:22:57.193 UTC

Modeling the structure of Banyan data, and its evolution over time. Banyan nodes form a tree structure, but are there anything else we do with it?

2022-01-03 16:08:20.719 UTC

node’s concurrently is a decent package that mimics Procfile.

  "scripts": {
    "dev": "concurrently npm:banyan:*",
    "banyan:tailwind": "cd tailwind && make",
    "banyan:haskell": "bin/run-haskell"

I use this to spawn both ghcid and tailwindcss watcher in the same process, with output interleaved. Though concurrently seems to have trouble with actually shutting down ghcid. I have to manually kill a stale ghcid spawned process to make the port available.

2022-01-03 15:44:01.489 UTC

Keeping generated CSS in source control.

So banyan user will not have to be running Tailwind watcher. For apps like Emanote we want the user to be able to do this, though. But other Ema apps don’t need to. So there are two models here:

  1. Dev-time Tailwind watcher
  2. Run-time Tailwind watcher

No. 1 is simpler to implement, and should be sufficient for most Ema apps. But Emanote will need No. 2, which also brings in a long-running nodeJS process into user’s machine.

2022-01-03 02:13:53.895 UTC

Initial prototype for this is working well. Just need to run tailwindcss watcher in separate terminal, and the model static file “versioning” trick picks up the Tailwind’s artifact, albeit with a slight delay, which is acceptable.

2022-01-03 02:13:14.615 UTC

Banyan now uses Tailwind 3.0 to build the CSS, both in live server and during static site generation. This does add nodeJS as our dev dependencuy, but on the plus side we get all the cool new features of Tailwind (like print:hidden).

2022-01-02 16:42:00.571 UTC

Editing and creating new nodes now happen through the VSCode extension. See [[Vkq67y0nSrC6a]] for details.

2021-12-31 23:10:42.361 UTC

Brilliant idea. VSCode extensions are like mini-apps in themselves. VSCode exposes their ‘callbacks’ via app URIs, which can be linked to from HTML pages. I wrote a VSCode extension for Banayan that accepts two invocations:

  • Edit parent
  • New node (under another parent)

This takes care the rest of the Ema workflow for me – creating new nodes under an existing parent, and editing nodes. Good enough for now.

2021-12-30 22:23:05 UTC

No more DOT!

Storing parent relationship in YAML now. And now I can add a CLI that creates a child node easily. Plus this is indeed easier to hand-edit than graph.dot.

2021-12-30 21:22:27 UTC

VSCode supports URL handler to open files, eg: vscode://file<path> - clicking which will open that file in VSCode. This is enough to add ‘edit this node’ links in Banyon. See https://github.com/microsoft/vscode-docs/blob/main/docs/editor/command-line.md#opening-vs-code-with-urls


  • It doesn’t automatically open the parent project folder
  • Have to use Brave, rather than Safari, to prevent future “Open?” prompts for vscode:
    • On the plus side, this would allow Banyon to be made a ‘chrome app’
2021-12-30 21:19:23 UTC

Web apps like WOC are just easy to use. How can I achieve the same for Ema apps?

Using (3)
2021-12-29 00:58:11 UTC

Thoughts on using Banyon for actual stuff.

2021-12-29 00:56:28 UTC

There are two ways to deploy Banyon sites:

  • GitHub Pages (statically) … or
  • run the ‘live server’ in a VPS with Syncthing doing the sync.

The latter is interesting for quick updates, but former is rather lightweight to maintain multiple sites without worrying about deployment and maintenance (not to mention security).

2021-12-28 03:08:44 UTC

Decided to go with graph.dot, the DOT language, for defining all relationships. It enables multi-parent nodes, but more importantly I figured organizing wouuld easier, compared to managing the YAML meta of gazillion files.

2021-12-28 01:09:54 UTC

Innovative? The static site displays the CLI to run for creating the ‘next’ note. Date is automatically injected; followed by letting the user type in the content (just as I am doing now) in the terminal. Poor man’s workflow.

2021-12-27 14:46:16.103 UTC

File-format brainstorming

  • How to represent relationships? Candidates:
    1. Filesystem hierarchy
      • Too complex to deal with
    2. YAML metadata parent in each ${node}.md
      • Adding new nodes is single-file write operation
      • Organizing nodes en masse involves fiddling with multiple files
    3. Separate file, eg: DOT, for graphs
      • Automatically allows multi-parent nodes
        • Visually, we present one parent, while demoting others.
      • Organizing nodes en masse is easier
      • Possibility to add relationship metadata

Noteworthy reports from the dev front.



The idea behind “folding”1 is this. Over time, the stream of thoughts may grow unboundedly. In future, these streams are often a nuissance – as they would just be long lists of thought dump with no summarizing element to it. What we need here is insights, as gleaned from these streams over time. Hence, “folding” - as if a lengthy stream is “folded” to represent more permanent nuggets of information that can be consulted often.

How can Bayan facilitate this model?

  • When we summarize a stream, the summary should replace the stream, while still leaving the stream in place (hidden) and linked.

  1. For the origination of this idea, see https://github.com/srid/chronicle#folds↩︎



A node is a “bag” if its children have no assigned data, ie., it is a “bag” of other nodes in no particular order. It does not represent a timeline, like other non-leaf nodes.

Example: [[WV0z0FUpk09RL]] is a bag.