<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Arcology Site Engine Updates</title>
  <link href="http://v2.engine.arcology.garden/updates"/>
  <link rel="self" href="http://v2.engine.arcology.garden/updates.xml"/>
  <updated>2025-08-31T12:17:00Z</updated>
  <author>
    <name>ryan rix &lt;garden@whatthefuck.computer&gt;</name>
  </author>
  <id>http://v2.engine.arcology.garden/updates</id>
    <entry>
    <title>Per-page Custom Templates</title>
    <link href="http://v2.engine.arcology.garden/updates#20250830T122137.393362"/>
    <id>urn:uid:20250830T122137.393362</id>
    <published>2025-08-31T12:17:00Z</published>
    <updated>2025-08-31T12:17:00Z</updated>
    <content type="html">&lt;article&gt;&lt;h1 id=&quot;20250830T122137.393362&quot;&gt;Per-page Custom Templates&lt;/h1&gt;&lt;p&gt;The Arcology Project can now render some pages with per-page overrides of django&amp;#39;s page template.
&lt;/p&gt;&lt;p&gt;There are currently two:
&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;the pre-existing default &lt;a href=&quot;//v2.engine.arcology.garden/webserver#20240226T174503.655394&quot;&gt;Arcology Page HTML Template&lt;/a&gt; provides a metadata sidebar, like this page has;
&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href=&quot;//v2.engine.arcology.garden/webserver#20250829T215619.695387&quot;&gt;Arcology Page Wide Format Template&lt;/a&gt; provides a single-column design with the metadata above and below the content. The home-pages use this now, as do &amp;quot;index&amp;quot; &lt;a href=&quot;//v2.whatthefuck.computer/topics&quot;&gt;Topic Files&lt;/a&gt; like my &lt;a href=&quot;//v2.rix.si/recipes&quot;&gt;Recipes&lt;/a&gt; page that only exists to list backlinks.
&lt;/p&gt;&lt;p&gt;
&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;I&amp;#39;ll add more templates later on, I guess. I probably will change how the headers render in the Wide Format before too long.
&lt;/p&gt;&lt;/article&gt;</content>
  </entry>
    <entry>
    <title>We&#39;re speeding up the Arcology&#39;s [[id:128ab0e8-a1c7-48bf-9efe-0c23ce906a48][Org Mode Hypermedia]] document generation by tying it to a local API server</title>
    <link href="http://v2.engine.arcology.garden/updates#20240318T165317.702660"/>
    <id>urn:uid:20240318T165317.702660</id>
    <published>2024-03-18T16:53:00Z</published>
    <updated>2024-03-18T16:53:00Z</updated>
    <content type="html">&lt;article&gt;&lt;h1 id=&quot;20240318T165317.702660&quot;&gt;We&amp;#39;re speeding up the Arcology&amp;#39;s &lt;a href=&quot;//v2.whatthefuck.computer/org_mode_hypermedia&quot;&gt;Org Mode Hypermedia&lt;/a&gt; document generation by tying it to a local API server &lt;/h1&gt;&lt;p&gt;One of the downsides of bringing the Arcology&amp;#39;s parsing and database management out of Emacs Lisp where I used &lt;a href=&quot;/404?node=introducing_emacsql_null_program&quot; class=&quot;unpublished&quot;&gt;emacsql&lt;/a&gt; and in to Django&amp;#39;s ORM means that my Emacs process can no longer quickly access the database with a trustworthy schema. The first attempt to build out the &lt;a href=&quot;//v2.engine.arcology.garden/code-generators&quot;&gt;The Arroyo Generators&lt;/a&gt; worked well enough relying on a &lt;code&gt;django_manage&lt;/code&gt; (aka &lt;code&gt;python manage.py&lt;/code&gt;), but it was &lt;strong&gt;slow&lt;/strong&gt; since it had to spin up a whole ass Django environment every time I wanted to regenerate a document.
&lt;/p&gt;&lt;p&gt;It was even worse when, for stability&amp;#39;s sake, i replaced the implicit use of &lt;a href=&quot;//v2.cce.whatthefuck.computer/direnv&quot;&gt;direnv&lt;/a&gt;, etc, with a &lt;code&gt;nix run&lt;/code&gt; command in a &lt;code&gt;shell&lt;/code&gt; org babel source block which would copy all of my server&amp;#39;s source code in to &lt;code&gt;/nix/store&lt;/code&gt; every time I made changes to any of these documents, blocking Emacs in the process.
&lt;/p&gt;&lt;p&gt;I&amp;#39;ve since done some work to build out a minimal &amp;quot;&lt;a href=&quot;//v2.engine.arcology.garden/localapi&quot;&gt;Localhost API for the Arcology&lt;/a&gt;&amp;quot;, a set of endpoints in the Django application which can answer the questions which the Arcology&amp;#39;s document meta-programming systems want to know and provide an &lt;a href=&quot;//v2.cce.whatthefuck.computer/lisp-core&quot;&gt;Emacs Lisp&lt;/a&gt; API to do so:
&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;code&gt;(arcology-fetch-localapi-bearer-token)&lt;/code&gt; fetches the bearer token file shared with the &lt;code&gt;localapi&lt;/code&gt; deployment.
&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;code&gt;(arcology-localapi-call method path)&lt;/code&gt; is an API helper which given an API path will fetch the data with authorization and return a deserialized JSON structure
&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;these interactive commands will fetch a URL, putting it on your kill ring or clipboard if you call it with &lt;code&gt;M-x&lt;/code&gt; or equivalent:
  &lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;code&gt;(arcology-key-to-url page-key &amp;amp;optional heading-id)&lt;/code&gt; will take an &lt;code&gt;ARCOLOGY_KEY&lt;/code&gt; and return a URL
  &lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;code&gt;(arcology-file-to-url file-path &amp;amp;optional heading-id)&lt;/code&gt; will do the same with a file path from &lt;code&gt;(buffer-file-name)&lt;/code&gt; or so.
  &lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;code&gt;(arcology-url-at-point)&lt;/code&gt; gets the org-id of the heading your cursor is in if it has one, and makes a URL that links directly to that.
  &lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;code&gt;(arcology-read-url)&lt;/code&gt; pops up a list of all the org-roam headings, and returns a URL to it.
  &lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;code&gt;(arcology-api-generator)&lt;/code&gt; calls in to &lt;a href=&quot;//v2.engine.arcology.garden/code-generators&quot;&gt;The Arroyo Generators&lt;/a&gt; and returns the string of files they generate
