Creating Weave
On creating a custom publishing system
Overview of Weave
> Hello World!
This is the first entry written for my new publishing system, code named Weave.
Of course I could have used any existing static site generator, but given how much I’ve been enjoying using Cursor, it was more fun to “vibe code” my way to a custom and personal system.
Inspirations
There have been so many great personal websites over time. Some which have inspired me include:
- https://jackrusher.com/journal/homesteading.html
- https://susam.net/hn-bell.html
- https://simonwillison.net/
- https://www.tbray.org/ongoing/
- https://xxiivv.com
- https://electro.pizza
- https://www.robinsloan.com/
- https://eugeneyan.com/
The process and light technical details
As I write this, we’re in the midst of the “vibe coding”… revolution? drama?
I’ve been using Cursor a lot, and have enjoyed learning what’s possible with
AI-assisted programming. I use clause-3.5-sonnet
almost exclusively right now,
and that was true for the creation of Weave as well.
It was an interesting process using cursor to build the system iteratively and from scratch. There were several rounds of more vague, one-shot style attempts. The model would generate a fairly rich system, obviously informed by static site generators out in the world, but it was never quite a match for my expectations.
With ongoing sessions, I kept whittling the requirements down to things which were much simpler while still flexible. Effectively, I used the whole process to iterate toward a refined set of requirements over time.
The system is currently a simple python program which takes input markdown and blends it with some jinja2 templates to create static html pages. The templates are relatively simple and composed of html, tailwind css, some custom css, htmx for interaction, and occasionally small bits of other javascript.
All the source material is in markdown files, and those contain special metadata. The metadata is used as source material to help populate a rich set of html metadata tags, including plain html for seo and various social media tags for more effective social sharing. All of that is a bit tedious, so I tried to have the system do most of the work for me.
Here’s a point in time snapshot of the tree for the weave side:
(.venv) [mist weave]$tree .
.
├── bin
│ ├── generate-logbook-index.py
│ ├── local-web.py
│ └── weave.py
├── config
│ └── content_mappings.yaml
├── reference
│ ├── reference.html
│ └── sample-metadata.md
└── templates
└── cmc
├── base.html
├── md-logbook.html
└── md-transmit.html
What’s next?
For the time being, I have the Logbook earmarked as a place for informal notes and blog-like posts (like this one). Alongside that is the Transmit section for publishing slightly more formal pieces. Thinking about these has helped inform the requirements along the way.
I’ve used AI and manual work to help convert some old writing to the markdown and metadata needed for this system. Maybe I’ll retro-fit some other things in the future and continue to evolve the system.