these are the feature set i want to replicate with the Arcology Project. i've clobbered these things together over a decade in elisp and python but want a steady mobile system that i could take the International Trip with.
org-mode features
org-mode is a text editor plugin with features:
file-level key value metadata
heading-level key value metadata
headings have tags
links to files or ids
or other extensible targets
headings can have todo state, priority, schedule, deadline dates
query and generate agendas
calendar view
repeating tasks and habits
time tracking and pomodoro timing
text markup ... bold italic
codeverbatim_underline_, linksquickly capture notes with templates
capture by sharing url to emacsclient
capture by sharing a file to emacsclient
capture with form-filling
tables with formulas
source code snippets with
metadata attached to the source like language, target file, literate programming variables (built from tables or text references)
various extensions we might implement
org-fc flashcard/spaced repetition with multiple card types, cloze doubble side single side
org-transclusion include file/heading/text content from other files with #+INCLUDE syntax
GOAL: a shared document parsing library which can implement the features below
implementation decision: parser architecture
*language: kotlin multiplatform for native android performance and cross-platform capability - approach: pure kotlin implementation avoiding rust ffi complexity for ast manipulation - priority features*: core org-mode syntax, tables (for existing flashcard data), arcology keywords, org-fc cloze
org-roam features
an extension org-mode where every heading with an ID property in every file in the org-roam directory will be treated as a node, a small piece of data. org-roam focuses on granular nodes, and the zettelkasten slipbox method of creating fleeting notes in the journal and slowly accreting those in to evergreen notes using interstitial journaling, perhaps resurfacing stub or incomplete nodes automatically
take a directory of org-mode files and see which have not been index or have been modified.
extract metadata from them to sqlite:
CREATE TABLE files (file UNIQUE PRIMARY KEY, title , hash NOT NULL, atime NOT NULL, mtime NOT NULL);
CREATE TABLE nodes (id NOT NULL PRIMARY KEY, file NOT NULL, level NOT NULL, pos NOT NULL, todo , priority , scheduled text, deadline text, title , properties , olp , FOREIGN KEY (file) REFERENCES files (file) ON DELETE CASCADE);
CREATE TABLE aliases (node_id NOT NULL, alias , FOREIGN KEY (node_id) REFERENCES nodes (id) ON DELETE CASCADE);
CREATE TABLE citations (node_id NOT NULL, cite_key NOT NULL, pos NOT NULL, properties , FOREIGN KEY (node_id) REFERENCES nodes (id) ON DELETE CASCADE);
CREATE TABLE refs (node_id NOT NULL, ref NOT NULL, type NOT NULL, FOREIGN KEY (node_id) REFERENCES nodes (id) ON DELETE CASCADE);
CREATE TABLE tags (node_id NOT NULL, tag , FOREIGN KEY (node_id) REFERENCES nodes (id) ON DELETE CASCADE);
CREATE TABLE links (pos NOT NULL, source NOT NULL, dest NOT NULL, type NOT NULL, properties NOT NULL, FOREIGN KEY (source) REFERENCES nodes (id) ON DELETE CASCADE);provide UI for:
quickly capture notes and URLs to my daily journal
quickly search for node by title, alias or URL
show references with backlinks or unlinked bm25 keyword search
graph view to visualize node relationships
nodes can have aliases and URLs
move nodes around, extract heading to separate file and refile in to another file under a different node
GOAL: an android app that serves this UI comfortably with up to 5000 files and 50000 headings, a database abstraction that can be used by the server and CLI
implementation decisions: mobile and sync
*sync protocol: syncthing api integration - conflict resolution: leverage syncthing's built-in conflict files, build resolution ui later or use emacs ediff - performance target: 500ms search response time (faster than existing android apps) - offline capability: full offline operation with eventual sync - data model: sqlite with org-roam schema plus arcology extensions (heading_properties, file_properties) - id generation*: timestamp-based ids (20251212T231404.213411) for compatibility
arcology features
arcology publishes any org-roam heading and its subchildren to a URL, the URLs can be on a few domains
adds a few tables to the org-roam schema:
CREATE TABLE heading_properties (node_id NOT NULL, key text, value text)
CREATE TABLE file_properties (file NOT NULL, key text, value text)these are used to derive further schema allowing one to:
publish a page/heading and its subheadings to a URL
add a property to a heading to expose that heading and its children at a good URL
multi-domain support, the same org roam repository can publish to multiple sites, and pages can link to pages on other sites
id link rewriting, id links ought point the cross-domain url
drawer hiding so that property drawers and org-fc state tracking drawers are not visible on the web
rss feed publishing
org-fc cloze rewriting so that the text is legible on the web
navigation:
backlink and reference navigation
rendered inline with the heading the backlinks link to, rather than on a sidebar or at the bottom of the page
sitemap graph navigation
by published URL, not necessarily by heading like the org-roam one
tag map
keyword/value/file search features
heading properties
attachment crunching
New ideas
expiring links, publish a journal page for 1 hour or 1 day or 1 month system using webmention/bridgy/etc
use org-transclusion syntax to prepare an Atom feed/page with headings transcluded from other parts of the graph
crossposting daemon
post links to pages sometimes
email pages to certain groups when new pages are detected
webmention support
Publish headings to long-term fediverse threads
record replies and interactions to org-mode file to be processed as tasks
keywords:
| ARCOLOGY_FEED | Add a route that will generate an Atom feed for this page |
| ARCOLOGY_KEY | Add a route that will generate an HTML page for this page |
| ARCOLOGY_PAGE_TEMPLATE | Arcology Page HTML Template override |
| ARCOLOGY_ALLOW_CRAWL | Whether the Arcology page will be marked as allowed in robots.txt |
| ARCOLOGY_TOOT_VISIBILITY | This is set to an Mastadan API visibility mode like "public" or "unlisted" |
| AUTHOR | Used to populate the author in RSS feeds and page metadata |
GOAL: a web publishing binary that can be pointed at an org-roam directory and serve those pages on all their relevant domains
implementation decisions: web publishing
*architecture: lazy rendering with hash-based cache invalidation - routing: ARCOLOGY_KEY property format "SITE/path/in/url" maps to domain routing - rendering strategy: render on-demand when content hash changes, cache rendered output - multi-domain*: single org-roam repo serves multiple sites via SITE mapping
arroyo features
arroyos are seasonal waterways in the southwest of America. They are like wadi or washes. They flow seasonally.
Arroyo systems are like that. Most arroyos are ecosystems, this one is a technical system. An ecosystem flows seasonally and goes in to hibernation when waiting for time or need, conserving energy. I used to live backed up to one. Usually they were highways for small animals and birds, coyotes and young boys.
Arroyo systems have flash floods, bursts of focus or inspiration, an infusion of resources and attention that slips away quickly. My computers work the same way they always do, until they need to change and have the resources to do so.
Then I have to remember what I was doing and how to do that. That's what the concept operating system aims to fix.
Arroyo systems are literate programming projects built on top of org-babel that force you to read and keep good documentation to work with the code and allow you to spread those docs across files and organize them as you please. It's a slow ecology of software that accretes over seasons. During the spring and summer we manage orchards, in the fall we harvest and process, in the winter we hack.
They are alluvial, ideas spread downstream and are carried back up.
"tangle" all the org-mode files that this literate programming project use
generate Nix system module import lists from key/value metadata in org-roam headings
home-manager too
"this nix system should only have nix modules tagged for running on my wobserver"
"this nix system should exclude anything related to programming and only include my task management systems"
generate emacs lisp init files similarly
"this heading has an emacs lisp init block that is saved to <arroyo/files/init/org-roam.el>"
"this file has to be loaded after org-mode.el"
generate python or toml or whatever other configuration syntax using human-legible tables
edit a table and recompile the page to change your system keybindings
edit a table and recompile the page to add new features to your website
keywords:
| ARROYO_EMACS_MODULE | Instruct The Arroyo Generators to include an Emacssnippet in the init. |
| ARROYO_HOME_MODULE | Instruct The Arroyo Generators to import the referenced home-manager module |
| ARROYO_NIXOS_MODULE | Instruct The Arroyo Generators to import the referenced nixos module |
| ARROYO_HOME_EPKGS | Instruct The Arroyo Generators to make a custom Emacs-Lisp package available to Arroyo Emacs |
| ARROYO_MODULE_WANTS | Define a dependency relationship with the referenced org-roam document (this doc depends on that) |
| ARROYO_MODULE_WANTED | Define a dependent relationship from the referenced org-roam document (that doc depends on this) |
| ARROYO_SYSTEM_ROLE | Constrain the Nix expressions on the page to only load in this role (can be specified repeatedly) |
| ARROYO_SYSTEM_EXCLUDE | Prevent the Nix expressions on the page from loading in the listed role (can be specified repeatedly) |
| ARROYO_DIRENV_DIR | Load direnv from a different directory than the loaded buffer's directory. Useful for Org Babel. |
| ARROYO_TANGLE_THIS | When arroyo-flood is called, these files will be tangled. |
*GOAL: a command-line tool which can be run from within Emacs to query the database
implementation decisions: development process
*repository structure: single monorepo with modules (not maintaining apis for external users) - testing strategy: comprehensive core library testing (parser, database), selective integration testing - ai-assisted development: extensive unit tests and property-based testing - release management: single version number across all components - focus areas*: parser edge cases, database layer, web publishing routing, key workflows
arcology2go user stories
imagine a self-contained, miniaturized multidimensional tree of your digitized thoughts and feelings and actions. the tree grows chronologically but also orthogonally off of other roots in to other directions of light and attention. tools to work with your thoughts, mix and match them, distill and share them broadly. synced between your devices, available offline, seamless sync to your server node and publishing environment.
In nature, as an organism evolves it increases in complexity and it also becomes a more compact or miniaturized system. Similarly a city should function as a living system.... Arcology recognizes the necessity of the radical reorganization of the sprawling urban landscape into dense, integrated, three-dimensional cities in order to support the complex activities that sustain human culture. The city is the necessary instrument for the evolution of humankind.
: Paolo Soleri, introduction to Arcology
these are aspirations, not launch requirements!
use case: the international trip
The International Trip is some microficton I wrote a decade ago. hypertextual object store w/ geospatial capabilities and offline queued publishing.
use case: modern input methods for capture and recall
an android app with a speech input; a tablet app with a pen input & handwriting recognition; something i could give my loved ones without inflicting them with Nix and Emacs. I want to complete The International Trip...
use case: space repetition study
not just for code monkey.... take notes and remember them. write anki files or at least have spaced repition of headings:
question
a side
b side
or
question
answer
where a and b can still be anywhere else in the graph, part of notes on an essay you read on the web... the question heading carries metadata about the anki stage, due date, etc... the UIs i build need to have this sort of "card-like" view of a heading graph, it's not only "document with subheadings", but it's things like cards or slide decks with embedded metadata.
use case: replacing org-babel and org-export
code is data, some data is knowledge
~ from logseq for code management
this object graph needs to be able to contain its own source code as well as my "concept operating system" the complete computing environment document publishing system, my other projects as well.
the code in the documents will be extracted to disk to a Nix monorepo and to project git repositories; maybe it's packaged up and ready to be deployed; perhaps it's even one programming language executed in a sandbox with the results embedded in the code of a different programming language. literate programming ... document metaprogramming ... i want to query the document tree for all the nix files tagged to run on my laptop and put them in my laptop's flake.nix nixosModules section. I want to generate configuration files for my computers using spreadsheet-style tables.
use case: Concept Operating System
Remember your code, remember your todo list, tie in your references and documentation.
A meta-programmable lab notebook or journal
use case: publishing
this whole arcology project started because i wanted to be able to take one of those objects i mentioned at the top and make a URL on the web for it. publishing is important to me even if no one reads my work and it's not compelling to most folks.
an important part of the arcology user experience is that it is a "sync to publish" system, not a web composer, not a git checkin system, certainly not a local static site generator. you save a lightly marked up text file to local disk with some metadata (such as url, theme, federated crossposting details, rss metadata etc) and it appears on the web. syncthing and its api are rad. i would build on top of it again.
the site likely has some dynamic system pages, interactives, comment boxes, page load counters, etc., but data that will be written to. but much of it can either be pre-rendered or rendered on first load and cached... hmm. (in the CAS???) no i want some sort of sqlite sidecar database thingy based on the markdown ... some day sqlite table <-> markdown table sync... i want to capture comments and page counters and provide little interactives...
idealistic bullshit: how could parts of the raw graph and node history be synced between family members or friends? could i just share part of my graph with you and have those appear under your "new stuff from friends" heading? could rss or email be also ingested in this way? oh no what have i done? could i synthesize filtered graphs and export those for sync or public consumption/import in to their graph?
how does activitypub or atproto fit in to this thing?
is it a bonfire server or a bluesky pds or a mastodon API client?
use case: langle manglers and agentic clankers
i was careful i didnt say anything about agentic generative conversational etc etc chatbot interfaces ... right now markdown is surging as a sort of lingua franca of the web alongside html so that clankers can burn less electricity reading your stuff. those guys love spitting out markdown.
this document tree could be used to generate branching chat conversations if you really wanted it to... ask your langlemangle to summarize a list of documents you transclude in to a context window and use that as a summary at the top of it or in your social media marketing or spam operation. ask it to text your mom every time you post a pic of your kid, i dont care. have it read your journal and ask it to dissect your follies and initiate ideal parent protocols. doesnt really excite me right now.
the text embedding stuff, semantic vector search and n-nearest-neighbors searches, generating patterned documents like those anki cards based on others youve made. probably useful, lightweight, attainable. useful to let the bicycle of the mind freewheel sometimes, but it's important to understand the limits of generative interfaces and their uses, and to look past generative systems toward other uses for all the GPUs lying around.