&lt;/p&gt;&lt;p&gt;
&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;With these it&amp;#39;s possible to quickly generate NixOS configurations, Emacs init configurations, or other declarative configuration formats from within &lt;a href=&quot;//v2.whatthefuck.computer/org-mode&quot;&gt;org-mode&lt;/a&gt; and there are a few interactive user functions to generate URLs to public documents. The Local API deployment includes manifests for generating a &lt;a href=&quot;//v2.cce.whatthefuck.computer/home-manager&quot;&gt;home-manager&lt;/a&gt; configuration which sets up authorization tokens and starting a background process which will keep the local Arcology database up to date with the &lt;a href=&quot;//v2.engine.arcology.garden/commands#20231218T183551.765340&quot;&gt;Arcology watchsync Command&lt;/a&gt; and a small instance of &lt;a href=&quot;//v2.engine.arcology.garden/webserver&quot;&gt;The Arcology&amp;#39;s Web Server&lt;/a&gt;.
&lt;/p&gt;&lt;p&gt;The nice thing about having this run locally is that it&amp;#39;s really easy to share a bearer token to secure this API. Since it&amp;#39;s possible to dump information from un-published pages with this API, it needs to not be generally accessible, and for that it requires a simple Bearer Token which is presented in an &lt;code&gt;Authorization&lt;/code&gt; HTTP header and stored in an Environment file that can be loaded either directly by &lt;code&gt;systemd&lt;/code&gt; or in a shell environment like &lt;code&gt;arcology-fetch-localapi-bearer-token&lt;/code&gt; does.
&lt;/p&gt;&lt;p&gt;This environment file could/should be automatically generated while pulling the other necessary secret in the process, a &lt;a href=&quot;//v2.cce.whatthefuck.computer/syncthing&quot;&gt;Syncthing&lt;/a&gt; API key from the local &lt;code&gt;config.xml&lt;/code&gt;. This would be fun and straightforward to do some day soon but for now it just takes a second to populate yourself.
&lt;/p&gt;&lt;p&gt;But for now, we&amp;#39;re close to having a system which others could bootstrap!
&lt;/p&gt;&lt;/article&gt;</content>
  </entry>
    <entry>
    <title>Integrated Django&#39;s caching framework in to the site render pipeline</title>
    <link href="http://v2.engine.arcology.garden/updates#20240305T135158.322398"/>
    <id>urn:uid:20240305T135158.322398</id>
    <published>2024-03-05T23:19:00Z</published>
    <updated>2024-03-05T23:19:00Z</updated>
    <content type="html">&lt;article&gt;&lt;h1 id=&quot;20240305T135158.322398&quot;&gt;Integrated Django&amp;#39;s caching framework in to the site render pipeline &lt;/h1&gt;&lt;p&gt;Today I implemented robust caching support via a &lt;a href=&quot;//v2.engine.arcology.garden/scaffolding#20240305T122458.841243&quot;&gt;Decorator function&lt;/a&gt; and the built-in Django cache framework. It&amp;#39;s a slick little piece of code that is probably generally useful for Django developers so here you go.
