Journal 2025-05-20
Windsurf Comments
I've been trying out Windsurf (formerly Codeium), Yet Another custom VS Code build with Copilot-style AI. It's good, on a par with the others I've tried. But it's hard to compare these tools because they are all in such active dev.
On the day my free sub runs out (funds low), found a great feature : Custom Workflows. You can tuck away task-specific prompts in .windsurf/workflows/*.md
files, invoke from chat with a slash. I needed to apply a specific comment template to about 100 different files (#:transmissions #:processors, I have a #:signature in comments), this feature is perfect. I just piled through them.
I don't know which base they've built their SWE-1 on, but I'm willing to bet it was a "thinking" model. Has that tendency to do more than you ask for, which is an irritating trait for a code assistant, time-consuming looking what bits to reject.
Also there appears to be a minor bug in message timing. I just gave it a problem to look at, on the edge of what usual context windows can deal with - loads of content/layer indirection needed. As expected it's taking it a long time, fine, may not be doable. But this side I've got "Deadline exceeded...retryable" x7...
It's still taken me all morning on that one chore. But it was a very worthwhile exercise. Apart from it being way, way faster than doing it manually, it allowed me to see what I had, clear out a lot of cruft, clean up various lumps of poo.
Badgers
I stumbled on the OpenSSF Best Practices Badge Program which seems a worthy cause. I had a quick go at #:atuin, which is probably my cleanest active repo. Without doing anything manually it got a score of 16%. I should probably come back to that.
One thing that covers, it rings a vague bell from somewhere :
The Common Platform Enumeration (CPE) is a structured naming scheme for information technology systems, software, and packages. It is used in a number of systems and databases when reporting vulnerabilities."
Something else to come back to.
Other Tabs I Should Close
A Step-by-Step Guide to Build a Fast Semantic Search and RAG QA Engine on Web-Scraped Data Using Together AI Embeddings, FAISS Retrieval, and LangChain - this is from MarkTechPost - actually by their CEO. The site often has useful links, if you can find them in their nightmare level of inserted ads. Bookmarked because the same functionality is something I want from #:transmissions + #:semem in the near future. Totally different kit, but it'll be useful to see how it's done there.
REST - Wikipedia - visited because I woke up perversely trying to remember how Saint Roy defined state in Hypertext as the Engine of State (HATEOS). I was pleased to see this line :
An application that adheres to the REST architectural constraints may be informally described as RESTful, although this term is more commonly associated with the design of HTTP-based APIs and what are widely considered best practices regarding the "verbs" (HTTP methods) a resource responds to, while having little to do with REST as originally formulated—and is often even at odds with the concept.
Tasks.md (GitHub) - "A self-hosted, Markdown file based task management board.". I like the look of this. Is Kanban-style, minimally layered over files (tasks) and dirs (panels). It's available in a Docker version. I fancy having a play. It should be totally compatible with what I've got in mind with #:trestle, but usable now without any direct coupling.
DIY Alexa (GitHub) - uses an ESP32, my current favourite microcontroller with Tensorflow Lite, hooked into wit.ai which is a voice/text thing, apparently from Meta. Fun stuff.
analog-foundation-models - yeah. From IBM. LLMs with the multiplications done by analog chips. Bit clunky, too many 8-bit ADC/DACs for my liking. And only IBM can afford to play with such toys. (My own analog computer is still mostly a big box of components in the drawer, I got distracted by Eurorack modular hardware) §
Journal 2025-05-19
Inversion of control
For a change this afternoon the AI has given me directions.
My priority at the moment is getting #:semem organized, but to that end I need some extras in #:transmissions, and better SPARQL UI... So I've been on a little cycle round the subprojects. Which today has led me to #:tbox, which is just a Docker setup with containers that will hopefully, eventually, run the projects in a unified, consistent, portable fashion.
I'm not very good with Docker, hate this kind of admin. After a bit of discussion with Claude I decided I need CI/CD on my thing. GitHub workflows are relatively new to me - and it's more of the same kind of admin. So I asked Claude how I should tidy up #:tbox and also how to do testing/CI. Two artifacts, 3 pages each, which I've printed. This afternoon I'll just work through them. At least until I get distracted by the need to do one of the real-world chores I've been procrastinating over. Faced with a more boring task, cleaning the kitchen seems a lot more manageable.
PS. I started following Claude's instructions, but only got so far because one of the services I want #:tbox running, Prosody XMPP, isn't working. A problem I was aware of, but I'd thought it better to get the tests in place first.
So now I'm in the process of fixing that breakage using GPT-4.1 in Windsurf. In other words, I'm delegating...
Progress! (As a Dickensian mill boss might say).
Funnily enough, the code the junior agent is now working on is from #:tia, which I'm aiming to use as an ecosystem in which to create agents. (dogbot)
...
[SENDER] OUT
<message type="chat" to="alice@localhost"><body>Hello from dogbot client!</body></message>
[SENDER] Message sent!
[SENDER] status closing
[RECEIVER] IN
<message type="chat" from="danja@localhost/OzwPtYKq" to="alice@localhost"><body>Hello from dogbot client!</body></message>
[RECEIVER] Received message: Hello from dogbot client!
I predict a riot!
Journal 2025-05-18
Front-end Joys
Trestle is the latest incarnation of my browser-based outliner, formally known as Trellis. It's heavily influenced by Workflowy, a great online tool I've been using on & off for years.
But the idea is that it's simply Yet Another view of RDF data in a SPARQL store. It just happens to focus on tree-shaped stuff.
Trellis had gone stale so I updated it a few months back. Decided to rename #:trestle because it did sound rather like Trello, which is in a similar space. I swapped out a heap of JQuery based code for more recent vanilla JS, totally rebuilt the architecture (now solidly MVC with added #:evb, my minimal event bus).
Right now it only captures root + parent-child relationships (with the children indexed to make the RDF easier). I want to add typing on nodes, a very-soon use case being sorting out my TODOs, using terms from the project vocab I threw together 20 years ago.
But before that, there was a bunch of little UI bits I hadn't implemented. Hamburger menu, breadcrumbs etc.
I thought this would be a quick job with AI. Nah. Took several hours with little progress. Interestingly 3 different LLMs got themselves stuck in the exact same create-break-fix-no-fix-no... loop (Claude Sonnet, GPT-4.1 & SWI-1, whatever that is, in Windsurf formerly Codium).
But I found it educational, I don't really do proper front-end stuff very often. GPT-4.1 had me poking around for computed layout bits, posting code into the browser console.
This does seem like an obvious job for MCP. I did have a quick look at a server for Puppeteer the other day but couldn't get it working. I mentioned it to danbri, he found Chrome Debug MCP and Chrome MCP. Next time.
Journal 2025-05-17
Links
DeepWiki
This thing is very nice. It uses Devin AI to analyze a given GitHub repo and generate docs. Right now it's free to use, so I've already slapped a button on several of my repos. The docs are quite comprehensive, but it's worth noting that they focus on the nuts & bolts. So for example the DeepWiki for Transmissions dives straight into Architecture Overview, from a Transmissions Developer's point of view. But it's a mini-framework, the docs should start from the pov of Transmissions User. The whole point is that most of the nuts & bolts are hidden.
You can apparently also ask Devin about the repo via an LLM chat interface, but so far, for me it seems to time out.
Journal 2025-05-16
Blog might be is back!
Ok, that was arduous. I had to rewrite a big chunk of the core code for #:transmissions, my pipeliney thing. It'd simply got too spaghettified. But barring a handful of minor misalignment problems, it's working again. #:postcraft is the canonical app, this blog is published using it.
Before going any further, I will declare that I've been busy! A bunch of stuff I've been working on is approaching the point where it might be worth putting in front of other eyebrows, if not yet eyeballs. I'm planning to get something of each of the bits at least relatively stable & written up enough to look at by the summer solstice. To allow breathing space, I'll review for a bit, properly announce anything worthwhile on 2025-07-03.
#:postcraft is possibly the world's most over-engineered Static Site Builder. After crawling dirs for markdown files it posts the material off to a SPARQL store. Then another pipeline is set up to query the store and render the site.
The over-engineering is intentional. The data in the SPARQL store is there for other uses. A couple of days ago I got #:semem, my Semantic Memory thing to create embeddings from the content and allow this to be used for 'semantic search'.
Btw, the #:semtags do have a purpose : Semantic Hashtags. I've a very short, simple spec written for them here somewhere - the #:
marker says the string that follows has some kind of significance in the the current domain. In practice, they are a markdown extension that I intend to use here by replacing with a link to a query on a service - a search, but ultimately using #semem as the engine.
For a first pass I'm thinking of templating a query, something like :
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX skos: <http://www.w3.org/2004/02/skos/core#Concept>
SELECT ?resources WHERE {
?c a skos:Concept ;
rdfs:label ?label ;
rdfs:seeAlso ?resources .
FILTER regex(?label, "^{{semtag}}", "i")
}
Elsewhere I'll put together some basic definitions.