{"id":29569068,"url":"https://github.com/heypoom/fastspend","last_synced_at":"2026-03-08T17:38:41.715Z","repository":{"id":58527608,"uuid":"532294371","full_name":"heypoom/fastspend","owner":"heypoom","description":"Log your spending in seconds with short text snippets. Powered by Rust, Cloudflare Workers and Svelte.","archived":false,"fork":false,"pushed_at":"2022-09-05T17:44:43.000Z","size":157,"stargazers_count":24,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2023-08-05T05:24:21.545Z","etag":null,"topics":["cloudflare-workers","rust","svelte"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/heypoom.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2022-09-03T15:09:46.000Z","updated_at":"2022-09-13T06:59:19.000Z","dependencies_parsed_at":"2023-01-17T20:45:11.005Z","dependency_job_id":null,"html_url":"https://github.com/heypoom/fastspend","commit_stats":null,"previous_names":[],"tags_count":0,"template":null,"template_full_name":null,"purl":"pkg:github/heypoom/fastspend","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/heypoom%2Ffastspend","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/heypoom%2Ffastspend/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/heypoom%2Ffastspend/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/heypoom%2Ffastspend/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/heypoom","download_url":"https://codeload.github.com/heypoom/fastspend/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/heypoom%2Ffastspend/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":265866538,"owners_count":23840983,"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":["cloudflare-workers","rust","svelte"],"created_at":"2025-07-19T01:08:02.718Z","updated_at":"2026-03-08T17:38:41.667Z","avatar_url":"https://github.com/heypoom.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# FastSpend\n\nLog your daily spending lightning fast with short text snippets! FastSpend is a tool to log your spending in seconds, powered by a lightning fast API written in Rust.\n\nFastSpend aims to be service-agnostic, so you can log your spending to multiple sinks. Currently, it is implemented for the You Need A Budget API (YNAB API). Soon, we may offer plugins for logging to Airtable, Firebase, Plain Text, etc.\n\nFastSpend also aims to provide various frontends to log your spending. Currently, we offer a Svelte-powered progressive web app. Soon, we may implement a Rust-powered CLI, Raycast Extension and a chatbot,\n\n## Syntax\n\n- Use keywords to add spending quickly\n\n  - Example: `100f`\n  - The keyword can either represent a category (e.g. `f` is food), or a payee (e.g. `kfc` is Kentucky Fried Chicken)\n\n- Use the exclamation mark (`!`) to add modifiers:\n\n  - Example: `100f!t`\n  - Outflow Modifiers:\n    - credit card: `!c` (default payment method)\n    - bank transfer: `!t`\n    - debit card: `!d`\n  - Inflow Modifiers:\n    - income: `!i`\n    - refund or reimbursement: `!r`\n\n- Use the colon (`:`) sign to associate a payee. This is useful when the payee does not yet have a keyword alias.\n\n  - Example: `400s : Starbucks` associates the transaction with the Starbucks payee.\n\n- Use the hyphen sign (`-`) to add a memo, so you can remember what the transaction is for.\n\n  - Example: `100f - ice cream truck`\n  - You can use it with the payee syntax: `400s : Starbucks - venti caramel macchiato`\n\n- Use the at sign (`@`) in conjunction with the colon sign (`:`) to register a new payee alias\n\n  - Example: `100f@sb : Starbucks` associates the `sb` keyword with the `Starbucks` payee, and utilizes the \"Food\" (`f`) category\n\n- Batch add multiple transactions with the comma sign (`,`):\n  - Example: `780kfc, 550kfc, 110s` registers 3 transactions at once, with different amount and keywords.\n  - Spaces are optional\n\n## Inspiration\n\nThe initial inspiration is from [@dtinth](https://dt.in.th)'s excellent talk on \"[Let’s build a personal assistant and level-up your coding skills!](https://dt.in.th/personal-assistant.html)\". In this talk, Thai creates a LINE chatbot to log his spending and do various things.\n\nI'm using the You Need a Budget (YNAB) app to manage my budgets, but their app takes 4 - 5 taps to register one transaction - I'm way too lazy to do that.\n\n## Technology\n\n- The frontend is built with Svelte and TypeScript as a PWA (Progressive Web Application).\n- The API is built with Rust and Cloudflare Workers.\n\n## Roadmap\n\n- [x] Setup Cloudflare Workers locally\n- [x] Deploy Cloudflare Workers to production for personal usage\n- [x] Maintain database of keywords (budget, payee)\n- [x] Use a parser generator to parse our syntax, e.g. with Pest, Tree-sitter, or just plain 'ol Regex!\n- [x] Write some unit tests in Rust as a starting point\n- [ ] Extract controller to it's own testable unit, with unit tests\n  - [ ] Create a standalone Rust library for parsing commands and invoking event handlers given the configuration\n- [ ] Let's try TDD! (test-driven development)\n- [ ] Host the configuration data in Durable Objects or KV\n- [ ] Allow configuring different YNAB Token and Budget ID\n  - [ ] Generate personal access token for each FastSpend users\n\n**Frontends**\n\n- [ ] Raycast Command\n- [ ] Rust-powered CLI to call the API, built with Rust. e.g. `sf 1000sb`\n- [ ] Chatbot Integration - Messenger or LINE?\n- [ ] PWA to add and modify keyword mapping dynamically; should export as JSON for configuration.\n- [ ] iOS widget or application, powered by Swift?\n\n**Syntax Support**\n\n- [x] Batch transactions with `,`\n- [x] Use colons (`:`) to add payee name\n- [x] Use hyphen (`-`) to add a memo\n- [x] Use `!` to add modifier: `!t` for transfer, `!r` for refund/reimburse, `!d` for debit, `!i` for income\n- [x] Keyword can be either budget or payee.\n- [x] Use `$` to add tags, e.g. `$5` is 5 star rating\n- [ ] Use emojis as keyword - e.g. ☕️ for Starbucks\n- [ ] Command to register budget categories - e.g. `!c f Food, 1689063412`\n- [ ] Command to register payee - e.g. `!p fc Factory Coffee $ Drinks`\n\n**Logging Sources**\n\n- [x] YNAB API (You Need A Budget API)\n- [ ] Airtable\n- [ ] Firebase\n\n**Webapp Features**\n\n- [ ] Implement Syntax Highlighting in PWA\n- [ ] Implement Autocompletion in PWA\n- [ ] Implement standard PWA features (e.g. offline-first support, manifest)\n\n**Write-up**\n\n- [ ] Write a Blog on this\n\n**Features Ideas**\n\n- [ ] Automatically log spending from notification interception or web scraping, automatically sync and match\n- [ ] Pre-populated widget UI with spending behaviour, use previous transaction data or logged widget/spending group. One-tap to log spending from history.\n- [ ] Multiple logging backends as Rust plugin: YNAB API, Airtable, Plain Text, Firebase. Should be able to write unit test\n- [ ] Natural language input instead of command-based input\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fheypoom%2Ffastspend","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fheypoom%2Ffastspend","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fheypoom%2Ffastspend/lists"}