Get the latest tech news
The program is the database is the interface
!!! DRAFT !!! I do my accounts each year with a simple script. Something like this: (ns accounts (:require [clojure.string :as str] [clojure.pprint :as pp])) ;; converted from statement.csv (def txs [{:date #inst "2022-05-13T11:01:56.532-00:00" :amount -3.30 :text "Card transaction of 3.30 CAD issued by Milano Coffee Roasters VANCOUVER"} {:date #inst "2022-05-12T10:41:56.843-00:00" :amount -3.30 :text "Card transaction of 3.30 CAD issued by Milano Coffee Roasters VANCOUVER"} {:date #inst "2022-05-12T00:01:03.264-00:00" :amount -72.79 :text "Card transaction of 72.79 CAD issued by Amazon.ca AMAZON.CA"} {:date #inst "2022-05-10T10:33:04.011-00:00" :amount -20.00 :text "e-Transfer to: John Smith"} {:date #inst "2022-05-11T17:12:43.098-00:00" :amount -90.00 :text "Card transaction of 90.00 CAD issued by Range Physiotherapy VANCOUVER"}]) (def date->tag {#inst "2022-05-12T00:01:03.264-00:00" :things}) (def text->tag {"Coffee" :eating-out "Range Physio" :medical}) (defn tx->tag [tx] (or (date->tag (:date tx)) (first (for [[text tag] text->tag :when (str/includes? (:text tx) text)] tag)))) (def txs-with-tags (vec (for [tx txs] (assoc tx :tag (tx->tag tx))))) (def total-per-tag (reduce (fn [totals tx] (update-in totals [(:tag tx)] #(+ (:amount tx) (or % 0)))) {} txs-with-tags)) (def untagged (vec (for [tx txs-with-tags :when (nil? (:tag tx))] tx))) (pp/pprint [[:untagged untagged] [:total-per-tag total-per-tag]]) There are many things about this which are nice.
It's composable - I can easily write code to answer unexpected questions (eg how much did I spend on currency conversions this year) or use the computed data in other calculations (eg runway projections). But the preimp repo contains a server which persists the entire history of the notebook to disk, and also syncs changes between different clients to allow (coarse-grained) collaborative editing. extensions: much more ui options selection (+ actions on the side) dropdowns understand types / destructuring render values as copyable text (cf ?)
Or read this on Hacker News