{"id":15406317,"url":"https://github.com/jantman/biweeklybudget","last_synced_at":"2026-02-15T13:26:12.193Z","repository":{"id":41001218,"uuid":"85647850","full_name":"jantman/biweeklybudget","owner":"jantman","description":"Responsive Flask/SQLAlchemy personal finance app, specifically for biweekly budgeting.","archived":false,"fork":false,"pushed_at":"2026-01-13T01:37:56.000Z","size":60084,"stargazers_count":106,"open_issues_count":54,"forks_count":19,"subscribers_count":6,"default_branch":"master","last_synced_at":"2026-01-13T05:19:05.003Z","etag":null,"topics":["alembic","budget","budgeting","finance","flask","ofx","personal-finance","responsive","sqlalchemy"],"latest_commit_sha":null,"homepage":"http://biweeklybudget.readthedocs.io/en/latest/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jantman.png","metadata":{"files":{"readme":"README.rst","changelog":"CHANGES.rst","contributing":".github/CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2017-03-21T02:04:45.000Z","updated_at":"2025-11-30T17:05:17.000Z","dependencies_parsed_at":"2023-01-31T15:31:07.584Z","dependency_job_id":"0c0e462c-ea55-44df-a860-cd6cbee74139","html_url":"https://github.com/jantman/biweeklybudget","commit_stats":{"total_commits":1087,"total_committers":2,"mean_commits":543.5,"dds":0.0009199632014719183,"last_synced_commit":"371fe5be5538255f13a28cd4bb27a79ccebbdd65"},"previous_names":[],"tags_count":15,"template":false,"template_full_name":null,"purl":"pkg:github/jantman/biweeklybudget","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jantman%2Fbiweeklybudget","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jantman%2Fbiweeklybudget/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jantman%2Fbiweeklybudget/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jantman%2Fbiweeklybudget/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jantman","download_url":"https://codeload.github.com/jantman/biweeklybudget/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jantman%2Fbiweeklybudget/sbom","scorecard":{"id":505718,"data":{"date":"2025-08-11","repo":{"name":"github.com/jantman/biweeklybudget","commit":"371fe5be5538255f13a28cd4bb27a79ccebbdd65"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2.4,"checks":[{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Code-Review","score":0,"reason":"Found 0/6 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/release.yml:1","Warn: no topLevel permission defined: .github/workflows/run-tox-suite.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Binary-Artifacts","score":9,"reason":"binaries present in source code","details":["Warn: binary detected: dev/tini_0.14.0.deb:1"],"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: GNU Affero General Public License v3.0: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:10: update your workflow using https://app.stepsecurity.io/secureworkflow/jantman/biweeklybudget/release.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:12: update your workflow using https://app.stepsecurity.io/secureworkflow/jantman/biweeklybudget/release.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/release.yml:26: update your workflow using https://app.stepsecurity.io/secureworkflow/jantman/biweeklybudget/release.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/release.yml:32: update your workflow using https://app.stepsecurity.io/secureworkflow/jantman/biweeklybudget/release.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:61: update your workflow using https://app.stepsecurity.io/secureworkflow/jantman/biweeklybudget/release.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/run-tox-suite.yml:102: update your workflow using https://app.stepsecurity.io/secureworkflow/jantman/biweeklybudget/run-tox-suite.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/run-tox-suite.yml:104: update your workflow using https://app.stepsecurity.io/secureworkflow/jantman/biweeklybudget/run-tox-suite.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/run-tox-suite.yml:135: update your workflow using https://app.stepsecurity.io/secureworkflow/jantman/biweeklybudget/run-tox-suite.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/run-tox-suite.yml:137: update your workflow using https://app.stepsecurity.io/secureworkflow/jantman/biweeklybudget/run-tox-suite.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/run-tox-suite.yml:147: update your workflow using https://app.stepsecurity.io/secureworkflow/jantman/biweeklybudget/run-tox-suite.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/run-tox-suite.yml:157: update your workflow using https://app.stepsecurity.io/secureworkflow/jantman/biweeklybudget/run-tox-suite.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/run-tox-suite.yml:191: update your workflow using https://app.stepsecurity.io/secureworkflow/jantman/biweeklybudget/run-tox-suite.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/run-tox-suite.yml:193: update your workflow using https://app.stepsecurity.io/secureworkflow/jantman/biweeklybudget/run-tox-suite.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/run-tox-suite.yml:203: update your workflow using https://app.stepsecurity.io/secureworkflow/jantman/biweeklybudget/run-tox-suite.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/run-tox-suite.yml:232: update your workflow using https://app.stepsecurity.io/secureworkflow/jantman/biweeklybudget/run-tox-suite.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/run-tox-suite.yml:234: update your workflow using https://app.stepsecurity.io/secureworkflow/jantman/biweeklybudget/run-tox-suite.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/run-tox-suite.yml:243: update your workflow using https://app.stepsecurity.io/secureworkflow/jantman/biweeklybudget/run-tox-suite.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/run-tox-suite.yml:251: update your workflow using https://app.stepsecurity.io/secureworkflow/jantman/biweeklybudget/run-tox-suite.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/run-tox-suite.yml:286: update your workflow using https://app.stepsecurity.io/secureworkflow/jantman/biweeklybudget/run-tox-suite.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/run-tox-suite.yml:288: update your workflow using https://app.stepsecurity.io/secureworkflow/jantman/biweeklybudget/run-tox-suite.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/run-tox-suite.yml:298: update your workflow using https://app.stepsecurity.io/secureworkflow/jantman/biweeklybudget/run-tox-suite.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/run-tox-suite.yml:26: update your workflow using https://app.stepsecurity.io/secureworkflow/jantman/biweeklybudget/run-tox-suite.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/run-tox-suite.yml:28: update your workflow using https://app.stepsecurity.io/secureworkflow/jantman/biweeklybudget/run-tox-suite.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/run-tox-suite.yml:38: update your workflow using https://app.stepsecurity.io/secureworkflow/jantman/biweeklybudget/run-tox-suite.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/run-tox-suite.yml:47: update your workflow using https://app.stepsecurity.io/secureworkflow/jantman/biweeklybudget/run-tox-suite.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/run-tox-suite.yml:57: update your workflow using https://app.stepsecurity.io/secureworkflow/jantman/biweeklybudget/run-tox-suite.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/run-tox-suite.yml:59: update your workflow using https://app.stepsecurity.io/secureworkflow/jantman/biweeklybudget/run-tox-suite.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/run-tox-suite.yml:71: update your workflow using https://app.stepsecurity.io/secureworkflow/jantman/biweeklybudget/run-tox-suite.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/run-tox-suite.yml:73: update your workflow using https://app.stepsecurity.io/secureworkflow/jantman/biweeklybudget/run-tox-suite.yml/master?enable=pin","Warn: pipCommand not pinned by hash: biweeklybudget/vendored/install_vendored.sh:5","Warn: pipCommand not pinned by hash: .github/workflows/release.yml:17","Warn: pipCommand not pinned by hash: .github/workflows/release.yml:17","Warn: pipCommand not pinned by hash: .github/workflows/run-tox-suite.yml:198","Warn: pipCommand not pinned by hash: .github/workflows/run-tox-suite.yml:198","Warn: pipCommand not pinned by hash: .github/workflows/run-tox-suite.yml:239","Warn: pipCommand not pinned by hash: .github/workflows/run-tox-suite.yml:239","Warn: pipCommand not pinned by hash: .github/workflows/run-tox-suite.yml:293","Warn: pipCommand not pinned by hash: .github/workflows/run-tox-suite.yml:293","Warn: pipCommand not pinned by hash: .github/workflows/run-tox-suite.yml:33","Warn: pipCommand not pinned by hash: .github/workflows/run-tox-suite.yml:33","Warn: pipCommand not pinned by hash: .github/workflows/run-tox-suite.yml:64","Warn: pipCommand not pinned by hash: .github/workflows/run-tox-suite.yml:64","Warn: pipCommand not pinned by hash: .github/workflows/run-tox-suite.yml:78","Warn: pipCommand not pinned by hash: .github/workflows/run-tox-suite.yml:78","Warn: npmCommand not pinned by hash: .github/workflows/run-tox-suite.yml:78","Warn: pipCommand not pinned by hash: .github/workflows/run-tox-suite.yml:109","Warn: pipCommand not pinned by hash: .github/workflows/run-tox-suite.yml:109","Warn: pipCommand not pinned by hash: .github/workflows/run-tox-suite.yml:142","Warn: pipCommand not pinned by hash: .github/workflows/run-tox-suite.yml:142","Info:   0 out of  24 GitHub-owned GitHubAction dependencies pinned","Info:   1 out of   6 third-party GitHubAction dependencies pinned","Info:   0 out of   1 npmCommand dependencies pinned","Info:   0 out of  19 pipCommand dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 27 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Vulnerabilities","score":0,"reason":"29 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: PYSEC-2021-421 / GHSA-h4m5-qpfp-3mpv","Warn: Project is vulnerable to: GHSA-3ww4-gg4f-jr7f","Warn: Project is vulnerable to: GHSA-9v9h-cgj8-h64p","Warn: Project is vulnerable to: PYSEC-2021-62 / GHSA-hggm-jpg3-v476","Warn: Project is vulnerable to: PYSEC-2017-8 / GHSA-q3cj-2r34-2cwc","Warn: Project is vulnerable to: PYSEC-2023-62 / GHSA-m2qf-hxjv-5gpq","Warn: Project is vulnerable to: PYSEC-2021-16 / GHSA-93xj-8mrv-444m","Warn: Project is vulnerable to: PYSEC-2020-46 / GHSA-gg84-qgv9-w4pq","Warn: Project is vulnerable to: PYSEC-2024-60 / GHSA-jjg7-2v4v-x38h","Warn: Project is vulnerable to: GHSA-cpwx-vrp4-4pq7","Warn: Project is vulnerable to: PYSEC-2021-66 / GHSA-g3rq-g295-4j3m","Warn: Project is vulnerable to: GHSA-h5c8-rqwp-cp95","Warn: Project is vulnerable to: GHSA-h75v-3vvj-5mfj","Warn: Project is vulnerable to: GHSA-q2x7-8rv6-6q7h","Warn: Project is vulnerable to: PYSEC-2022-260 / GHSA-v973-fxgf-6xhp","Warn: Project is vulnerable to: GHSA-v9hf-5j83-6xpp","Warn: Project is vulnerable to: PYSEC-2014-14 / GHSA-652x-xj99-gmcc","Warn: Project is vulnerable to: GHSA-9hjg-9r4m-mvj7","Warn: Project is vulnerable to: GHSA-9wx4-h78v-vm56","Warn: Project is vulnerable to: PYSEC-2014-13 / GHSA-cfj3-7x9c-4p3h","Warn: Project is vulnerable to: PYSEC-2018-28 / GHSA-x84v-xcm2-53pg","Warn: Project is vulnerable to: PYSEC-2023-206","Warn: Project is vulnerable to: GHSA-2g68-c3qc-8985","Warn: Project is vulnerable to: GHSA-f9vj-2wh5-fj8j","Warn: Project is vulnerable to: PYSEC-2023-221 / GHSA-hrfv-mqp8-q5rw","Warn: Project is vulnerable to: PYSEC-2023-57 / GHSA-px8h-6qxv-m22q","Warn: Project is vulnerable to: GHSA-q34m-jh98-gwm2","Warn: Project is vulnerable to: PYSEC-2023-58 / GHSA-xg9f-g7g7-2323","Warn: Project is vulnerable to: PYSEC-2022-203"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-19T23:12:26.738Z","repository_id":41001218,"created_at":"2025-08-19T23:12:26.738Z","updated_at":"2025-08-19T23:12:26.738Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28538931,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-18T14:59:57.589Z","status":"ssl_error","status_checked_at":"2026-01-18T14:59:46.540Z","response_time":98,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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":["alembic","budget","budgeting","finance","flask","ofx","personal-finance","responsive","sqlalchemy"],"created_at":"2024-10-01T16:20:58.603Z","updated_at":"2026-01-18T15:05:34.138Z","avatar_url":"https://github.com/jantman.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"biweeklybudget\n==============\n\n.. image:: https://github.com/jantman/biweeklybudget/actions/workflows/run-tox-suite.yml/badge.svg\n   :target: https://github.com/jantman/biweeklybudget/actions/workflows/run-tox-suite.yml\n   :alt: GitHub Actions build for master branch\n\n.. image:: https://readthedocs.org/projects/biweeklybudget/badge/?version=latest\n   :target: https://readthedocs.org/projects/biweeklybudget/?badge=latest\n   :alt: sphinx documentation for latest release\n\n.. image:: http://www.repostatus.org/badges/latest/active.svg\n   :alt: Project Status: Active – The project has reached a stable, usable state and is being actively developed.\n   :target: http://www.repostatus.org/#active\n\nResponsive Flask/SQLAlchemy personal finance app, specifically for biweekly budgeting.\n\n**For full documentation**, see `http://biweeklybudget.readthedocs.io/en/latest/ \u003chttp://biweeklybudget.readthedocs.io/en/latest/\u003e`_\n\n**For screenshots**, see `\u003chttp://biweeklybudget.readthedocs.io/en/latest/screenshots.html\u003e`_\n\nOverview\n--------\n\nbiweeklybudget is a responsive (mobile-friendly) Flask/SQLAlchemy personal finance application, specifically\ntargeted at budgeting on a biweekly basis. This is a personal project of mine, and really only intended for my\npersonal use. If you find it helpful, great! But this is provided as-is; I'll happily accept pull requests if they\ndon't mess things up for me, but I don't intend on working any feature requests or bug reports at this time. Sorry.\n\nThe main motivation for writing this is that I get paid every other Friday, and have for almost all of my professional\nlife. I also essentially live paycheck-to-paycheck; what savings I have is earmarked for specific purposes, so I budget\nin periods identical to my pay periods. No existing financial software that I know of handles this, and many of them\nhave thousands of Google results of people asking for it; almost everything existing budgets on calendar months. I spent\nmany years using Google Sheets and a handful of scripts to template out budgets and reconcile transactions, but I decided\nit's time to just bite the bullet and write something that isn't a pain.\n\n**Intended Audience:** This is decidedly not an end-user application. You should be familiar with Python/Flask/MySQL. If\nyou're going to use the OFX-baseed automatic transaction download functionality (as opposed to Plaid), you should be\nfamiliar with `Hashicorp Vault \u003chttps://developer.hashicorp.com/vault\u003e`_\nand how to run a reasonably secure installation of it. I personally don't recommend running this on anything other than\nyour own computer that you physically control, given the sensitivity of the information. I also don't recommend making the\napplication available to anything other than localhost, but if you do, you need to be aware of the security implications. This\napplication is **not** designed to be accessible in any way to anyone other than authorized users (i.e. if you just serve it\nover the web, someone *will* get your account numbers, or worse).\n\n*Note:* Any potential users outside of the US should see the documentation section on\n`Currency Formatting and Localization \u003chttp://biweeklybudget.readthedocs.io/en/latest/app_usage.html#currency-formatting-and-localization\u003e`_;\nthe short version is that I've done my best to make this configurable, but as far as I know I'm the\nonly person using this software. If anyone else wants to use it and it doesn't work for your currency\nor locale, let me know and I'll fix it.\n\nImportant Warning\n+++++++++++++++++\n\nThis software should be considered *beta* quality at best. I've been using it for about a year and it seems to be working correctly, but I'm very much a creature of habit; it's entirely possible that there are major bugs I haven't found because I always do the same action in the same way, the same order, the same steps, etc. In short, this application works for *me* and the *exact particular way I use it*, but it hasn't seen enough use from other people to say that it's stable and correct in the general case. As such, please **DO NOT RELY ON** the mathematical/financial calculations without double-checking them.\n\nMain Features\n+++++++++++++\n\n* Budgeting on a biweekly (fortnightly; every other week) basis, for those of us who are paid that way.\n* Periodic (per-pay-period) or standing budgets.\n* Optional automatic downloading of transactions/statements from your financial institutions via OFX Direct Connect, screen scraping, or `Plaid \u003chttps://plaid.com/\u003e`__ and reconciling transactions (bank, credit, and investment accounts).\n* Scheduled transactions - specific date or recurring (date-of-month, or number of times per pay period).\n* Tracking of vehicle fuel fills (fuel log) and graphing of fuel economy.\n* Cost tracking for multiple projects, including bills-of-materials for them. Optional synchronization from Amazon Wishlists to projects.\n* Calculation of estimated credit card payoff amount and time, with configurable payment methods, payment increases on specific dates, and additional payments on specific dates.\n* Ability to split a Transaction across multiple Budgets.\n\nRequirements\n------------\n\n**Note:** Alternatively, biweeklybudget is also distributed as a `Docker container \u003chttp://biweeklybudget.readthedocs.io/en/latest/flask_app.html\u003e`_.\nUsing the dockerized version will eliminate all of these dependencies aside from MySQL (which you can run in another container) and\nVault (if you choose to take advantage of the OFX downloading), which you can also run in another container.\n\n* Python 3.7+ (currently tested and developed with 3.14).\n* Python `VirtualEnv \u003chttp://www.virtualenv.org/\u003e`_ and ``pip`` (recommended installation method; your OS/distribution should have packages for these)\n* MySQL, or a compatible database (e.g. `MariaDB \u003chttps://mariadb.org/\u003e`_). biweeklybudget uses `SQLAlchemy \u003chttp://www.sqlalchemy.org/\u003e`_ for database abstraction, but currently specifies some MySQL-specific options, and is only tested with MySQL.\n* To use the automated Plaid transaction downloading functionality, a valid `Plaid \u003chttps://plaid.com/\u003e`__ account.\n* To use the automated OFX Direct Connect transaction downloading functionality:\n\n  * A running, reachable instance of `Hashicorp Vault \u003chttps://developer.hashicorp.com/vault\u003e`_ with your financial institution web credentials stored in it.\n  * If your bank does not support OFX remote access (\"Direct Connect\"), you will need to write a custom screen-scraper class using Selenium and a browser.\n\nInstallation\n------------\n\nIt's recommended that you run from the Docker image, as that's what I do. If you\ndon't want to do that, you can also install in a virtualenv using Python 3.14:\n\n.. code-block:: bash\n\n    mkdir biweeklybudget\n    python3.14 -mvenv venv\n    source venv/bin/activate\n    pip install biweeklybudget\n\nLicense\n-------\n\nbiweeklybudget itself is licensed under the\n`GNU Affero General Public License, version 3 \u003chttps://www.gnu.org/licenses/agpl-3.0.en.html\u003e`_.\nThis is specifically intended to extend to anyone who uses the software remotely\nover a network, the same rights as those who download and install it locally.\nbiweeklybudget makes use of various third party software, especially in the UI and\nfrontend, that is distributed under other licenses. Please see\n``biweeklybudget/flaskapp/static`` in the source tree for further information.\n\nbiweeklybudget includes a number of dependencies distributed alongside it, which\nare licensed and distributed under their respective licenses. See the\n``biweeklybudget/vendored`` directory in the source distribution for further\ninformation.\n\nAttributions\n------------\n\nThe logo used for biweeklybudget makes use of the wonderful, free Ledger icon by Eucalyp on FlatIcons: `Ledger icons created by Eucalyp - Flaticon \u003chttps://www.flaticon.com/free-icons/ledger\u003e`_.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjantman%2Fbiweeklybudget","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjantman%2Fbiweeklybudget","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjantman%2Fbiweeklybudget/lists"}