No description
Find a file
2026-10-13 18:41:00 +02:00
gradle/wrapper gradle 2025-11-07 09:40:45 +01:00
src fix(shortcut): answer every failure with a readable json message 2026-10-13 18:41:00 +02:00
tools Fix UserPreferences failing to materialise 2026-08-10 15:11:00 +02:00
.gitattributes gradle 2025-11-07 09:40:45 +01:00
.gitignore user modul 2025-11-07 09:40:29 +01:00
build.gradle.kts feat(statement): monthly statement as json, html and scheduled email 2026-09-15 15:38:25 +02:00
compose.yaml Add transfers, category groups, and require auth on the API 2026-08-10 12:40:44 +02:00
core.log gradle 2025-11-07 09:40:45 +01:00
Dockerfile build(docker): run the api as a non-root user 2026-09-15 14:28:32 +02:00
gradlew Add transfers, category groups, and require auth on the API 2026-08-10 12:40:44 +02:00
gradlew.bat gradle 2025-11-07 09:40:45 +01:00
README.md docs: describe the api and close the security findings 2026-09-15 16:01:58 +02:00
SECURITY-REMEDIATION.md docs: describe the api and close the security findings 2026-09-15 16:01:58 +02:00
settings.gradle.kts gradle 2025-11-07 09:40:45 +01:00

Name and Slogan

Sumry - See your money. Understand it. Sumry - Your finances, summarized.

Core Identity

Sumry is a personal finance tracker that values calm over clutter.
It exists to make money management feel effortless — no walls of numbers, no manipulative gamification, no 20-step setup. Just understanding at a glance.

Tone: grounded, confident, human.

API

Spring Boot / Kotlin, PostgreSQL, Redis. Every route under /api needs a bearer token from POST /api/users/login except register (off by default) and /actuator/health.

Area Routes
Session users/login, users/logout, users/logout-all, users/password, users/preferences
Accounts users/accounts — CRUD, reconcile/{id} books the gap to the real balance; accounts carry a currency
Transactions transactions/ list, transactions/search (filtered, paged, with sums), transactions/quick (natural language), transfers, cashflow/{account}
Categories category/user, category/, category/label
Budgets budgets, budgets/progress?date= — periods, start day, rollover, pace
Planned planned, planned/{id}/book, planned/upcoming, planned/safe-to-spend; a job auto-books opted-in plans
Goals goals, goals/{id}/contribute
Rules rules, rules/test, rules/apply?dryRun=
Insights insights/subscriptions, insights/forecast
Import / export import/preview, import/commit (PostFinance, Revolut, generic CSV), `export/transactions.csv
Statement statement?month=, statement/html, statement/send (needs SUMRY_MAIL_*)
FX fx?base= — ECB rates via frankfurter.dev, cached in Redis

Money is numeric(14,2); each transaction stores its account currency, the rate at booking and baseAmount in the user's base currency, which is what every report sums. The schema is owned by Flyway (src/main/resources/db/migration); Hibernate only validates.

Environment

JWT_SECRET (base64, ≥32 bytes), JWT_EXPIRATION_MS, SUMRY_CORS_ALLOWED_ORIGINS, SUMRY_REGISTRATION_ENABLED, SPRINGDOC_ENABLED, and for the statement email SUMRY_MAIL_HOST/PORT/USER/PASSWORD/FROM plus SUMRY_STATEMENT_SCHEDULED=true to send on the 1st.

Building

./gradlew test
docker compose up -d --build     # local stack with Postgres and Redis