&lt;/p&gt;&lt;p&gt;Prior versions of the Arcology used Python&amp;#39;s built-in &lt;code&gt;functools.lru_cache&lt;/code&gt; which is simple and effective and basically fool-proof. you decorate a function and make sure you provide an argument which can be used to bust the cache (a file hash for example), and call it once for each object, and voila your endpoints respond more quickly with marginal resident memory cost.
&lt;/p&gt;&lt;p&gt;Those prior versions were based on FastAPI and deployed on &lt;code&gt;uvicorn&lt;/code&gt; which  uses a &lt;code&gt;libuv&lt;/code&gt; event loop to scale up traffic within a single process; i considered designing the django system to be deployed in the same fashion but ultimately decided to deploy a multi-process served by &lt;code&gt;gunicorn&lt;/code&gt;. This meant that the in-memory caches would be duplicated for each process and there would be far more cache misses.
&lt;/p&gt;&lt;p&gt;That was not ideal.
&lt;/p&gt;&lt;p&gt;I started by just spit-balling a simple file cache that only worked with strings, just calculcated a cache key based on the args and kwargs, used that as a filename and wrote the string to it and that worked out well enough to start productionizing it. When I went to the &lt;a href=&quot;//v2.engine.arcology.garden/configuration&quot;&gt;Arcology Project Configuration&lt;/a&gt; to add an environment variable to control the cache path I saw that Django was already trying to provide a &lt;code&gt;CACHES&lt;/code&gt; configuration section which lead me back to the Django Cache Framework documentation, a page I read maybe a half-dozen times and disregarded because I thought &lt;code&gt;lru_cache&lt;/code&gt; was good enough and it didn&amp;#39;t have the exact memoization decorator I wanted. ha ha ha.
&lt;/p&gt;&lt;p&gt;That framework has some basically useful facilities for caching objects and template partials and entire view results and the like which I probably could have used to implement this, but I had a bunch of HTML strings spat out by a Rust module which I wanted to be able to partially invalidate (for example inside of the &lt;code&gt;FeedEntry.to_html&lt;/code&gt; in &lt;a href=&quot;//v2.engine.arcology.garden/webserver&quot;&gt;The Arcology&amp;#39;s Data Models&lt;/a&gt;). So I re-purposed the string file caching decorator  I&amp;#39;d written and replaced its innards with calls in to the Django cache framework and deployed it.
&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;/arcology/attachment/442b5be38087e6dd406682ea013137d0f0094ab25f468e9d76e11581d0e31352-2160.png/html&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;/attachment/442b5be38087e6dd406682ea013137d0f0094ab25f468e9d76e11581d0e31352-1080.png&quot; alt=&quot;2025-07-07_21-58-44_442b5be38087e6dd406682ea013137d0f0094ab25f468e9d76e11581d0e31352.png&quot; loading=&quot;lazy&quot;/&gt;&lt;/a&gt;
&lt;/p&gt;&lt;p&gt;You simply love to see it!
&lt;/p&gt;&lt;p&gt;This also makes the new &lt;a href=&quot;//v2.engine.arcology.garden/sitemaps&quot;&gt;Site Maps&lt;/a&gt; work much better, too. It used to take upwards of 20 seconds to evaluate every page and link in the database to generate the JSON entities for them; now the individual entities and the combined JSON are both cached and the sitemap loads in milliseconds, maybe a second at most if I change a page and the JSON cache is invalidated. The page/edge caches for every page but the one which was changed will still be valid and greatly speed up the re-rendering of the JSON cache entity.
&lt;/p&gt;&lt;p&gt;I had to fix some bugs after deployment, of course, and along the way I fixed metrics publishing which was subject to the same issue until I configured &lt;a href=&quot;//github.com/korfuri/django-prometheus/blob/master/documentation/exports.md#exporting-metrics-in-a-wsgi-application-with-multiple-processes-globally&quot;&gt;&lt;code&gt;PROMETHEUS_MULTIPROC_DIR&lt;/code&gt;&lt;/a&gt;, though I probably should move that to a &lt;code&gt;tmpfiles.d&lt;/code&gt; entry. I promise those histogram quantiles were and are accurate 😉
&lt;/p&gt;&lt;/article&gt;</content>
  </entry>
    <entry>
    <title>Arcology has a Sitemap and a Tag Index</title>
    <link href="http://v2.engine.arcology.garden/updates#20240226T201556.876823"/>
    <id>urn:uid:20240226T201556.876823</id>
    <published>2024-02-26T20:16:00Z</published>
    <updated>2024-02-26T20:16:00Z</updated>
    <content type="html">&lt;article&gt;&lt;h1 id=&quot;20240226T201556.876823&quot;&gt;Arcology has a Sitemap and a Tag Index           &lt;/h1&gt;&lt;p&gt;I&amp;#39;ve re-implemented the support for the &lt;a href=&quot;//engine.arcology.garden/sitemap&quot;&gt;Map of the Arcology&lt;/a&gt;, a graph of nodes and edges which gives way to space. Here is what I mean:
&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;/arcology/attachment/b505ae1ed3de0bbbc7940a29cc11baf3a8ac1e6411186baf5a974d8410180e65-2160.png/html&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;/attachment/b505ae1ed3de0bbbc7940a29cc11baf3a8ac1e6411186baf5a974d8410180e65-1080.png&quot; alt=&quot;2025-07-07_21-58-58_b505ae1ed3de0bbbc7940a29cc11baf3a8ac1e6411186baf5a974d8410180e65.png&quot; loading=&quot;lazy&quot;/&gt;&lt;/a&gt;
&lt;/p&gt;&lt;p&gt;This image has looked the same for years, and I make sure to use the same placement algorithm each time. So it&amp;#39;s a navigable map where pages which link to each other are drawn towards each other. If I draw it, the map responds. It&amp;#39;s probably navigable only by myself, but you can see how the four sites in the Arcology interact on their edges. You can see the &lt;a href=&quot;//v2.engine.arcology.garden/index&quot;&gt;Arcology Engine&lt;/a&gt;&amp;#39;s systems clustered to the east an flowing in to the &lt;a href=&quot;//v2.cce.whatthefuck.computer/index&quot;&gt;CCE&lt;/a&gt;&amp;#39;s systems and borders on the edges of &lt;a href=&quot;//v2.whatthefuck.computer/index&quot;&gt;The Arcology Garden&lt;/a&gt; which starts to show content which is more personal, less tied to my Emacs and NixOS development work. And in the north-west you find &lt;a href=&quot;//v2.rix.si/index&quot;&gt;The Lion&amp;#39;s Rear&lt;/a&gt; where my Tea, Gardening and other works which are less and less mediated by computers.
&lt;/p&gt;&lt;p&gt;You could imagine seeing an island from above, where there is an industrial block driving heart and soul of the Arcology on the east coast, and wildlands and farm lands to the west, with production and creative works spreading across the middle of the land.
&lt;/p&gt;&lt;p&gt;A true Arcology would have the services block and the living block co-located so that commutes from the center are similar for all inhabitants but this is no true Arcology. You could imagine such a network model forming as other peoples&amp;#39; thinking systems join the Arcology.
&lt;/p&gt;&lt;p&gt;That&amp;#39;s all a little too high-concept for you, perhaps.
&lt;/p&gt;&lt;p&gt;Maybe you want to see a list of tags, and if you click them it shows you the pages which use that tag.
&lt;/p&gt;&lt;p&gt;In that case, you might enjoy the &lt;a href=&quot;//engine..arcology.garden/tags/&quot;&gt;Tag Index&lt;/a&gt;. It shows you all the pages across all of the sites which are tagged. The main tag index is &amp;quot;lazy&amp;quot;, it won&amp;#39;t give you a singular page with all the pages on it because the ORM relationships I set up are just a little bit too limited still. It uses &lt;a href=&quot;HTMX&quot;&gt;HTMX&lt;/a&gt; to load a &amp;quot;partial&amp;quot; in when you click on the count of headings for each tag, letting you click through and see the Pages which use the tag.  You can also link to individua tags&amp;#39; index pages, or click the tags in the sidebar of each page.
&lt;/p&gt;&lt;p&gt;I might add some breadcrumb thingy soon/next too. 
&lt;/p&gt;&lt;p&gt;But for now this thing is probably good enough! I wish the JSON generation endpoint was quicker, it could stand to be optimized, but if you hit it with a warm cache it loads quite nicely.
&lt;/p&gt;&lt;p&gt;I&amp;#39;ve also been working on the shape/design/script of the &lt;a href=&quot;//v2.cce.whatthefuck.computer/rebuild&quot;&gt;Rebuild of The Complete Computer&lt;/a&gt; some more, I&amp;#39;ll share some plans for that soon.
&lt;/p&gt;&lt;/article&gt;</content>
  </entry>
    <entry>
    <title>Soft-launching the new version of the Arcology ... or not.</title>
    <link href="http://v2.engine.arcology.garden/updates#20240215T162928.769275"/>
    <id>urn:uid:20240215T162928.769275</id>
    <published>2024-02-15T16:29:00Z</published>
    <updated>2024-02-15T16:29:00Z</updated>
    <content type="html">&lt;article&gt;&lt;h1 id=&quot;20240215T162928.769275&quot;&gt;Soft-launching the new version of the Arcology ... or not.&lt;/h1&gt;&lt;p&gt;I&amp;#39;ve been working hard the last few weeks on the &lt;a href=&quot;//v2.engine.arcology.garden/index&quot;&gt;Django Edition&lt;/a&gt; of my site engine.
&lt;/p&gt;&lt;p&gt;Arroyo has come together nicely, the configurations for my systems are generated using the new framework, and all that has been really nice.
&lt;/p&gt;&lt;p&gt;I instrumented the process &lt;a href=&quot;//github.com/korfuri/django-prometheus&quot;&gt;django-prometheus&lt;/a&gt; and some of my own instrumentation. 
&lt;/p&gt;&lt;p&gt;I added &lt;code&gt;robots.txt&lt;/code&gt;, &lt;code&gt;feeds.json&lt;/code&gt; and got the &lt;code&gt;gunicorn&lt;/code&gt; workers shipping in &lt;a href=&quot;//v2.engine.arcology.garden/webserver&quot;&gt;The Arcology&amp;#39;s Web Server&lt;/a&gt; endpoints.
&lt;/p&gt;&lt;p&gt;I started writing unit-tests for the models and the ingester code.
&lt;/p&gt;&lt;p&gt;I wrote NixOS &lt;a href=&quot;//v2.engine.arcology.garden/deploy&quot;&gt;deployment manifests&lt;/a&gt; which front the sites with &lt;code&gt;nginx&lt;/code&gt; which collects the serves the static assets from &lt;code&gt;nginx&lt;/code&gt; and safely loads changes to the notebooks using Syncthing, though this doesn&amp;#39;t seem like it works on the server yet.
&lt;/p&gt;&lt;p&gt;In the process of doing all of this, I broke the &lt;a href=&quot;/404?node=arcology/fastapi&quot; class=&quot;unpublished&quot;&gt;Arcology FastAPI&lt;/a&gt; Arroyo integration so that those sites no longer update. And then I deleted the &lt;code&gt;arcology.db&lt;/code&gt; because I couldn&amp;#39;t figure out why it wouldn&amp;#39;t update. Woops.
&lt;/p&gt;&lt;p&gt;So all my sites now run on this new codebase. It probably won&amp;#39;t work perfectly but it&amp;#39;s nearly feature complete!
&lt;/p&gt;&lt;/article&gt;</content>
  </entry>
    <entry>
    <title>Took another swing at Arcology&#39;s Atom feed generation</title>
    <link href="http://v2.engine.arcology.garden/updates#20240204T235534.416507"/>
    <id>urn:uid:20240204T235534.416507</id>
    <published>2024-02-05T10:16:00Z</published>
    <updated>2024-02-05T10:16:00Z</updated>
    <content type="html">&lt;article&gt;&lt;h1 id=&quot;20240204T235534.416507&quot;&gt;Took another swing at Arcology&amp;#39;s Atom feed generation              &lt;/h1&gt;&lt;p&gt;A few weeks ago I wrote an &lt;a href=&quot;/404?node=20240112T121157.583809&quot; class=&quot;unpublished&quot;&gt;&lt;code&gt;ArroyoAtomHandler&lt;/code&gt;&lt;/a&gt; which would go over each element to generate a page, sort of like the built-in org exporters or my &lt;a href=&quot;/404?node=20240112T120813.386800&quot; class=&quot;unpublished&quot;&gt;Arroyo HTML exporter&lt;/a&gt;. It was bodgy as hell, and I probably could have done a better job at it, but it was just too easy to get confused in working between the Atom and the HTML exporter, and I just didn&amp;#39;t like it.
&lt;/p&gt;&lt;p&gt;So yesterday I took &lt;a href=&quot;/404?node=20240112T120813.386800&quot; class=&quot;unpublished&quot;&gt;The Arroyo HTML exporter&lt;/a&gt; and gave it the ability to only export a few headings, based on an allowlist of IDs passed in to it.
&lt;/p&gt;&lt;p&gt;I also extended the system to cache the contents of Headings&amp;#39; &lt;code&gt;PROPERTIES&lt;/code&gt; drawers, in both &lt;a href=&quot;/404?node=20231024T105239.712407&quot; class=&quot;unpublished&quot;&gt;The Parser Heading Type&lt;/a&gt;, and the &lt;a href=&quot;//v2.engine.arcology.garden/roam#20240204T234111.701754&quot;&gt;Arcology Org-Roam Caching Models&lt;/a&gt; which can drive other behaviors. I&amp;#39;ve given the Arcology the same metadata-query powers for Headings which it already has for Pages. This allows me to, at minimum, capture the &lt;code&gt;publish date&lt;/code&gt; of any Heading in my system and then query those. The Arcology captures these dates, converts them in to DateTime objects which can then be used to group and order posts, do time-bound queries, and the like, and this can be extended to other metadata stored on the Headings.
&lt;/p&gt;&lt;p&gt;Combining these two things together lets the Arcology populate feeds from anywhere in my notebooks as in the &lt;a href=&quot;//v2.engine.arcology.garden/webserver#20240204T234814.612917&quot;&gt;Atom Feed Handler&lt;/a&gt;. This code design is way more reasonable to deal with and more flexible than the &lt;code&gt;ArroyoAtomHandler&lt;/code&gt; was.
&lt;/p&gt;&lt;p&gt;So soon I can microblog from my org-mode &lt;a href=&quot;//v2.cce.whatthefuck.computer/journal&quot;&gt;journal&lt;/a&gt; and knowledge system by generating private, topic-specific Atom feeds which automatically cross-post to my &lt;a href=&quot;//v2.whatthefuck.computer/topic/fediverse&quot;&gt;Fediverse&lt;/a&gt; profiles via &lt;a href=&quot;//v2.engine.arcology.garden/feediverse&quot;&gt;Feediverse&lt;/a&gt; or a built-in implementation. I can confidently generate a private journal feed that doesn’t have an HTML-page counterpart, it’s just an atom feed of a selection of my org-mode system work[fn:1:it&amp;#39;s possible that this won&amp;#39;t work since backlinks and whatnot may not be properly cached and generated].
&lt;/p&gt;&lt;p&gt;I&amp;#39;m pretty close to having this in a position where it can be deployed. I think largely the behavior and features won&amp;#39;t change except for some small design cues, but it&amp;#39;s not quite feature complete yet. I laid out a &lt;a href=&quot;//v2.engine.arcology.garden/index#20240205T101753.548048&quot;&gt;Rough Timeline and Task List&lt;/a&gt; on the Arcology&amp;#39;s repo which will spell out a &amp;quot;1.0&amp;quot;.
&lt;/p&gt;&lt;p&gt;I&amp;#39;ve been planning in earnest to ship a &amp;quot;1.0&amp;quot; version of the Arcology publishing platform and the Complete Computer dynamic declarative environment this year. Part of that is re-structuring all these components so that the Arcology and the Complete Computer can be more piece-meal assemblies that others could adopt without pulling in all of my frankly inane software preferences. As part of that, I want to produce a series of video tutorials as a set of documentation, which I have been calling &lt;a href=&quot;//v2.cce.whatthefuck.computer/rebuild&quot;&gt;Rebuild of The Complete Computer&lt;/a&gt;. I don&amp;#39;t have much to share yet on that front, but a plan is coming together.
&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;/arcology/attachment/e613b2343419464f5c40d6073b880a0cdf304c1a4d514fe35693fed30e10a9aa-2160.png/html&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;/attachment/e613b2343419464f5c40d6073b880a0cdf304c1a4d514fe35693fed30e10a9aa-1080.png&quot; alt=&quot;2025-07-07_21-59-15_e613b2343419464f5c40d6073b880a0cdf304c1a4d514fe35693fed30e10a9aa.png&quot; loading=&quot;lazy&quot;/&gt;&lt;/a&gt;
&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;The Rebuild of the Complete Computer series will be a semi-scripted stream series where I sell and document the org-mode publishing, computing, and productivity suite I’ve developed for myself and my community.
&lt;/p&gt;&lt;/blockquote&gt;&lt;/article&gt;</content>
  </entry>
    <entry>
    <title>[[id:arcology/django/readme][The Arcology Project: Django Edition]] now renders a new site design</title>
    <link href="http://v2.engine.arcology.garden/updates#20231229T220658.280620"/>
    <id>urn:uid:20231229T220658.280620</id>
    <published>2023-12-29T10:05:00Z</published>
    <updated>2023-12-29T10:05:00Z</updated>
    <content type="html">&lt;article&gt;&lt;h1 id=&quot;20231229T220658.280620&quot;&gt;&lt;a href=&quot;//v2.engine.arcology.garden/index&quot;&gt;The Arcology Project: Django Edition&lt;/a&gt; now renders a new site design &lt;/h1&gt;&lt;p&gt;The current design of these sites is fine, but the way I differentiate the sites using certain emoji for each domain makes the site a bit too busy for my taste. I will not stop using &lt;a href=&quot;//v2.cce.whatthefuck.computer/vulfpeck&quot;&gt;Vulf Fonts&lt;/a&gt;, and this design carries that forward. What happens now is that each cross-domain link is tinted with the background of the page it&amp;#39;ll link to. So if you browse the sites enough, you&amp;#39;ll identify where you are based on the coloring at the top. Each site is stored in the DB along with a link color that is set by the &lt;a href=&quot;//v2.engine.arcology.garden/commands#20231217T154835.232283&quot;&gt;Arcology Seed Command&lt;/a&gt; and a Django view renders a &lt;a href=&quot;//v2.engine.arcology.garden/webserver#20231229T215425.830707&quot;&gt;dynamically generated CSS file&lt;/a&gt; and because I&amp;#39;ve been more and more of an org-babel sicko, those CSS files are paired with one for the current page&amp;#39;s site are generated dynamically using &lt;a href=&quot;//v2.whatthefuck.computer/org-mode&quot;&gt;org-mode&lt;/a&gt; tables. 😈
&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;/arcology/attachment/6db4e290d39b66d98b76136d7f17e0b39e104d360dc691270eb4f74c94738cca-2160.png/html&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;/attachment/6db4e290d39b66d98b76136d7f17e0b39e104d360dc691270eb4f74c94738cca-1080.png&quot; alt=&quot;2025-07-07_21-59-29_6db4e290d39b66d98b76136d7f17e0b39e104d360dc691270eb4f74c94738cca.png&quot; loading=&quot;lazy&quot;/&gt;&lt;/a&gt;
&lt;/p&gt;&lt;p&gt;I also set up a &lt;code&gt;flexbox&lt;/code&gt; layout that will show the backlinks and page metadata on the side on a wide enough display, or float them toward the bottom if you&amp;#39;re on a narrow display or browsing on mobile. I&amp;#39;m still investigating what changes I need to make to get Tufte-CSS-style sidenotes to work, but this is a good start.
&lt;/p&gt;&lt;p&gt;I need to tackle feed generation next, and I am &lt;strong&gt;not&lt;/strong&gt; looking forward to re-doing this to not rely on Pandoc like the current version does. Once I&amp;#39;ve done that, it can be self-hosting though, which is exciting stuff.
&lt;/p&gt;&lt;/article&gt;</content>
  </entry>
    <entry>
    <title>Checking in on the new version of [[id:1d917282-ecf4-4d4c-ba49-628cbb4bb8cc][The Arcology Project]] |</title>
    <link href="http://v2.engine.arcology.garden/updates#20231223T231032.979299"/>
    <id>urn:uid:20231223T231032.979299</id>
    <published>2023-12-23T23:30:00Z</published>
    <updated>2023-12-23T23:30:00Z</updated>
    <content type="html">&lt;article&gt;&lt;h1 id=&quot;20231223T231032.979299&quot;&gt;Checking in on the new version of &lt;a href=&quot;//v2.whatthefuck.computer/arcology&quot;&gt;The Arcology Project&lt;/a&gt; | &lt;/h1&gt;&lt;p&gt;This fall I have been spending more time with the experimental rust rewrite of my &lt;a href=&quot;//v2.cce.whatthefuck.computer/arroyo&quot;&gt;Arroyo Systems Management&lt;/a&gt; libraries, the early promising progress was written about below in &lt;a href=&quot;//v2.engine.arcology.garden/updates#20230614T120809.393684&quot;&gt;I am starting to experiment with a rust rewrite of the Arroyo Arcology Generator&lt;/a&gt;. Since then, quite a lot of progress has been made.
&lt;/p&gt;&lt;p&gt;I spent most of this summer building a few prototypes to try out different ORMs and compare them to what exists in the current &lt;a href=&quot;/404?node=arcology/fastapi&quot; class=&quot;unpublished&quot;&gt;Arcology FastAPI&lt;/a&gt; application, which uses a library called &lt;a href=&quot;//sqlmodel.tiangolo.com/&quot;&gt;SQLModel&lt;/a&gt; which promises the best of Pydantic for validation and marshaling and SQLAlchemy for query and persistence. It&amp;#39;s fine, but a bit overkill for what I ended up building. I spent some time prototyping the Arcology&amp;#39;s data model with a few different Rust and Python ORMs before landing on a surprising best choice:
&lt;/p&gt;&lt;p&gt;The next version of the Arcology will be built with Django: Meet &lt;a href=&quot;//v2.engine.arcology.garden/index&quot;&gt;The Arcology Project: Django Edition&lt;/a&gt;
&lt;/p&gt;&lt;p&gt;I spent some time over the last year building a small application for the &lt;a href=&quot;//v2.whatthefuck.computer/drp&quot;&gt;Data Rights Protocol&lt;/a&gt; in Django with a coworker who had prior experience with it. I had used it a bit in back in maybe 2012 but never really gave it a fair shake. While there was a lot I didn&amp;#39;t and don&amp;#39;t like about the codebase we built for testing DRP, Django is really decent to work with once you internalize a project structure and start to work with the ORM. While I haven&amp;#39;t had to optimize the ORM&amp;#39;s behavior or individual queries in anger yet, it&amp;#39;s transparent, it&amp;#39;s robust, and it was really easy to get the data model I wanted slotted in to place. Compared to most of the Rust ORMs which involved code generation or a large amount of boilerplate entity structures or trait implementations, this felt more akin to writing Rails or SQLModel. Only Elixir/Phoenix&amp;#39;s Ecto came close, and while I thought hard about shipping this in Elixir, I ended up deciding not to based on the agility I have had in the Django prototype.
&lt;/p&gt;&lt;p&gt;Ultimately, I&amp;#39;m coming to appreciate Django a lot more than I did a year ago. It&amp;#39;s a good kit and I could become quite productive with it. The latest versions have some async python3 support which I tried to use for a bit but ultimately want to rip out since the ORM has two incompatible query paths between sync/async and you can&amp;#39;t mix them, so you end up with multiple implementations of the same getter/setter with different colored functions that don&amp;#39;t compose. But that&amp;#39;s python. Based on historical traffic patterns, Arcology can handle running inside a handful of &lt;code&gt;gunicorn&lt;/code&gt; processes. Hell it could run inside of 1 most of the time!
&lt;/p&gt;&lt;p&gt;So Django handles page routing, templating, statics, and the data model that is used to serve pages. The data model and the actual HTML generation are being handled by the Rust codebase. &lt;a href=&quot;//pyo3.rs&quot;&gt;pyo3&lt;/a&gt; and its &lt;a href=&quot;//www.maturin.rs/&quot;&gt;maturin&lt;/a&gt; build tool are hot shit. that thing fucking slaps. it goes so hard. etc. It makes it really easy to expose Rust code to Python and the reverse, too.
&lt;/p&gt;&lt;p&gt;In &lt;a href=&quot;/404?node=20231023T115950.248543&quot; class=&quot;unpublished&quot;&gt;The arroyo_rs Native Org Parser&lt;/a&gt; the Orgize parser turns a page in to a struct of keywords, headings, links, etc, and these are shepharded in to Python and persisted in to the DB by Django.
&lt;/p&gt;&lt;p&gt;This allowed me to do some thing cool very quickly: The &lt;a href=&quot;//v2.cce.whatthefuck.computer/cce&quot;&gt;The Complete Computing Environment&lt;/a&gt; configurations are now generated by the Django codebase instead of Emacs Lisp, and it&amp;#39;s faster and more robust. I can &lt;code&gt;nix run&lt;/code&gt; a flake to generate the DB from a directory of org-mode files and run it again to tangle them in to a &lt;code&gt;init.el&lt;/code&gt;. Soon enough you could, too. It even runs in &lt;a href=&quot;/404?node=20220817T205401.021191&quot; class=&quot;unpublished&quot;&gt;t184256/nix-on-droid&lt;/a&gt; so I can make config changes to my server or emacs environment and rebuild it on the go [not that i &lt;strong&gt;should&lt;/strong&gt;.... 😛 it&amp;#39;s mostly just fun.]
&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;/404?node=20231023T115950.248543&quot; class=&quot;unpublished&quot;&gt;The arroyo_rs Native Org Parser&lt;/a&gt; also has a fairly basic Org to HTML exporter built in to it, extending functionality in Orgize to provide an HTML exporter that, in a single pass, does all the work which the FastAPI process had to do in three steps. And it does so without invoking Pandoc.
&lt;/p&gt;&lt;p&gt;The most complicated part as always is the URL rewriting from internal &lt;a href=&quot;//v2.cce.whatthefuck.computer/org-roam&quot;&gt;org-roam&lt;/a&gt; IDs to external URLs like the one you&amp;#39;re reading right now.
&lt;/p&gt;&lt;p&gt;Consider a link to this very post =&lt;a href=&quot;//v2.engine.arcology.garden/updates#20231223T231032.979299&quot;&gt;20231223T231032.979299&lt;/a&gt;=: find the file this heading is stored in. See if that file has a page entity, this will have an &lt;code&gt;ARCOLOGY_KEY&lt;/code&gt; keyword in it, publishing it to an arbitrary domain/path in my system, in this case &lt;code&gt;arcology/updates&lt;/code&gt;. &lt;code&gt;arcology&lt;/code&gt; maps to a domain, &lt;code&gt;engine.arcology.garden&lt;/code&gt;. this is replaced to generate a URL to this page, and then the ID is added as an anchor to jump the viewer to this post&amp;#39;s headline. it&amp;#39;s complicated but it keeps me from having to maintain file system heirarchies and just lean on org-roam&amp;#39;s linking facilities in a flat file layout. And as of today &lt;a href=&quot;//v2.engine.arcology.garden/index&quot;&gt;The Arcology Project: Django Edition&lt;/a&gt; supports rendering these URLs by generating a dictionary mapping from the internal ID to the public URL and passing that dict in to the native exporter, where it&amp;#39;ll be replaced when the HTML anchor is generated:
&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;/arcology/attachment/a6d21719d7a65f73ae45255ab93c92bfb9ea27330c13512f195979adcef22bd5-2160.jpg/html&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;/attachment/a6d21719d7a65f73ae45255ab93c92bfb9ea27330c13512f195979adcef22bd5-1080.jpg&quot; alt=&quot;2025-07-07_21-59-42_a6d21719d7a65f73ae45255ab93c92bfb9ea27330c13512f195979adcef22bd5.jpg&quot; loading=&quot;lazy&quot;/&gt;&lt;/a&gt;
#+CAPTION: a screenshot of Firefox for Android showing a context menu for a link within a page on a localhost:8000 site with a fully qualified URL in it.
&lt;/p&gt;&lt;p&gt;There is still a laundry-list of feature work and basic functionality to be done and this system is a long way still from being able to replace the existing system but the new codebase already reveals some very nice synergies.
&lt;/p&gt;&lt;p&gt;Speaking of synergies, I have one last thing to share, the new system will &lt;a href=&quot;//v2.engine.arcology.garden/commands#20231218T183551.765340&quot;&gt;Ingest files on-demand using Syncthing&lt;/a&gt; rather than &lt;code&gt;inotify&lt;/code&gt; as I hinted at in the last post. This, along with much much faster ingestion, means that the sites will update within seconds of a change being made on an endpoint. Syncthing basically provides a very robust HTTP long-poll wrapper around &lt;code&gt;inotify&lt;/code&gt; and i would love to not deal with temporary files and POSIX semantics and shitty state machines like I did in the &lt;a href=&quot;/404?node=20211218T222408.578567&quot; class=&quot;unpublished&quot;&gt;Arcology Automated Database Builder&lt;/a&gt; for the FastAPI site.
&lt;/p&gt;&lt;/article&gt;</content>
  </entry>
    <entry>
    <title>I am starting to experiment with a rust rewrite of the [[id:arcology/arroyo-page][Arroyo Arcology Generator]]</title>
    <link href="http://v2.engine.arcology.garden/updates#20230614T120809.393684"/>
    <id>urn:uid:20230614T120809.393684</id>
    <published>2023-06-14T12:08:00Z</published>
    <updated>2023-06-14T12:08:00Z</updated>
    <content type="html">&lt;article&gt;&lt;h1 id=&quot;20230614T120809.393684&quot;&gt;I am starting to experiment with a rust rewrite of the &lt;a href=&quot;/404?node=arcology/arroyo-page&quot; class=&quot;unpublished&quot;&gt;Arroyo Arcology Generator&lt;/a&gt; &lt;/h1&gt;&lt;p&gt;See: &lt;a href=&quot;//code.rix.si/rrix/arcology-rust-extractor/src/branch/main/src/main.rs&quot;&gt;arcology-rust-extractor&lt;/a&gt; for the prototype work
&lt;/p&gt;&lt;p&gt;It&amp;#39;s time to start learning &lt;a href=&quot;//v2.cce.whatthefuck.computer/rust&quot;&gt;Rust&lt;/a&gt; in earnest. The biggest wart on the side of &lt;a href=&quot;//v2.whatthefuck.computer/arcology&quot;&gt;The Arcology Project&lt;/a&gt; has been the &lt;a href=&quot;/404?node=arcology/arroyo&quot; class=&quot;unpublished&quot;&gt;Arcology Arroyo System Database Generator&lt;/a&gt; just being a big old &amp;quot;inotify watches for files and shells out to Emacs to build the database&amp;quot; process. I&amp;#39;ve really wanted to rewrite this for a while but basically only fell short on the lack of a featureful &lt;a href=&quot;//v2.whatthefuck.computer/org-mode&quot;&gt;org-mode&lt;/a&gt; parser in a language i&amp;#39;m willing to write.
&lt;/p&gt;&lt;p&gt;My most recent investigation lead me to &lt;a href=&quot;//docs.rs/orgize/latest/orgize/index.html&quot;&gt;Orgize&lt;/a&gt;, a Rust parser which supports all the things I need. So I&amp;#39;m going to start experimenting with building out a thing that generates the database schema in an incremental fashion. Orgize also has some support for customized HTML generation, which is the other big bug-bear in the system, relying on Pandoc to generate base HTML and then modifying that big string with regular expression matches. This whole system could be replaced with a customized Orgize &lt;code&gt;HtmlHandler&lt;/code&gt; and this excites me.
&lt;/p&gt;&lt;p&gt;In &lt;a href=&quot;/404?node=20230613T110608.355392&quot; class=&quot;unpublished&quot;&gt;Faster Arcology DB Generation&lt;/a&gt; I work through how I would re-architect this system, but I think I am pretty happy with just moving forward on a thing that parses all the org-mode files and spits out a sqlite DB with &lt;code&gt;rusqlite&lt;/code&gt;.
&lt;/p&gt;&lt;p&gt;One thing that is maybe a cursed idea that I have been having is to move away from using &lt;code&gt;inotify&lt;/code&gt; and to tightly couple the design of the Arcology backend to &lt;a href=&quot;//v2.cce.whatthefuck.computer/syncthing&quot;&gt;Syncthing&lt;/a&gt;. I think SyncThing really is the bees&amp;#39; knees, and I&amp;#39;ve felt for a while that it wouldn&amp;#39;t be such a bad idea to have a hard dependency on SyncThing&amp;#39;s API: &lt;a href=&quot;//docs.syncthing.net/rest/events-get.html&quot;&gt;&lt;code&gt;GET /rest/events/disk&lt;/code&gt;&lt;/a&gt; gets me all the file monitoring I could desire with none of the jankiness of dealing with invalid file descriptors from the whole POSIX thing.
&lt;/p&gt;&lt;p&gt;This model leaves room too to set up &lt;a href=&quot;//github.com/rusterlium/rustler&quot;&gt;Rustler&lt;/a&gt; to make the eventual &lt;a href=&quot;//v2.whatthefuck.computer/arcology#20220625T151007.001898&quot;&gt;Arcology Elixir&lt;/a&gt; even smoother, where the Rust process is tightly integrated in to the Elixir system passing data structures between the two processes using &lt;code&gt;serde_rustler&lt;/code&gt; and constraining &lt;strong&gt;all&lt;/strong&gt; database logic within the Elixir process.
&lt;/p&gt;&lt;p&gt;At a certain point I have to start wondering whether the whole site should just be a Rust process, though...
&lt;/p&gt;&lt;/article&gt;</content>
  </entry>
    <entry>
    <title>Added some simple JavaScript to my sites&#39; pages to disable some of the CSS</title>
    <link href="http://v2.engine.arcology.garden/updates#20230321T002142.464959"/>
    <id>urn:uid:20230321T002142.464959</id>
    <published>2023-03-21T00:21:00Z</published>
    <updated>2023-03-21T00:21:00Z</updated>
    <content type="html">&lt;article&gt;&lt;h1 id=&quot;20230321T002142.464959&quot;&gt;Added some simple JavaScript to my sites&amp;#39; pages to disable some of the CSS&lt;/h1&gt;&lt;p&gt;Some folks react really viscerally to &lt;a href=&quot;//v2.cce.whatthefuck.computer/vulfpeck&quot;&gt;Vulf Mono&lt;/a&gt; Italic -- I think it&amp;#39;s pretty funny. This is the font I look at every day in my Emacs environment, so having it on the web feels natural. I think it&amp;#39;s a fun font and pretty good for prose with the benefit of also being monospace for showing code or doing weird typographic tricks in &lt;a href=&quot;//v2.rix.si/poetry&quot;&gt;My Poetry&lt;/a&gt;.
&lt;/p&gt;&lt;p&gt;Anyways, I added a checkbox to the bottom of the pages which will disable a bunch of the CSS and persist it to each of the &lt;a href=&quot;/404?node=20211219T144255.001827&quot; class=&quot;unpublished&quot;&gt;Arcology Sites&lt;/a&gt;&amp;#39; browser Local Storage. you&amp;#39;ll have to set it on each site, but chances are folks won&amp;#39;t be exploring my sites if their first reaction is &amp;quot;god i cannot stand this person&amp;#39;s taste&amp;quot;.
&lt;/p&gt;&lt;p&gt;have a good day!
&lt;/p&gt;&lt;/article&gt;</content>
  </entry>
  </feed>