尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证Free, open-source personal finance app for tracking income, expenses, recurring bills, wallets, and spending by category.
翻译准备中
取自仓库 README
正在加载完整 README。
查看完整 README ↗Spendist is a free, open-source app for tracking personal income and expenses. Use it to see where your money goes, organize spending across wallets and categories, and keep a record of recurring bills.
Open Spendist · Getting started · Run locally · Documentation · Report a problem
Spendist is for people who want to record everyday spending and understand their household finances. It works in Polish and English, with light and dark themes. You can use the hosted application or run the open-source code yourself under the GPL-3.0 license.
There are no ads or data sales. You enter transactions yourself or import supported files; Spendist does not connect to your bank or make payments on your behalf.
Already have records? Import Spendist CSV or Kontomierz XLSX in Settings. The Transactions import also accepts Biedronka e-receipt JSON. These are specific formats, not a general bank-statement importer. You can export transactions as Spendist CSV from Settings.
Spendist is actively developed. If something is confusing or fails, open an issue with the steps to reproduce it. Remove financial records, personal information, and tokens from anything you share publicly.
@ng-icons/core, and Heroicons.pg_cron, pg_net, and Vault-backed scheduled jobs.dist/apps/web/browser.apps/web/ Angular app, Cloudflare Worker, public runtime env
apps/web-e2e/ Playwright end-to-end tests
apps/mcp/ MCP tools, resources, prompts, STDIO, and HTTP Worker
libs/data-access-* Generated/shared data access libraries
supabase/migrations/ Versioned database schema and RPC changes
supabase/functions/ Supabase Edge Functions
tools/scripts/ Local Supabase, type generation, and maintenance scripts
tools/docker/ Container runtime and guarded local orchestration
npm install
npm run supabase:init
npm run supabase:start
npm run db:push:local
npm run db:types:local
npm run start
The web app runs at http://localhost:4200.
Local Supabase uses an isolated project id (spendist-app) and ports:
55321553225532355324The npm run start script checks whether the local Supabase stack is available before starting nx serve web.
The Docker workflow runs the production Angular build locally while keeping the existing Supabase CLI configuration as the source of truth for migrations, Auth, Storage, Realtime, and Edge Functions.
Install the repository dependencies once, then start the full local stack:
npm install
npm run docker:up
The command starts the isolated local Supabase project, applies pending local migrations, obtains its public browser configuration, builds the web image, and runs it through Docker Compose. It rejects remote Supabase URLs and never reads production credentials.
Local services are available at:
http://localhost:4200http://127.0.0.1:55321http://127.0.0.1:55323http://127.0.0.1:55324Stop the app and Supabase without deleting local database volumes:
npm run docker:down
Useful diagnostics:
docker compose ps
docker compose logs -f web
npm run supabase:status
SPENDIST_PORT changes the host port and SPENDIST_IMAGE changes the image
name used by Compose. The guarded npm script supplies the Compose-only
SPENDIST_DOCKER_SUPABASE_* variables so an unrelated repository .env cannot
silently select a remote backend. The runtime image itself accepts
SUPABASE_URL and SUPABASE_PUBLISHABLE_KEY;
NG_APP_SUPABASE_FUNCTIONS_URL and NG_APP_BUILD_COMMIT are optional.
NG_APP_TURNSTILE_SITE_KEY (optional) shows a Cloudflare Turnstile check on
sign-up, sign-in and password recovery; set it only when captcha is enabled in
your Supabase Auth with the matching secret key. Never pass a service-role or
secret key to the browser image.
GitHub Actions validates the image for pull requests and publishes
linux/amd64 and linux/arm64 variants to
ghcr.io/spendist-app/spendist. The master image is tagged latest,
develop is tagged develop, and v* Git tags produce semantic-version tags.
npm run start # guarded local Supabase startup + Angular dev server
npm run docker:up # local Supabase + production web image
npm run docker:down # stop local containers and preserve database data
npm run docker:test # Docker orchestration unit tests
npm run build # production Angular build
npm run build:worker # Cloudflare Worker-ready production build
npm run test # Vitest unit tests for web
npm run test:recurring-edge # recurring scheduling unit tests
npm run lint # ESLint for web
npm run lint:oxlint # Nx Oxlint tasks plus strict repository-wide checks
npm run e2e # Playwright E2E suite
npm run format:check # Prettier check
npm run mcp:build # build the local STDIO MCP server
npm run mcp:test # focused MCP unit tests
npm run mcp:worker:check # production-config Cloudflare Worker dry-run
npm run mcp:worker:deploy # deploy the authenticated remote MCP Worker
Build the local server with npm run mcp:build. The STDIO process needs SUPABASE_URL, SUPABASE_PUBLISHABLE_KEY, and a user access token in SPENDIST_ACCESS_TOKEN; optional MCP_CLIENT_ID labels metadata-only mutation audit entries. Keep the token in the MCP host's secret environment settings, never in a committed config file.
Example command for Codex and other clients that support a command-based STDIO server:
node /absolute/path/to/spendist/dist/apps/mcp/main.mjs
The production remote endpoint is https://mcp.spendist.app/mcp and advertises OAuth protected-resource metadata. It serves the stable MCP 2026-07-28 stateless protocol and keeps a stateless 2025-era fallback for older compatible clients; STDIO negotiates either era per connection. Compatible remote clients should discover Supabase OAuth, dynamically register, use authorization code with PKCE, and send the resulting bearer token. At this early product stage there is no separate staging Worker: local tests protect development, while a small invited group validates OAuth, reads, audited mutations, and guarded deletion directly on production before access is expanded.
mcp.spendist.app is a proxied Cloudflare DNS hostname with a zone Worker Route attached to the separate spendist-mcp Worker, not an alias to the web application. The DNS record is managed in the zone, while npm run mcp:worker:deploy deploys the Worker and attaches its route. The production workflow supplies the Supabase URL, publishable key, and derived OAuth issuer through an ephemeral secrets file during the same deploy, then verifies the health and OAuth metadata endpoints.
The integration supports profiles, reference data, transactions, recurring payments, summaries, places, notifications, read-only Allowance, audit metadata, and portable JSON export. Imports, account credentials, avatars, account deletion, and Allowance mutations remain application-only. MCP entity deletion always requires prepare_delete followed by confirm_delete.
Supabase workflow:
npm run supabase:status
npm run db:push:local
npm run db:reset:local
npm run db:types:local
npm run supabase:vault:local
Production is configured for Cloudflare Workers in wrangler.toml:
spendist-appspendist.app/*apps/web/worker.tsdist/apps/web/browserDeploy with:
npm run build:worker
npm run deploy:worker
Remote Supabase schema changes are managed through versioned files in supabase/migrations and should be synced with the configured remote database before deployment.
Before opening a PR, run the relevant checks:
npm run lint
npm run lint:oxlint
npm run test
npm run build
Oxlint runs beside ESLint; ESLint still checks Angular templates. All enabled
anti-slop rules are errors, and npm run lint:oxlint requires zero errors and
warnings across the repository, including tools and Supabase Edge Functions. The rules
are vendored under tools/oxlint/anti-slop/ with their upstream revision and
license. Type assertions require a specific SAFETY: comment describing the
invariant checked by the code. There is no warning baseline.
For database or generated-type changes, also run:
npm run db:push:local
npm run db:types:local
Please report vulnerabilities privately as described in SECURITY.md.
Spendist is released under the GNU General Public License v3.0.