{"id":16885556,"url":"https://github.com/haberman/dblbook","last_synced_at":"2025-07-14T21:33:05.960Z","repository":{"id":2247422,"uuid":"3202201","full_name":"haberman/dblbook","owner":"haberman","description":"Double-Booked: a Chrome app for double-entry accounting.","archived":false,"fork":false,"pushed_at":"2016-02-21T21:44:26.000Z","size":3566,"stargazers_count":30,"open_issues_count":0,"forks_count":5,"subscribers_count":7,"default_branch":"master","last_synced_at":"2025-04-11T13:04:44.543Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/haberman.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2012-01-17T19:09:24.000Z","updated_at":"2022-09-14T16:12:52.000Z","dependencies_parsed_at":"2022-09-09T18:00:28.317Z","dependency_job_id":null,"html_url":"https://github.com/haberman/dblbook","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/haberman/dblbook","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/haberman%2Fdblbook","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/haberman%2Fdblbook/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/haberman%2Fdblbook/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/haberman%2Fdblbook/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/haberman","download_url":"https://codeload.github.com/haberman/dblbook/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/haberman%2Fdblbook/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":265351861,"owners_count":23751808,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-10-13T16:35:54.164Z","updated_at":"2025-07-14T21:33:05.924Z","avatar_url":"https://github.com/haberman.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\n# Double-Booked: A reactive web app for double-entry accounting\n\nThis is an app for double-entry accounting, in the tradition\nof [GnuCash](http://www.gnucash.org/) and\n[Ledger](http://www.ledger-cli.org/).  It is designed in a\nreactive style, with the goal of having a highly responsive\nUI where updates propagate immediately and you don't\n\"generate a report\", you just view it (with instant\nresults).\n\nIt is designed to run in a web browser, client side, using\nindexedDB as its data store (though with the ability to sync\nto a centralized server).\n\nI have lots of big ideas for how I want to improve on\nexisting accounting apps.  But as a backend guy, I am\nprimarily focused right now on creating a data storage layer\nthat has all the features I want.  I want to make sure the\ndata model is rich and powerful (hierarchical accounts,\nmultiple currencies, stocks/bonds with lot/basis info,\nbalance assertions), but also highly efficient.  Propagating\nupdates efficiently in an accounting ledger is a hard\nproblem that I discuss at length in\n[DBDesign.md](DBDesign.md).\n\nBasically I'm trying to create the \"git\" of double-entry\naccounting.  Git's primary contribution is its efficient\ndata model and storage format.  It is the basis on which the\nentire ecosystem is built.\n\n# Build / Run / Test\n\nYou need [Node.js](https://nodejs.org/).\n\nInstall these tools if you don't have them globally\ninstalled already:\n\n    $ npm install -g bower\n    $ npm install -g gulp\n\nThen install our dependencies into the local tree (it reads\nthe list of packages to install from `bower.json` and\n`package.json`):\n\n    $ bower install\n    $ npm install\n\nNow build/transpile all the source and create a\nfully-populated output directory in `build/`:\n\n    $ gulp\n\nNow you can run the app by visiting `build/index.html`\n(not much to see right now though).\n\nTo run the tests visit `tests/test.html`.  I have verified\nthey work in both Chrome 43 and Firefox 39.\n\n# Overall Design / Technologies\n\nThe data storage layer is in [model](model) and written in\nES6.  It only depends on:\n\n* a red-black tree, since JavaScript doesn't natively\n  provide a sorted map.\n* indexedDB, for storing the data locally\n\nBecause of the second dependency, it requires a web browser\n(there doesn't appear to be a robust implementation of\nindexedDB for Node.js).\n\nThe storage layer is by far the most interesting and mature\npart of the project so far.  Between the [design\ndoc](DBDesign.md) and the source comments, it should be\npretty usable.  It is also tested reasonably well by the\ntests in `tests`.\n\nThe (very minimal) UI is built on\n[React](http://facebook.github.io/react/) and\n[ReactRouter](https://github.com/rackt/react-router).  It\nuses some minimal UI framework in the form of\n[Pure](http://purecss.io/) and\n[FontAwesome](http://fortawesome.github.io/Font-Awesome/).\n\nSince the app is designed to be capable of working\ncompletely offline, it is intended to be usable as a Chrome\nApp or with ServiceWorker.  I'm keeping my options open on\nthis point.\n\nMy hope is to implement syncing with a server using a flat\nfile on Google Drive or DropBox.  So you'd have a local\ndatabase in indexedDB, but you could push your commit log to\nGoogle Drive and pull commits from it.  A key idea here is\nthat it should sync to storage owned and controlled by the\nuser, not servers that I operate.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhaberman%2Fdblbook","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhaberman%2Fdblbook","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhaberman%2Fdblbook/lists"}