Νόμιsync Personal Accounting System Design
Introduction
One more personal accounting system. Not even locked to any finance tracking, you can keep any virtual points on bonuses. The system just keeps a track of numbers so your νόμισμα is always in sync.
Background
Features
[X]Self-hosted support[X]Multi-user[ ]Shared accounts[ ]RBAC[ ]Client-Server[ ]Standalone[X]Multi-currency[X]Double book-keep[X]Splits[X]Online integration[ ]ofx/qif import/export[ ]receipt recognition[ ]web/cli/mobile/desktop[ ]rules/schedule/scripts[ ]crypto integration[ ]smart contracts[X]account tree[X]tags[ ]inbox[ ]egui-based UI
Key points
Double entry bookkeeping
That's the common ground for any reasonable financial accounting: there's no reason not to use the system which worked perfectly since the XIV century.
Absolute accuracy
The system uses rationals to store all the finance information: that's not a unique feature but this allows to avoid any rounding and loosing even the smallest fraction of your asset in accounting.
This is especially important when working with modern crypto-currencies which use tiny fractions as minimal values. You'll never have your gas Ethereum gas payment mismatch in the report.
Native multi-currency support
Many accounting systems support multiple currencies and currency conversions, but unfortunately the implementation is not always perfect: usually the user has to choose a "base currency" and all the rest of computations is done based on it. But now in the era of travels and even some special user categories like digital nomads the multi-currency should be implemented in a way that allows switching a base currency any time.
The second point here is decentralization: crypto-currencies, international brokers, investments into assets all over the world using different ways is a usual situation, so all these assets must be handled appropriately.
Easy-to-use tag system
There is a tagging system that allows an accounting configuration of arbitrary flexibility: bills, categories, users, comments, any marks. You define your way to go with finance.
WASM-based scripting
The universal bytecode and simple API allow you to manage your finances the way you like with just a simple combination of tag and script.
Automatic categorization, automated bill payments' accounting, automated budgeting, and so on. Scripts can be written in Rust using the SDK or in NomiScript, a Lisp dialect with exact rational arithmetic and a native entity API (design notes).
Usage
Run
For running use:
cargo run -- --loglevel Debug -d 'postgres://ray@localhost/nomisynctestdb' --setopt locale=en
SSH access
nomisync-sshd drops a connected user straight into the TUI over SSH.
See doc/sshd.org for the operator guide (first-run host-key setup,
adding user SSH keys, hardened systemd unit, external exposure).
Changelog
All notable changes to this project will be documented in this file.
[unreleased]
🚀 Features
- (db,config) Add sqlx and i18n
- (db) Add support for actual db
- (sqlite) Force the connection pool to work
- (config) Add ConfigOption support
- (config) Make configuration storage work
- (config) Load locale from configuration
- (db) Add pool configuration
- (cli) Add cli create and move the server to lib
- (sql) Init the tables for finance
- (finance) Add account, commodity, and transaction
- (web) Add web server
- (web) Fix the login process
- (scripting) Add wasm-based scripting
- (scripting) Migrate from Wasmer to WasmTime
- (finance) Add builder to Account
- (scrtiping) Add string-based interaction with WASM
- (finance) Add Tag support
- (server) Add commoditytags support
- (server) Implement getting tags for commodity
- (scripting) Add tag export to scripts
- (build) Add Dockerfile and Drone config
- (web) Enable logging
- (build) Pull cache explicitly
- (doc) Render the disdoc into html and publish it
- (finance) Add createtransaction
- (finance) Add TransactionTicket and DB management
- (finance) Add Split insertion for Transaction
- (finance) Add single-currency Transaction support
- (web) Add /api/version endpoint
- (finance) Support the multi-currency transactions
- (finance) Add Split::commit()
- (finance) Add Tag::commit()
- (server) Add Command and infrastructure
- (build) Add check to Drone pipeline
- (cli) Add first simple UI
- (cli) Show logs in UI
- (cli) Add param completion
- (cli) Add first command
- (cli) Add working /config/get
- (server,cli) Add SetConfig
- (cli) Add Version command
- (cli) Fix part of backspace processing
- (server) Add GetVersion command
- (command,cli) Add selcol command for debug
- (server) Add CommodityCreate command
- (cli) Add CommodityCreate command
- (server) Add support for returning finance entities
- (server,cli) Add ListCommodities and CliListCommodities
- (cli) Add support for quotes in parameters
- (server) Add CreateAccount and ListAccount
- (web) Add CommodityList support
- (server) Migrate the TaggedEntities to HashMap
- (cli) Add CliAccountCreate command
- (cli) Add Commodity completion for Accounts
- (server) Add CreateAccount internals
- Add placeholder comment for implementing CliAccountList command
- Implement CliAccountList for listing accounts
- (cli) Add ListAccounts
- Add placeholder comment for implementing accounttable function
- Implement accounttable handler with template and view logic
- (web) Add Accounts listing
- Add CreateTransaction command with split handling
- Implement CreateTransaction command with split creation and test
- (cli) Add Transaction creation
- Add Transaction listing support
- Add optional note for CreateTransaction
- (server) Add ListSplits command
- (cli) Add /account/balance command
- (web) Add balance to account listing
- (server) Add UserContext
- (web) Add favicon
- (web) Implement Commodity creation and listing
- (web) Implement Account listing and creation
- (web) Add index page
- (web) First attempt to add transaction
- (web) Fix the Transaction and Account listing
- (web) Add Account listing to the Transaction list
- (build) Update Rust to 1.86
- (web) Add check for currency in transaction creation
- (web) Add currency conversion support
- (web) Add home link to all pages
- (web) Migrate to JWT user handling
- (macro) Implement first args macro version based on HashMap
- (macro) Implement the compile-time checking macro
- Migrate to commodity-free accounts
- Support multi-currency balances
- (web) Redirect to login page on token expiry
- (db) Support tags tagging
- (web) Pretty-print the balance on the main page
- (server) Add the UpdateTransaction command
- (web) Support transactions editing
- (server) Add DeleteTransaction command
- (web) Add the Delete link for transaction
- (web) Add tag management page
- (web) Add transaction tag management
- (web) Add autocompletion for transaction tags
- (web) Add split tag management
- (script) Add the script infrastructure
- (server) Apply scripts on CreateTransaction
- (web) Add script management functions
- (server) Suuport pagination
- (web) Support pagination
- (web) Migrate from js to wasm
- Add nomiscript
- (nomiscript) Add nms as interpreter
- (nomiscript) Beautify error reporting
- (nomiscript) Setup the compiler scaffolding
- (nomiscript) Support GC and add revision
- (nomiscript) Support strings
- (nomiscript) Support symbol resolution
- (nomiscript) Add debug logging
- (nomiscript) Support variadic functions and add +
- (nomiscript) Support special forms
- (nomiscript) Support math and comparisons
- (nomiscript) Fix nested calls
- (nomiscript) Add let/let*
- (nomiscript) Add if
- (nomiscript) Add cond
- (nomiscript) Add do/do*
- (nomiscript) Add initial macro support
- (nomiscript) Support quasiquote syntax for macros
- (nomiscript) Support labels
- (nomiscript) Add the standard library
- (nomiscript) Add car and cdr
- (nomiscript) Support entities input and output
- (server) Add initial reporting support
- (nms) Support run-time values printing
- (web) Support filters
- (web) Support account management
- (web) Support account renaming
- (server) Pass split tags through scripting pipeline
- (nomiscript) Integrate anodized for design-by-contract specs
- (nomiscript) Add WasmRuntime type and WasmGC ratio infrastructure
- (nomiscript) Add dual-mode runtime codegen infrastructure
- (nomiscript) Add WasmLocal variables for LET/LET* runtime bindings
- (nomiscript) Add runtime DO/DO* loops, SETF, and WasmLocal serialization
- (nomiscript) Complete runtime entity API with WasmGC cons cells and output
- (nomiscript) Add entity API, runtime output writer, and string support
- (server) Add debug logging for script entity processing
- (report) Generalize IE into ActivityReport + add CategoryBreakdown
- (web/frontend) Add WASM report controls for tree collapse + column sort
- (plotting) Scaffold crate with ChartSpec IR
- (plotting) Implement view-to-spec adapters for 3 reports
- (plotting) Implement SVG renderer
- (plotting) Implement ratatui renderer wrapper
- (plotting) Implement canvas renderer for WASM
- (web/report) Add /api/report/*/chart.{svg,json} endpoints
- (web) Canvas renderer for report charts
- (report) Add sortorder to Balance — table + chart agree
- (cli) Reports command group renders charts as text
- (plotting) Kitty graphics protocol renderer
- (tui) Multi-frame interactive TUI with modal overlays and vim/emacs editor
- (server) SSH key registry + shared Argon2 verify, wired into CLI
- (sshd) Nomisync-sshd daemon with rate-limited auth and request filtering
- (schema) Canonical tag rows via UNIQUE(tagname, tagvalue)
- (ci) Enable sshd
- (sshd) Password-once gate, tighter rate limits, ssh-copy-id intercept
- (web) Self-service SSH key management page
- (tui) Transport passthrough hook for kitty graphics + clientterm
- (sshd) Drive nomisync-tui over the russh channel (+kitty graphics)
- (nomiscript) First-class Value::Bytes + #u8/#" reader literals
- (nomiscript) Canonical formatvalue printer with size-aware bytes
- (rpc) New transport-agnostic crate with framing + envelope
- (rpc) Session evaluator with cooperative interrupt handle
- (rpc) Wasmtime engine + module-run primitive with fuel and epoch
- (rpc) Per-domain register fn shape + link aggregator
- (scripting) Eval-mode capture protocol shared by all eval consumers
- (nomiscript) CompileMode::Eval emits nomi-eval + capture call
- (rpc) Session evaluates via wasmtime through nomi-eval capture
- (rpc) First real natives — rpc-protocol-version + rpc-session-user-id
- (nomiscript,rpc) Caller-supplied HostFnSpec dispatch in eval mode
- (scripting) EvalValue::Bytes capture for compound native results
- (rpc) First server-command natives — get-version + get-build-date
- (rpc) Owned tokio runtime drives async server::command::* futures
- (server) Test-utils feature exposes DBPOOL injection to integration tests
- (rpc) List-accounts native — first DB-touching server-command binding
- (tests-integration) Workspace crate for DB-touching integration tests
- (rpc) List-commodities native + per-command S-expr marshaller
- (rpc) List-transactions native (no-arg form) + pagination shape
- (rpc) List-ssh-keys native + SshKeyRecord S-expr marshaller
- (scripting,rpc) StringRef host-fn args via capture queue + get-commodity
- (rpc) Get-account native via UUID-or-name dispatch
- (rpc) Get-transaction native via UUID arg
- (nms) –rpc-user flag routes forms through rpc::Session
- (rpc) User-has-ssh-key native (bool return shape)
- (rpc) Get-balance native via UUID arg with single+multi-currency
- (rpc) Get-account-commodities native via UUID arg
- (rpc) Get-config native via name arg
- (rpc) Lookup-user-by-ssh-key native via fingerprint arg
- (rpc) List-splits native (account-scoped) + Split marshaller
- (rpc) Remove-ssh-key native — first write op via fingerprint arg
- (rpc) Set-config native — first multi-arg StringRef consumer
- (rpc) Create-commodity native — 2-arg write returns new entity UUID
- (rpc) Set-account-tag native — first 3-arg StringRef write
- (rpc) Create-account native — single-arg write returns new UUID
- (rpc) Verify-user-password native — first user-domain wrapper
- (rpc) List-accounts-for-manage native + tree marshaller
- (rpc) Get-account-for-manage native — closes account domain
- (rpc) Delete-transaction native via UUID arg
- (rpc) Balance-report native — first report-domain wrapper
- (rpc) Activity-report + category-breakdown natives (date-range args)
- (rpc) Create-transaction native — S-expr payload + balancing splits
- (rpc) Update-transaction native completes P3 registry
- (rpc) Account-count native — first composable i32 return + type-sep test
- (scripting,rpc) Eval-mode ConsRef capture — first P3a sub-slice
- (rpc) Get-balance surfaces CmdResult::Rational as native EvalValue::Ratio
- (scripting,rpc) Wrapsratio HostFnSpec convention + composable account-balance
- (scripting) Commodity numeric type plumbing (P3b sub-slice 1a)
- (scripting,rpc,server) Commodity arithmetic + convert-commodity (P3b 1b-1d)
- (scripting) Introduce $pair WasmGC type + anyref accessor (P3a 3a.1)
- (scripting) Retire $cons + unify lists onto $pair (P3a 3a.2)
- (scripting) Per-element pair-car capture printers (P3a 3a.3)
- (scripting) EntityRef WasmType + entity wasm structs (P4 A2.a)
- (scripting) Nomientityaccessors! macro + typed accessors (P4 A2.b)
- (scripting) Allocpairchain host helper (P4 A3)
- (rpc) Typed returns for single-record host fns (P4 A4)
- (rpc) Typed-entity pair returns for list/get natives (P4 A5)
- (rpc) Typed StringRef returns for reports + retire selfcaptures (P4 A6.a)
- (scripting,rpc) Args ride wasm signature, retire capture-arg queue (P4 A6.b)
- (scripting,rpc) Nomi-eval returns anyref; capture protocol retires (P4 A6.c)
- (sshd) Wire nomisync-eval subsystem to rpc::Session
- (emacs) Nomisync.el client v1 — connect, eval, list-accounts
- (nomiscript) PP + APROPOS builtins (plan phase 6)
- (nomiscript) Self-hosted test framework v1 — DEFTEST/ASSERT-EQUAL/RUN-TESTS
- (nms,emacs) Phase 8 — inline kitty graphics + emacs chart insertion
- (rpc) Phase 4 — pre-compile zero-arg host fn stubs at Session startup
- (nms) –test PATH subcommand for self-hosted test runner
- (rpc) EpochBumper for mid-eval cooperative cancel (P8a-1)
- (nms,scripting) –profile jitdump/perfmap subcommand (P8a-2)
- (nomiscript,nms,rpc) (coverage-dump) + nms –test –coverage (P8a-3)
- (sshd,emacs) C-g cancel mid-eval via ETX byte (P8a-4)
- (rpc) Emit-bindings codegen + A1 invariant tests
- (nomiscript) P4 A6.b typed reports + fix nullable host-fn cast
- (rpc) Structured commodity-mismatch / no-conversion trap codes
- (nomiscript) Tier 1 error-processing — (error 'code "msg")
- (scripting) Enable funcref + registerfunction returns idx
- (nomiscript) Captures analysis + Gap A FUNCALL/APPLY at stack pos
- (nomiscript) Tier 1.5 Gap B — detect recursive runtime-arg defun
- (nomiscript) Closure debug serializer + LAMBDA value-position emit
- (nomiscript) Lift v1 captures restriction via per-scope env-struct
- (nomiscript) Runtime-closure dispatch via callref
- (nomiscript) Tier 1.5 Gap B — runtime-call path for recursive defuns
- (nomiscript) MAP runtime paths + REVERSE codegen
- (nomiscript) FILTER + FOLD natives with three lowering paths
- (nomiscript) BLOCK / RETURN-FROM lexical labelled exits
- (nomiscript) TAGBODY / GO lexical labelled jumps
- (scripting) Tier 2 spike — re-entrant funcref + ADR-0025
- (nomiscript) PairElement::AnyRef heterogeneous fallback (ADR-0025)
- (scripting) Tier 2 (catch-each) — iteration-bounded recovery
- (scripting) Set/get split-tag + transaction-tag natives
- (scripting) Tier 3.1 — wasm-exceptions foundation gate
- (scripting) Tier 3.2 — (error) lowers to throw $nomierror via boundary shim
- (nomiscript) Tier 3.3 — (handler-case) + condition accessors
- (nomiscript) Tier 3.4 — (unwind-protect) with full unwind semantics
- (nomiscript) Tier 3.4 — engine-error bridge + error-handling docs
- (nomiscript) WasmType::Bool — runtime booleans serialize as Nil/Bool
- (nomiscript) DOLIST stack value, equality/list/io natives, side-effect & null fixes
- (nomiscript) ADR-0028 B+C bridge natives + strata bug fixes [WIP]
- (nomiscript) ADR-0028 Commit D — `%` reader sugar
- (nomiscript) ADR-0028 E0 — widen $commodity with a unit-term field [WIP]
- (nomiscript) ADR-0028 E1+E2 compound money + tag-sync cascade + HOF closure typing
- (nomiscript) Inline capture-free closures in FOLD over non-Ratio lists
- (nomiscript) SPLIT-ACCOUNT-NAME accessor + transit-category script; unify output writers on a single runtime append protocol
- (rpc) Add list-splits-by-transaction native
- (nomiscript) First-class colon namespaces in the reader (ADR-0029)
- (nomiscript) Strict lexical namespace resolution (ADR-0029)
- (nomiscript) Two-layer auto-loaded prelude library (ADR-0029)
- (nomiscript) Metro sample uses the split:list-for-transaction prelude helper
- (nomiscript) Typed WasmIds index handles + eval-mode env.log
- (nms) SLY integration via a minimal SLYNK server
- (nms) SLY load-file + user-mode DB; root-cause interrupt model
- (nms) SLY symbol completion (mREPL TAB)
- (nms) Support verbose entity printing
- (tui) Add rpc/scripting deps and Console tab variant
- (tui) Console state, form buffering, formatresult seam, bounded scrollback
- (tui) ConsoleEval actor with rpc-envelope wrapping
- (tui) Attach console eval to App, drain in runloop
- (tui) Console keymap and event routing
- (tui) Render the console tab
- (tui,sshd) Attach real console eval at entry points
- (nms) Add –ssh client for the nomisync-eval subsystem
- (server) Provision a per-user database on user creation
- (server) Generate and store per-user JWT keypairs
- (web) Sign JWTs with per-user keys, retire the global signing key
- (server) Isolate config per user; case-insensitive uniqueness
- (server) Generalize scripts store into tag-defined artifacts
- (rpc) Render-only template engine with dual-gated native surface
- (web) Transaction template UI + create-page prefill
- (templates) Get-commodity symbol lookup + template test endpoint
- (template) Per-split tags via draft-split-tag handle
🐛 Bug Fixes
- (main) Stop translating db request
- (server) Update config sql queries
- (finance) Remove quantity from split as not needed
- (scripting) Export functions via linker
- (server) Detect a dockerized build and don't try to run emacs
- (scripting) Enable tags usage and update from the WASM scripts
- (build) Set up correct caching in Dockerfile
- (build) Fix path to static files in docker
- (web) Fix the build error related to Path conversion
- (web) Fix build by removing unneeded import
- (web) Remove logger to prevent conflict
- (build) Add docker socket to build step
- (web) Fix the web page to match with handler
- (hook) Add .sqlx directory on commit
- (web) Check the Redis connection on start
- Cleanup the Account type to get rid of links
- Cleanup the Split type and migrate it to Uuid
- Cleanup the Price and the rest of dependent types
- Add Trasaction creation process
- (server) Migrate to UserPool instead of UserContext
- (cli) Fix the cli commands to create accounts and transactions
- (web) Fix the multi-split transactions
- (web) Fix the transaction split validation
- (web) Fix the js to tag transactions correctly
- (web) Fix the toaccount correct setup
- (web) Correct transaction editing and multi-commodity ones
- (web) Correct the time in Transaction Edit page
- (nomiscript) Fix the fields to compile
- (nomiscript) Restore the WASM compilation
- (nomiscript) Support mapc* macros
- (ui) Remove the approximations in transaction sums
- (web) Transaction edit support for tags
- (web) Support mobile browsers
- (nomiscript) Remove unused entitycount accessor from OutputSerializer
- (build) Load org-babel backends for disdoc.org export
- (nomiscript) Long loops compilation
- (scripting-sdk) Bounds-check slice access in InputReader::entity
- (scripting) Add epoch interruption to prevent runaway WASM scripts
- (server) Run scripts in spawnblocking and skip failing scripts
- (nomiscript) Compile user-defined function calls for side effects
- (nomiscript) Filter out system "note" tag in tag-sync script
- (scripting) Enable WASM GC in default ScriptExecutor engine
- (nomiscript) Generate correct uuids
- (web) Load htmx-validate for every page
- (web/report) Format rational amounts outside tables too
- (report) Dedupe price join to stop double-counting conversions
- (web/report) Chart fetch URLs need the /api prefix
- (plotting) Bars need a non-zero slot span
- (plotting) Flat breakdown chart emits one series per category
- (plotting) Cap axis ticks and drop minor mesh noise
- (plotting) Balance chart shows one series per account
- (web) Replace stale-tag deletetag(id) with detach + cleanuporphantag
- (finance) Addtags must link via the canonical id Tag::commit returns
- (nomiscript) Accept n/d rational literals in reader
- (nomiscript) Script-mode modules export memory again
- (rpc) Clean unused imports in split natives module
- (rpc) Gate test-only renderers under cfg(test) (P4 A5 followup)
- (nomiscript) Codegen wasm locals for runtime defun args + match accumulator pair-element types
- (nomiscript) Codegen/eval drift hardening + future-proof regression tests
- (nomiscript) Export alloc_<kind> + pairnew from eval-mode modules
- (doc) Restore versions.org accidentally removed in 8e77f9c
- (nomiscript) Infer DO PairElement from step exprs, not just body setf
- (nomiscript) Setf with defstruct accessor mutates outer binding
- (nomiscript) CONS literal car widens against typed cdr
- (nomiscript) TAGBODY (go) off-by-one + setf-mutated loop-var promotion
- (nomiscript) Unify runtime IF/COND test handling — fix three miscompiles
- (nomiscript) Three unwind-protect crossing-cleanup bugs (adversarial review)
- (nomiscript) #57/#58 + numeric-literal-in-list Ratio soundness
- (nomiscript) Bound defun inline recursion (Gap B residue, #59)
- (nomiscript) HOF accumulator typing + const-fold→runtime bail for map/filter/fold
- (nomiscript) Emitnildefault + 3 nil-coercion bugs (ADR-0028 A)
- (nomiscript) Make DEFTEST registration idempotent (eval-purity)
- (nomiscript) Address ADR-0028 B+C batch codex review [WIP]
- (nomiscript) ADR-0028 B+C HOF closure typing + binding sizing [WIP]
- (nomiscript) ADR-0028 IF-branch numeric-literal reconciliation
- (nomiscript) ADR-0028 comparison no-mix + remove I32->Ratio bridge
- (nomiscript) ADR-0028 LENGTH returns Index not Ratio
- (nomiscript) CAR/CDR of a quoted constant list lowers at value position
- (nomiscript) REVERSE/CONS/APPEND of a constant list lower at value position
- (nms) Don't dispatch comment-only chunks as rpc forms
- (nomiscript) Metro sample tags BOTH splits of a two-split Metro tx
- (nomiscript) Harden compiler against malformed-input panics (AFL)
- (sshd) Wire interrupt signal into eval channel; deflake cancel test
- (build) Resolve rustfmt from toolchain sysroot in generator build scripts
- (build) Disable emacs lock files in org-tangle build scripts
- (sshd) Drop unneeded toomanyarguments allow on ptyrequest
- (tui,docs) Address review phase 1 findings
- (tui) Address review phase 2 (consistency) findings
- (tui) Bound console history, surface worker disconnect on drain
- (web) Select autocomplete suggestions via pointer events (mobile)
- (sshd) Clear the TUI backend without probing the local tty
- (web) Run server boot (migrate + seed) before Config::init
🚜 Refactor
- (server) Migrate Account to User support
- (server) Migrate Commodity to User support
- (server) Fix the tests
- (cli) Provide userid for commands
- (cli) Migrate commands in cli to User
- (web) Migrate the web part to User and context
- (nomiscript) Split compiler into focused modules
- (report) Fold TrialBalance into BalanceReport
- (web/report) Unify UX with shared view projection and partials
- (report) Move view projection into server
- (cli) Split mode-agnostic commands into cli-core + clap automation CLI
- (tui) Transport abstraction + pure runtime for local and SSH binaries
- (finance) Tag::commit upserts canonical row, returns its id
- (server) Unify tag commands around canonical rows
- (scripting,rpc) Unify wasm primitives in scripting::runtime
- (scripting,rpc) Generalize capture protocol over AsMut<EvalContext>
- (rpc,scripting) Async Session unblocks DB-touching natives
- (server) Make test-utils additive so –all-features stays green
- (scripting) Unify native dispatch via NativeSpec registry
- (scripting) Unify special-form dispatch + dedup pair downcast
- (scripting) Auto-derive effect path for stack-only natives
- (scripting,rpc) Universal host-fn return convention (P4 A1)
- (nomiscript) Retire WasmRuntime silent path + categorize tests + delete capture-era legacy
- (nomiscript) Split iteration.rs (1540) into 6-file module
- (nomiscript) Split context.rs (1478) into 8-file module
- (nomiscript) Split expr.rs (1394) into 9-file module
- (nomiscript) Split native/entity.rs (1145) into 8-file module
- (nomiscript) Split binding.rs (975) into 7-file module
- (nomiscript) Split reader.rs (959) into 7-file module
- (nomiscript) Split compileeval.rs (831) into 7-file module
- (nomiscript) Split comparison.rs (907) into 4-file module
- (nomiscript) Split layout.rs (722) into 5-file module
- (nomiscript) Split control.rs (707) into 6-file module
- (nomiscript) Split runtime/symbol.rs (648) into 5-file module
- (nomiscript) Split list.rs (615) into 6-file module
- (nomiscript) Split arithmetic.rs (556) into 3-file module
- (nomiscript) Split comparison/ordering.rs (529) into 3-file module
- (rpc) Host fn registry tangles from nativereference.org
- (nomiscript) Collapse entity-field duplication into ENTITYSPECS
- (nomiscript) Tangle entityregistry.rs from org
- (server) Factor batch-script per-tx I/O into server::script
- (nomiscript) Tangle typedentity accessors from org
- (nomiscript) Registry uses Result + checked arithmetic
- (scripting) MemorySerializer add* take param structs
- (nomiscript) BLOCK emit-time exit typing + macro-expansion depth guard
- (nomiscript) Single source of truth for stack-type prediction
📚 Documentation
- Update the README.md to use cli and cargo run
- Add main doc and hook for automated readme
- Fix the git-cliff config and hook
- Add workspace documentation
- Update feature plan
- (server) Generate migrations from the docs
- (finance) Update the finance table and add descriptions
- Add tasklist and bugtracker
- Update the coverage link
- Add design doc for nomiscript
- (nomiscript) Add implementation and basic language parts
- (nomiscript) Add functions description
- (nomiscript) Auto-sync API reference via elisp babel blocks
- (scripts) Update tag-sync scripts and add NomiScript source
- (report) Add reporting guide
- (report) Update reporting guide for the three-report story
- (report) Add Charts section covering kinds, renderers, CLI
- (sshd) Operator guide and README pointers
- (nomiscript) Commodity numeric type design + ADR-0014 (P3b 1e)
- (nomiscript) ADR-0012 wasm-gc-pair-migration + design updates (P3a 3a.4)
- (adr) ADR-0013 host-allocated GC refs + typed entity returns (P4 A7)
- (plan-11) Emacs-rpc protocol + ADR-0015/0016 + sshd subsystem section
- Migrate nativereference from .md to .org
- P4 A7 — bring ADR/implementation/language up to A6.b state
- (nomiscript) Builtinreference.org tangles symbol registry
- (adr) Backfill 8 ADRs for shipped decisions (0017-0024)
- (adr) ADR-0027 lambda emit + Tier 1.5 Gap A/B regression locks
- Clarify bug-fix-in-scope rule
- (nomiscript) Clarify dual-path call dispatch in call.rs
- ADR-0027 extension — runtime-call, closures, BLOCK/TAGBODY
- (claude) Codify no-manual-emacs-regen + fix-every-bug-found rules
- (adr) 0028 numeric dimension lattice {Index, Scalar, Money}
- (adr-0028) Reconcile CLAUDE.md + ADRs with shipped numeric lattice
- (ops) Add one-time per-user isolation cutover runbook
🎨 Styling
- (sql) Fix sqlfluff violations in account queries
- (web) Apply prettier formatting to account manage template
- (nomiscript) Remove obvious comments from WASM codegen
- Apply clippy –fix let-chain simplifications
🧪 Testing
- (db) Add sqlite tests
- (config) Stabilize test runs
- (config) Fix the doctests
- (server) Fix tests to work with Postgres
- (server) Fix DBPOOL for multi-threaded tests
- (server) Rework tests and simplify the db connection
- (finance) Commit the transaction in tests
- (server) Add C++ example of wasm script
- (commodity) Add panic to scripting to find the issue
- (finance) Add draft for the Transaction creation test
- (server) Add test for ListCommodities
- Support coverage collection
- (web) Add the first part of web tests
- (web) Add pages tests
- (web) Reexport the web internals for test
- (server) Fix the arguments for gettag
- (web) Add test for ListCommodities
- (server) Add tests for scriptmgmt
- (server) Add tests for ListSplits
- (scripting) Add tag-sync executor and comparison tests
- (suppmacro) Refresh trybuild stderr fixtures after rustc upgrade
- (nomiscript) Categorize 9 new codegen test files + drift fix in compileifforstack
- (nomiscript) Five more categorized test files for coverage
- (nomiscript) Hostfn dispatch + entity-eval + expr coverage
- (nomiscript) Iteration edges + comparison extras
- (rpc) Parity suite + COND/DESCRIBE/PP/APROPOS/DEFTEST/RUN-TESTS/ASSERT-EQUAL stack handlers
- (nomiscript,rpc,sdk) Coverage push — entity SDK, lambda/macro/struct/eval forms
- (nomiscript) P4 A2 — cross-kind + macro-expansion tests
- (nomiscript) Closure capture, multi-invocation, capturing HOFs
- (nomiscript) ADR-0028 B+C contract-change expectation updates [WIP]
- (integration) DB-backed runtime test for Metro split tagging
- (nomiscript) Pin classifystacktype + namespaced-macro resolution (ADR-0029)
- (nomiscript) AFL fuzz harness for the compiler
- (nms) Skip wasm-executing integration tests under Miri
⚙️ Miscellaneous Tasks
- (build) Migrate to Cargo Workspace
- Apply cargo fix
- (config) Move sql requests to separate files
- Migrate to Postgres
- (server) Update the SQL queries and save them to files
- (hook) Cleanup temporary file after doc generation
- Add .projectile file
- (web) Eliminate copying
- (scripting) Support WAT for scripts
- (scripting) Generalize wrappers
- (server) Rework wasm build procedure
- (macro) Add builder macro for builders autogeneration
- (macro) Support lifetimes in Builder
- (macro) Migrate to syn-2
- (sql) SQLX statements prepared
- (build) Add builder creation step to drone.yml
- (build) Remove unneeded build step
- (finance) Remove ACTION from split
- (finance) Unify Split with other entities
- (build) Switch Drone to Kaniko
- (build) Fix the image name in Drone deployment
- (build) Set lto to "fat"
- (build) Fix tag for Drone
- (build) Fix the path to disdoc.html
- (build) Fix the Drone secret
- (doc) Add build status badge into Status section
- (build) Update Dockerfile to rust-1.83
- (hook) Cleanup the hook and fix the codestyle
- (repo) Add .gitignore
- (finance) Cleanup the tests and ensure they pass
- (web) Rename loginrouter to publicrouter
- (web) Update logging
- (drone) Switch to another k8s plugin
- (finance) Migrate to universal Connection
- (finance) Migrate from text fields in tables to tags
- (finance) Cleanup a Split accordingly to clippy
- (server) Cleanup the error log
- (cli) Rework input so completion works as intended
- (cli) Set correct start state
- (cli) Migrate to HashMap for arguments
- (server) Migrate to HashMap for arguments
- (cli) Move from debug! to trace!
- (finance) Migrate from refs to uuids for Account
- (build) Fix the Drone CI pipeline
- (cli,server) Migrate to returning CmdResult from commands
- (cli) Fix output of the commodity list
- Migrate to Rust 1.85
- (web) Fix the handler type
- (web) Update css
- (web) Migrate to own htmx
- (web) Group components by category
- (web) Regroup the endpoints
- (web) Fix the mobile css
- (web) Create transaction with split
- (web) Fix the error on submitting a transaction
- (web) Add time to the Transaction input date
- (web) Apply the styles for mobile device
- (web) Set column layout for mobile devices
- (web) Fix minor css font size
- (docker) Update rust version
- (web) Fix the path format
- (doc) Add the rustdoc and doc link
- Add CLAUDE.md
- Fix the cargo test flags
- (web) Restore the version information on the login page
- (web) Fix the Account status display and update dashboard
- Apply if-let chaining style
- (server) Accept the accountid argument as Uuid
- (macro) Cleanup and remove the HashMap
- (server) Migrate GetVersion to new macro
- (server) Migrate GetConfig to new macro
- (server) Migrate SetConfig to new macro
- (server) Migrate SelectColumn to new macro
- (server) Migrate CreateCommodity to new macro
- (web) Create structure for tests
- (server) Migrate ListCommodities to new macro
- (server) Migrate CreateAccount to new macro
- (macro) Migrate from keyword to attribute
- (server) Migrate ListAccounts to new macro
- (server) Migrate GetAccount to new macro
- (server) Migrate CreateTransaction to new macro
- (server) Migrate ListTransactions to new macro
- (server) Migrate ListSplits to new macro
- (server) Migrate GetCommodity to new macro and cleanup
- (web) Add script for regular token refresh
- (web) Cleanup the logout and relogin
- (sql) Rename fields to fix sqlfluff and refactor the code
- (build) Generate version info in Drone build
- (ci) Fix the Drone CI and Dockerfile
- (ci) Fix the Drone CI Analyze stage
- (web) Remove the "Commodity" field from "Create Account" page
- (ci) Disable miri isolation
- (web) Update the jsonwebtoken to version 10
- (web) Cleanup all the templates and apply prettier
- (web) Fix the redirect loop
- (web) Print build date together with version
- (sql) Update the sqxl requests
- (web) Fix the argument validation path
- (ci) Disable mandatory sql check
- (sql) Update the sqlx prepared queries
- (web) Simplify the transaction listings for accounts
- (web) Rearrange the main page layout
- (web) Remove useless header
- (web) Rework the JS massively
- (web) Redesign the transaction creation form
- (web) Update css to align the sizes
- (web) Clean up the transaction list
- (web) Reduce the version block size
- (web) Update the transaction list to display name and balance
- (web) Parse the balances correctly in js
- (web) Fix the rational formatting everywhere
- (web) Cleanup the transaction display
- (server) Sort the accounts by latest transaction by default
- (web) Add the "Spend" button to transaction list
- (web) Trim the account name in autocompletion
- Apply prettier
- Sync Rust editions between crates
- (scripting) Remove RUSTFLAGS from build env
- (ci) Update paths in Dockerfile
- (doc) Update doc and move sample script to docs
- (scripting) Update the build.rs to create new wasm scripts
- (ci) Create a dedicated CI image
- (ci) Rework Drone deps
- (web) Apply prettier
- (ci) Fix the miri check
- (doc) Export the sources into the script documentation
- (ci) Support Rust caches
- (sql) Markup all the sql files with sql-product
- (ci) Fix the cache paths for Rust
- (finance) Use copy instead of rename in build.rs
- (ci) Enforce layers copying and running for kaniko
- Apply style fixes
- (ci) Enforce enablecache for kaniko
- (web) Simplify pagination controls
- (web) Fix the autocompletion
- (web) Fix the test to meet the previous commit
- (finance) Fix the build.rs
- (web) Apply prettier
- (ci) Simplify the caching
- (web) Fix the autocomplete scripts loading
- (ci) Disable the single snapshot mode
- (ci) Set more repeats for drone
- (ci) Make docker build parallel again
- (web) Wasm-based completion
- Bump deps
- (ci) Move docs build to Build step
- (ci) Enable sccache
- Bump Rust to 1.93
- Bump deps
- (web) Fix the "Spend" button to fill the "From" field
- Bump deps
- Bump deps
- (nomiscript) Cleanup the function registration
- (nms) Optimize release for size
- (nomiscript) Reorganize symbol location
- (nomiscript) Fix debug compilation
- (nomiscript) Regroup the tests
- (nms) Support multiline input
- (ci) Bump deps
- (nomiscript) Support T as true
- (ci) Clean the docker image
- (prettier) Ignore web/static/doc
- (ci) Check the sccache before build start
- (docker) Copy files right from builder
- Remove fraction from commodity
- (docker) Simplify the docker image build
- (server) Fix the account path delimiter in report
- Bump deps
- (web) Unify the tag editor
- (web) Cleanup the account editor
- (ci) Bump Rust
- (ci) Bump deps
- Bump deps
- Apply code style fixes
- Ignore tangle artifacts in doc/scripts and remove committed .nms
- Bump rust to 1.95 and update deps
- (cli) Drop stray faillog files
- (ci) Bump deps
- (style) Clippy auto-fix cleanups across plotting, scripting, web
- (web) Fix the token update behavior
- (ci) Add fontconfig to fix the build
- (ci) Regenerate static docs each build instead of tracking them
- (rpc) Scaffold per-domain native registry skeleton
- (build) Bump deps
- (nomiscript) Clear pre-existing clippy warnings
- (drone) Build before fmt-check; add nightly wasm32 target
- (drone) Allow deploy before analysis finish
- Bump CI toolchain to rust 1.96
◀️ Revert
- (rpc,server) Drop layer-violating test-DB infrastructure
Build
- Update Rust to 1.87
- Update Rust to 1.88 and bump deps
- Update Rust to 1.89 and bump deps
- Bump wasmtime to 35
- Update Rust to 1.90 and bump deps
- Bump deps
- Bump Rust to 1.91 and update deps
- Bump deps
- Update Rust to 1.92 and bump deps
- Bump deps and update .prettierignore
- Bump deps
- (web) Replace Makefile with build.rs doc generation
- (scripting) Compile NomiScript .nms files to WASM during build
- (finance) Self-heal doc/versions.org; clear suppmacro clippy; +coverage
Finance
- Module created
Naming
- Thus it shall be called - Nomisync
Web
- Duplicate the "to currency" from "from currency" by default
Wip
- (nomiscript) Closure registry scaffolding for Tier 1.5
- (nomiscript) ADR-0028 B+C literal flip + Index arithmetic [WIP]
- (nomiscript) ADR-0028 B+C compile-first arithmetic operands [WIP]
Copying
Νόμιsync is the personal accounting system for a wide variety of commodities. Copyright (C) 2025 Slava Barinov <rayslava@rayslava.com>
This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License along with this program. If not, see https://www.gnu.org/licenses/.
Code documentation
Coverage info
A tarpaulin report is available at coverage.