Honest reflections on my project to rebuild my website publishing software in Rust from scratch. All based around my git commit logs.
After deciding it would be a good idea to learn Rust, I spent early 2026 tinkering with the basics, thinking about cargo, finding out about serde and starting to fathom some key paradigms e.g. .unwrap() and basic .clone(). In the summer I thought, yes I can use this to build a better version of triki, the software I use to dynamically build and serve this website. It all ended very well, since you are reading this page, but it was a rough ride.
Month 1 - September 2025
Laying out the basic package and module structure. Trying to get a simple 'stripe' of functionality working with my templating engine of choice minijina. First cut of attempt to convert graph results to model in a page, was planning to do this as a 'pull' approach at this stage similar to the excellent StringTemplate. Full of enthusiasm!
Mon Sep 12 15:37:53 2025 Initial commit
Fri Sep 12 15:44:33 2025 added subject_query
Mon Sep 15 16:06:54 2025 Added back in RdfNode enum
Mon Sep 15 16:28:43 2025 Got server working again
Tue Sep 16 12:49:35 2025 Added in config
Thu Sep 18 08:26:52 2025 Added in prefixes
Thu Sep 18 20:25:24 2025 Add in generic triki_query
Thu Sep 18 20:30:06 2025 and working
Sun Sep 21 09:47:07 2025 Added get type
Sun Sep 21 10:52:34 2025 Getting page type now
Sun Sep 21 19:45:52 2025 Added in get prefix to renderer
Mon Sep 22 20:14:01 2025 Implementing renderer
Tue Sep 23 20:25:16 2025 Moved load templates to templates.rs
Wed Sep 24 08:44:35 2025 Fixed template litefimes!
Wed Sep 24 13:40:13 2025 Build templates hash outside and pass in
Wed Sep 24 22:22:15 2025 Begin messy decoding of property
Sat Sep 27 17:12:07 2025 Add resources
Sun Sep 28 20:31:55 2025 Building node descender
Mon Sep 29 08:04:53 2025 Made blocking async calls
Mon Sep 29 13:40:51 2025 Building prop to value func chain
Tue Sep 30 13:27:28 2025 Getting closer
Tue Sep 30 21:41:49 2025 Getting closer
Tue Sep 30 21:56:13 2025 Failing on drop runtime outside async context
Month 2 - October 2025
Hit my first wall, had to rethink and change direction. Pulling to retrieve properties from a page model is actually bad and the mechanism for it work cannot be async, which is inherently how page models are built via a network call. With this light-bulb moment and frustration with minijinja, moved to tera template engine and accepted models for pages would be pre-built. First page rendered on 7th Oct! Restructured repo from cargo libs to modules, as this is more sensible now I understand both. Add concept of 'pre-flight' request since need to gather everything up-front before render begins. Started thinking about generic 'expand queries' in SPARQL, formalizing what I had before into re-usable patterns that could cater for all cases. After reviewing all web service frameworks, decided on Axum and have never looked back. Got that one right.
Wed Oct 1 17:55:01 2025 Axum working through to oxi graph!
Sat Oct 4 13:10:00 2025 Moved to tera
Sat Oct 4 16:59:43 2025 Able to build mode now, async fluent map() calls do not work
Mon Oct 6 13:44:03 2025 Move render stuff to render and kept handler light
Tue Oct 7 08:53:14 2025 Page is rendering all the way through from graph from an http get!
Tue Oct 7 19:31:58 2025 Got fluent page rendering working, and re-used subject to get type
Thu Oct 9 21:01:19 2025 Improved sparql client error reports
Mon Oct 13 07:47:10 2025 started to add group auth check
Tue Oct 14 20:20:36 2025 Trying to get async chaining working
Wed Oct 15 21:40:52 2025 Compiling again
Thu Oct 16 08:50:05 2025 Still seg faulting
Thu Oct 16 20:36:39 2025 No seg fault now need to get temmplate working
Fri Oct 17 21:38:13 2025 almost working...
Sat Oct 18 13:51:32 2025 Rendering working again
Mon Oct 20 19:02:01 2025 Added in better model building
Tue Oct 21 17:13:56 2025 Removed unused queries and fixed tests
Tue Oct 21 20:56:07 2025 Now able to build a model with prop objects
Thu Oct 23 17:13:16 2025 Keep before move renderer under server
Thu Oct 23 21:01:21 2025 Moved from libs to mods
Fri Oct 24 08:38:40 2025 Using task local better
Fri Oct 24 13:38:29 2025 Moved ug down and using from task local
Mon Oct 27 13:54:42 2025 Added in common and TrikiErr
Mon Oct 27 14:27:37 2025 Added preflight
Mon Oct 27 20:11:46 2025 preflight working and can raise auth error if required
Wed Oct 29 19:36:52 2025 Rendered now building a proper tera value
Thu Oct 30 09:33:07 2025 End to end render working again, ready to do expand
Fri Oct 31 08:50:32 2025 Added initial query samples
Fri Oct 31 09:25:53 2025 Got isLiteral and quicker n2 expand query
Fri Oct 31 13:36:35 2025 Added all object queries
Fri Oct 31 13:48:49 2025 Added descs and renamed
Month 3 - November 2025
A month full of thankless tasks building out the framework. Adding and defining a web page dynamically needs a way to define properties, templates, prefixes and much more. triki is very meta so everything is a derived from triples, so built out configuration triples for each of these entity types. All because triki is not a static site generator, it is a wiki and expects the user to be able to build a web page from nothing. Started to understand traits, but went the wrong way on this, over-used and eventually had to rip it out. SPARQL update worked this month, so page properties can be edited (if there was a web front-end!). Everything be validated in cukes for the day when there would be a front-end.
Mon Nov 3 09:36:41 2025 Added in conf types and traits
Mon Nov 3 14:14:30 2025 Compiling again
Mon Nov 3 19:41:18 2025 Generic trait working for Dao!
Wed Nov 5 10:03:22 2025 Built out conf and prefix
Thu Nov 6 08:56:32 2025 update sparql query compiling
Thu Nov 6 09:40:01 2025 Partially running update end to end
Thu Nov 6 14:12:53 2025 Sparql update working!
Thu Nov 6 17:55:31 2025 added all prefixes
Fri Nov 7 14:47:46 2025 adding model spec
Fri Nov 7 17:11:39 2025 Moved model spec forward
Sat Nov 8 17:47:59 2025 Added in definition of expand include
Sat Nov 8 21:08:21 2025 expand n0 compiling
Sun Nov 9 22:14:17 2025 Now adding n0 to graph
Mon Nov 10 21:16:57 2025 Fixed init config
Tue Nov 11 09:39:42 2025 Added first page type with model
Tue Nov 11 21:47:21 2025 Parsing all RDF namespace definitions now
Thu Nov 13 22:21:58 2025 Added schema logic
Fri Nov 14 17:20:52 2025 all schemas added
Fri Nov 14 17:37:51 2025 Started to convert prefix
Sat Nov 15 18:28:38 2025 added in all schema refs and removed hardcoding
Sun Nov 16 11:02:36 2025 Added in media type confi
Mon Nov 17 20:48:37 2025 Added api and cukestest
Tue Nov 18 09:44:16 2025 completing model build out work before move on
Tue Nov 18 19:00:04 2025 Compiling and getting model now
Tue Nov 18 20:18:18 2025 Fixed model refs
Wed Nov 19 09:54:43 2025 Finished sorting out rdf_types
Thu Nov 20 09:49:50 2025 Adding more config
Fri Nov 21 14:23:13 2025 Improve short code lookup
Tue Nov 25 09:46:57 2025 Better preflight checking
Tue Nov 25 14:33:54 2025 Trying to get async moves working... again
Thu Nov 27 09:30:08 2025 Added in core, common Subject
Thu Nov 27 21:14:57 2025 Addwed in subject
Fri Nov 28 14:48:44 2025 rendering working again
Fri Nov 28 17:45:06 2025 Model link working again
Month 4 - December 2025
tera was being used to build SPARQL queries and pages but via separate tooling, so consolidated. Removed the conf_dao (mentioned previously). Realised a page could and should have multiple models which can be acquired in parallel, so page templates could now handle this. File uploads work, multiple files, but on a mechanism I would have to change later. Login working, with ability to set a users password externally and saved using argon2, given every node is authorized. Added very basic UI.
Leaving the house earlier and earlier to get more time in the coffee shop before going to the office. Coding against the clock is not fun. Coding in the evening as well (see 10pm commit). This is a terrible idea and something I had sworn never to repeat, but I was. Took a break over Christmas, but looks like a dipped in for two days even then.
The project is taking it's toll now. Nothing tangible or useful to see, no benefit to me yet, massive learning exercise and zero feedback to give me an idea I was on the right path. Beginning to question whether this was going to be possible since each breakthrough and resolution of issue simply revealed the next. Something enjoyable has turned into something stressful.
Mon Dec 1 14:18:13 2025 Adding way to run model query
Mon Dec 1 20:14:11 2025 Trying to read out model spec and child params
Tue Dec 2 14:33:52 2025 Centralized tera
Tue Dec 2 21:32:15 2025 Refactored tera usage to single place
Wed Dec 3 09:34:21 2025 Moved tera from subject
Wed Dec 3 14:33:12 2025 Broken using a reference
Wed Dec 3 22:00:49 2025 dynamic and static renderer working
Thu Dec 4 21:25:23 2025 Resolved params and models dilemma
Fri Dec 5 09:34:33 2025 Building model
Sun Dec 7 23:36:05 2025 Generated dynamic model!
Mon Dec 8 14:19:09 2025 Improved error handling for get_as_node and old unwraps
Mon Dec 8 21:47:39 2025 Converted group to use subject
Tue Dec 9 14:18:42 2025 Removed conf_dao and aligned on flex subject impl
Tue Dec 9 20:54:09 2025 Added cuketests
Wed Dec 10 14:04:40 2025 Added in multipart and stream to allow file upload
Thu Dec 11 09:43:02 2025 Split out handlers, cukes upload hitting endpoint
Fri Dec 12 14:12:27 2025 Tidied up saver
Mon Dec 15 09:51:20 2025 Support multiple file uploads
Mon Dec 15 14:27:13 2025 Created file utils, create media type dirs and support multi file upload
Mon Dec 15 22:30:22 2025 Added in template reload
Tue Dec 16 09:39:25 2025 added test-triples.nq
Tue Dec 16 11:47:51 2025 End to end dynamic rendering and test working!
Wed Dec 17 12:34:59 2025 Added in test runner
Wed Dec 17 16:48:38 2025 Added in SubjectEntity, refactoring more confidently now have cukes working
Wed Dec 17 17:21:32 2025 Moved model spec to subject entity
Wed Dec 17 18:12:07 2025 Moved everything to subject entity
Wed Dec 17 22:28:17 2025 Multiple models working now
Thu Dec 18 13:54:29 2025 Blending models to page
Thu Dec 18 17:51:11 2025 Added support for a second dynamic query
Thu Dec 18 22:19:04 2025 working again with two models
Fri Dec 19 13:17:10 2025 Sorted cucumber module
Fri Dec 19 15:50:22 2025 Models merging now with more content
Fri Dec 19 16:14:15 2025 Added good assert on model struct
Tue Dec 23 09:54:54 2025 added initial ui
Tue Dec 23 12:20:42 2025 Added in password support
Tue Dec 23 13:58:28 2025 Support setting admin password
Mon Dec 29 13:42:41 2025 Getting login working
Mon Dec 29 16:25:16 2025 Working on login
Month 5 - January 2026
Paging of model results was a must have feature which was baked in from the start. Finally got it working this month. admin REST API taking shape. Learning axum handlers and the response patterns now doing more complex endpoints for use with the UI. Once I figure a pattern improvement I try to retrofit to all others. Sorted prop ordering, a simple thing but critical for a sensible user experience. Paving the way for the UI, which I have not started and not sure I know how to build.
Thu Jan 1 15:26:17 2026 cookies working and login sessions working
Thu Jan 1 16:02:02 2026 Removed email address hard coding
Sat Jan 3 16:12:43 2026 Fixed user member group issue
Sat Jan 3 17:17:18 2026 Rationalize rdf type
Sat Jan 3 22:06:03 2026 Split out rdf definition
Tue Jan 6 09:32:13 2026 Building json rdf support
Tue Jan 6 22:19:47 2026 Made init config only if not existing
Wed Jan 7 23:20:23 2026 Add properties to init and sort schema loader
Thu Jan 8 14:25:58 2026 Fixed ordering of properties
Fri Jan 9 14:22:07 2026 Fixed prop ordering in JSON
Mon Jan 12 14:34:24 2026 Trying to get cuke prop check working
Mon Jan 12 20:13:15 2026 Sorted cargo pkg structure
Tue Jan 13 17:58:30 2026 Subject get feature file working
Tue Jan 13 20:35:12 2026 Sorted out cukes and steps
Thu Jan 15 22:26:43 2026 Refactored to support paging
Fri Jan 16 14:15:39 2026 Added subject paging support
Sun Jan 18 21:52:55 2026 Paging working
Tue Jan 20 09:56:07 2026 Added paging test
Tue Jan 20 14:21:52 2026 Checking paging back
Thu Jan 22 18:31:31 2026 Support subject post
Sat Jan 24 15:35:33 2026 Refactored api, paging, target, admin and ConfigResource
Sun Jan 25 19:58:09 2026 Support subject and object full CRUD
Thu Jan 29 21:41:33 2026 Getting update working
Month 6 - February 2026
Too much energy expended on my obsession (think Roy from Close Encounters of the Third Kind). It can only succeed if it is balanced around everything else. Also reached the limit of my 4GB second-hand laptop with Pentium (!) processor. The test rig is getting bigger and bigger and the code itself is taking longer for Helix to index. I'm being slowed down by hardware now, whereas before my bottleneck was that I just did not understand Rust and was painstakingly slow to write. But I don't realise this yet but hardware upgrade will be needed, so keep plodding on with what I have.
Mon Feb 2 16:00:26 2026 Support delete
Thu Feb 5 18:26:36 2026 Object paging and short codes
Sun Feb 8 19:09:59 2026 Refactor short codes
Mon Feb 9 22:16:45 2026 Added RdfNode DateTime support
Tue Feb 10 09:47:36 2026 Added date indexing
Sat Feb 14 14:31:27 2026 Added in markdown support
Sun Feb 15 20:01:08 2026 Adding expand subject n1
Tue Feb 17 17:43:10 2026 object modelling
Thu Feb 19 13:40:00 2026 Added sort_keys filter and improved upload
Tue Feb 24 10:06:24 2026 Support primary model paging
Month 7 - March 2026
As well as publishing, my site must support pulling in RSS feeds. Got this working surprisingly quickly. My understanding of Rust means I can quick go to the end-state. Begin working on module to migrate my content from old site to new. A messy task and (unlike everything else) not something that needs to be used again and again, so just needs to work once. But still make it a little bit generic.
Fri Mar 6 14:25:58 2026 Added RSS and Atom retrieval support
Sun Mar 8 16:46:40 2026 Indexed page models down one to include model name
Mon Mar 9 08:35:39 2026 Support anonymous access
Mon Mar 9 19:49:24 2026 Add news feed scheduler
Mon Mar 9 19:55:40 2026 Fixed cargo warning
Tue Mar 10 14:32:08 2026 Adding in new refresher
Mon Mar 16 09:49:41 2026 Separating out client
Wed Mar 25 09:31:42 2026 Add packaging and scripts preparing for migrate by type
Wed Mar 25 14:16:16 2026 Moved config props and schemas to new schemas lib
Thu Mar 26 19:53:09 2026 Get migrator working end to end
Mon Mar 30 21:20:30 2026 Extended init config to bootstrap more
Tue Mar 31 19:14:45 2026 Moved instance config from code to config toml file
Month 8 - April 2026
Going on holiday at start of May, set myself a target of sharing my photos in real-time (!) on my new site. Cannot do a big bang, so let's create a real benefit by allowing me to share my photos that day. This mental goal spurs me on with a tangible benefit. Work on the WASM UI is well underway now. Learning Yew with it's minimal documentation is a real challenge. But very slowly, the pieces of the puzzle reveal themselves. The whole UI takes shape this month and many key functions are now possible from a browser. I manage to share my photos from my holiday :-) but some are flipped the wrong way and paging breaks :-( . Fail. Proud of my lookup handler on typing input which searches the graph and auto-suggests. Had this before via jQuery, now working 100% in Rust.
Wed Apr 1 13:04:45 2026 Moved to indexed content paths
Thu Apr 2 19:15:21 2026 Added in content handler
Fri Apr 3 14:30:44 2026 Added in initial UI console page
Fri Apr 3 18:48:25 2026 Got trunk working
Thu Apr 9 08:29:17 2026 Added in content handler get support
Fri Apr 10 19:25:14 2026 Added in content put/save support
Sat Apr 11 21:06:39 2026 Added in static content and config content nodes
Sun Apr 12 10:50:17 2026 Support config graph content
Sun Apr 12 21:30:54 2026 Added admin only auth on protected endpoints, log out and default home page
Sun Apr 12 23:16:34 2026 Got page HTML page rendering correctly
Sun Apr 12 23:44:38 2026 Getting UI bundled correctly
Mon Apr 13 13:06:28 2026 WASM building, packaged correctly and loading
Tue Apr 14 17:27:31 2026 Added in console styling
Tue Apr 14 20:11:57 2026 Added in UI router
Wed Apr 15 19:42:09 2026 Local dev with trunk and proxy working
Fri Apr 17 08:12:43 2026 Adding config pages
Fri Apr 17 13:32:59 2026 Added more console pages
Sat Apr 18 08:13:40 2026 Adding new content edit page
Mon Apr 20 17:06:29 2026 Add validator
Tue Apr 21 19:42:20 2026 Adding object console page
Thu Apr 23 07:45:35 2026 Add in object view page
Fri Apr 24 15:59:22 2026 Added in admin subject page
Sat Apr 25 08:04:50 2026 Added in shortcodes to UI for lookup and fixed view() function
Sat Apr 25 15:35:29 2026 Added in default graph explorer
Sat Apr 25 21:04:05 2026 Getting upload working with tags
Sun Apr 26 09:46:40 2026 Adding image upload support
Sun Apr 26 18:16:04 2026 Support image resizing
Tue Apr 28 09:00:29 2026 Handle thumbnails and improve upload handler
Wed Apr 29 18:34:30 2026 Added in params and specs to init config
Thu Apr 30 20:35:11 2026 Add in tag page support
Month 9 - May 2026
Refurbished 16 GB Dell laptop arrives on 12th May! I almost brick the thing trying to install Linux. RSS news items being added to the new graph, but never deleted, fix this. Makefile improvements and start to use cargo release now. The Rust image library is excellent but massively slower doing a resize in debug versus release. Get image file rotation by 90 degrees working in WASM client and refactor how uploads work to be more Yew idiomatic. JPGs are first resized and then uploaded, making it fast and more efficient in every sense.
Fri May 1 13:00:12 2026 Got object tag indexing working
Mon May 4 17:04:39 2026 Support console dropdown edit
Mon May 4 17:04:56 2026 Support console dropdown edit
Wed May 6 16:30:42 2026 Added chevrons
Wed May 13 21:17:26 2026 Add in api status
Sat May 16 15:27:30 2026 Add hist to obj page
Sun May 17 10:52:14 2026 Add hist to upload and subject
Sun May 17 20:03:32 2026 Added in client side resizing
Mon May 18 18:53:31 2026 Converted file upload from form to json
Tue May 19 21:22:36 2026 Few tweaks, upload form reset and del error gone
Wed May 20 20:18:34 2026 Support image rotate
Mon May 25 07:59:43 2026 Split makefile
Mon May 25 08:04:19 2026 Fixed build warnings
Mon May 25 12:34:08 2026 If offset less than zero when paging use zero
Tue May 26 13:22:43 2026 Added in search and tests
Wed May 27 21:02:34 2026 Enabled header search function
Thu May 28 21:13:27 2026 Support subject edit
Sun May 31 20:57:48 2026 Fix to delete news
Month 10 - June 2026
Feature improvements now being produced at rapid rate. My site is a blend of old and new. Using news on new site, but my created content still on old. Serious breakthrough now, I am getting a real benefit with new site. As I use it more to build pages, I find I need to check logs to see failures (as these are never returned directly), so add a way to view latest logs, which requires me to sort out logging generally.
Mon Jun 1 20:07:58 2026 Support migrations
Tue Jun 2 20:33:54 2026 Improve subject edit screen
Wed Jun 3 13:29:44 2026 Improve prefix edit
Thu Jun 4 08:51:59 2026 Improved console formatting
Fri Jun 5 16:37:02 2026 Child to parent msg working for search_input
Sun Jun 7 10:52:16 2026 Lookup on edit
Tue Jun 9 19:35:04 2026 Support add node
Wed Jun 10 21:35:22 2026 Improve migrator and add core page types
Thu Jun 11 12:58:27 2026 Renamed PageType to NodeType
Thu Jun 11 13:18:35 2026 Allow URL override on add linked node
Fri Jun 12 13:09:34 2026 Improve date updates
Mon Jun 22 13:22:46 2026 Added in page model endpoint
Tue Jun 23 22:20:29 2026 Improved page data endpoint
Wed Jun 24 08:46:29 2026 Added in rolling log appender
Wed Jun 24 18:02:42 2026 Added json model test
Thu Jun 25 13:53:47 2026 Display page model and preflight data
Fri Jun 26 13:21:47 2026 Ensure only one created, and still index if created provided
Sat Jun 27 19:33:42 2026 Support update on created
Sun Jun 28 20:28:19 2026 Added in missing feed prop
Mon Jun 29 19:21:44 2026 Support migrate old content files
Month 11 - July 2026
Seriously delighted. My old site is retired, everything is running on new triki version. Everything is better. Use markdown extensively (always have) but need to enable github markdown to allow tables to work. Start going back over all my old blogs to make sure they look good.
The dream has happened. Writing more blogs than I have in years. Sharing more photos than I have in years.
Wed Jul 1 17:50:56 2026 Support migrations
Fri Jul 3 08:16:15 2026 Final migration fixes
Fri Jul 3 13:42:07 2026 Make page type suffix case insensitive
Fri Jul 3 15:45:22 2026 Added logs page for easier debug
Thu Jul 9 21:00:47 2026 Table markdown support, exclude include expansion object n1 query
Mon Jul 13 11:33:30 2026 Fixed home page handling
Mon Jul 13 14:15:13 2026 Fixed datetime on pages
Mon Jul 13 16:13:19 2026 Fixed EntityId confusino for home page
Sun Jul 19 12:40:07 2026 Markdown expand dcterms_description
Mon Jul 27 18:07:40 2026 Support tags on news and linked node graph select
Tue Jul 28 12:54:59 2026 Fixed upload image date created
Tue Jul 28 17:40:49 2026 Improved error handling and redirects
Month 12 - August 2026
Simple tweaks and improvements now. No pressure. Want to get Open ID login working and a few other things, but that can all come later. Enjoying my summer.
Tue Aug 4 13:40:24 2026 Fixed adding prefix shortcode updating