From baa267fd7388a1c70d8aa7d9a487eb9346c24c03 Mon Sep 17 00:00:00 2001 From: AshAlliants Date: Fri, 31 Jul 2026 19:54:45 +0100 Subject: [PATCH 1/7] fix(docker): run a passed command instead of always starting the server MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The entrypoint ignored "$@" entirely, so the documented setup step docker compose run --rm quidly npm run set-password ran migrations and then started Next rather than printing a password hash — breaking step 3 of the quickstart for every new self-hoster. Exec the passed command as the app user when there is one, after preparing /data but before migrate/seed, so one-shot commands don't touch the database. --- docker-entrypoint.sh | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/docker-entrypoint.sh b/docker-entrypoint.sh index 1b2be9a..139e74d 100755 --- a/docker-entrypoint.sh +++ b/docker-entrypoint.sh @@ -5,6 +5,14 @@ set -e mkdir -p "${UPLOAD_DIR:-/data/uploads}" chown -R node:node /data +# If a command was passed, run that instead of the server — this is what makes +# docker compose run --rm quidly npm run set-password +# work. Deliberately skips migrate/seed so one-shot commands don't touch the +# database. +if [ "$#" -gt 0 ]; then + exec gosu node "$@" +fi + echo "Quidly: applying database migrations..." gosu node npx prisma migrate deploy From 9fdade89cd5f90f2150bb8fcef4e06b353e59cf9 Mon Sep 17 00:00:00 2001 From: AshAlliants Date: Fri, 31 Jul 2026 19:54:45 +0100 Subject: [PATCH 2/7] fix(test): create the akaunting-migration dir before opening the test DB MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit apply.test.ts writes its scratch SQLite file into akaunting-migration/, which is git-ignored and therefore absent from a fresh clone. better-sqlite3 won't create the parent directory, so the suite failed to load with "Cannot open database because the directory does not exist" — 100% of the time in CI, and locally for anyone who hadn't run the migration tooling first. Its 4 tests now actually execute: 311 passing, 0 skipped. --- scripts/migrate-akaunting/apply.test.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/scripts/migrate-akaunting/apply.test.ts b/scripts/migrate-akaunting/apply.test.ts index 3a0cc1a..008afe2 100644 --- a/scripts/migrate-akaunting/apply.test.ts +++ b/scripts/migrate-akaunting/apply.test.ts @@ -2,8 +2,8 @@ import { describe, expect, it, beforeAll, afterAll } from "vitest"; import { PrismaBetterSqlite3 } from "@prisma/adapter-better-sqlite3"; import { PrismaClient } from "@prisma/client"; import Database from "better-sqlite3"; -import { readFileSync, readdirSync, rmSync } from "node:fs"; -import { join } from "node:path"; +import { mkdirSync, readFileSync, readdirSync, rmSync } from "node:fs"; +import { dirname, join } from "node:path"; import { applyPlan } from "./apply"; import type { SourceSnapshot, Mapping } from "./types"; @@ -11,6 +11,9 @@ const TMP = join(process.cwd(), "akaunting-migration", "test-apply.db"); let prisma: PrismaClient; beforeAll(async () => { + // akaunting-migration/ is git-ignored, so it doesn't exist in a fresh clone + // or in CI — better-sqlite3 won't create the parent directory itself. + mkdirSync(dirname(TMP), { recursive: true }); rmSync(TMP, { force: true }); // Build schema by executing every migration SQL in order. const raw = new Database(TMP); From f052564328c33143f5276338e8a49ad511aa6f01 Mon Sep 17 00:00:00 2001 From: AshAlliants Date: Fri, 31 Jul 2026 19:54:45 +0100 Subject: [PATCH 3/7] ci: add test/build workflow and publish a multi-arch image to GHCR MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit CI runs vitest, next build, and a new `typecheck` script on every push and PR, so the README can carry a live status badge instead of a hardcoded test count. Node 22 matches the Dockerfile runtime. Typecheck runs after the build so the generated route types under .next/types are on disk and get checked. The publish workflow pushes ghcr.io/warlaxz/quidly for main and v* tags, linux/amd64 + linux/arm64, with signed build provenance. Self-hosters can now `docker compose pull` rather than building from source — the first thing the r/selfhosted audience looks for. The image name is lowercased at runtime because GHCR rejects uppercase and the owner is "WarlaxZ". --- .github/workflows/ci.yml | 54 +++++++++++++++++ .github/workflows/docker-publish.yml | 87 ++++++++++++++++++++++++++++ package.json | 1 + 3 files changed, 142 insertions(+) create mode 100644 .github/workflows/ci.yml create mode 100644 .github/workflows/docker-publish.yml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..04a59c8 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,54 @@ +name: CI + +on: + push: + branches: [main] + pull_request: + workflow_dispatch: + +# A newer push to the same branch supersedes an in-flight run. +concurrency: + group: ci-${{ github.ref }} + cancel-in-progress: true + +jobs: + test: + name: Test, typecheck & build + runs-on: ubuntu-latest + + env: + # Throwaway SQLite file and secret — CI never touches real data. + DATABASE_URL: file:./ci.db + SESSION_SECRET: ci-session-secret-at-least-32-characters-long + + steps: + - uses: actions/checkout@v7 + + # Node 22 matches the Dockerfile's runtime, so CI fails on the same + # things production does. + - uses: actions/setup-node@v7 + with: + node-version: 22 + cache: npm + + - name: Install dependencies + run: npm ci + + # Prisma v7: the datasource URL comes from prisma.config.ts, and + # migrations are hand-authored SQL applied with `migrate deploy`. + - name: Generate Prisma client + run: npx prisma generate + + - name: Apply migrations + run: npx prisma migrate deploy + + - name: Test + run: npm test + + - name: Build + run: npm run build + + # After `next build`, so the generated route types under .next/types are + # on disk and get checked too. + - name: Typecheck + run: npm run typecheck diff --git a/.github/workflows/docker-publish.yml b/.github/workflows/docker-publish.yml new file mode 100644 index 0000000..9b2f93a --- /dev/null +++ b/.github/workflows/docker-publish.yml @@ -0,0 +1,87 @@ +name: Publish container + +on: + push: + branches: [main] + tags: ["v*"] + workflow_dispatch: + +env: + REGISTRY: ghcr.io + +concurrency: + group: publish-${{ github.ref }} + cancel-in-progress: false + +jobs: + publish: + name: Build & push to GHCR + runs-on: ubuntu-latest + + permissions: + contents: read + packages: write + id-token: write + attestations: write + + steps: + - uses: actions/checkout@v7 + + # GHCR rejects uppercase image names, and this repo's owner is "WarlaxZ". + # Derive it rather than hardcoding so forks publish to their own namespace. + - name: Lowercase the image name + id: img + run: echo "name=${GITHUB_REPOSITORY,,}" >> "$GITHUB_OUTPUT" + + # arm64 is emulated. better-sqlite3 normally resolves a prebuilt binary + # so this stays tolerable, but the arm leg is still the slow one. If it + # becomes a problem, split into a matrix across ubuntu-latest and + # ubuntu-24.04-arm and merge the digests with `docker buildx imagetools`. + - uses: docker/setup-qemu-action@v4 + with: + platforms: arm64 + + - uses: docker/setup-buildx-action@v4 + + - uses: docker/login-action@v4 + with: + registry: ${{ env.REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Derive tags and labels + id: meta + uses: docker/metadata-action@v6 + with: + images: ${{ env.REGISTRY }}/${{ steps.img.outputs.name }} + tags: | + type=semver,pattern={{version}} + type=semver,pattern={{major}}.{{minor}} + type=raw,value=latest,enable={{is_default_branch}} + type=sha,format=short + labels: | + org.opencontainers.image.title=Quidly + org.opencontainers.image.description=Free, self-hosted UK-landlord bookkeeping and tax — Self-Assessment, sorted. + org.opencontainers.image.licenses=AGPL-3.0-or-later + + - name: Build and push + id: build + uses: docker/build-push-action@v7 + with: + context: . + platforms: linux/amd64,linux/arm64 + push: true + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + cache-from: type=gha + cache-to: type=gha,mode=max + + # Signed provenance, so operators can verify the image was built from + # this repo rather than pushed by hand: + # gh attestation verify oci://ghcr.io/warlaxz/quidly:latest -R WarlaxZ/quidly + - name: Attest provenance + uses: actions/attest-build-provenance@v4 + with: + subject-name: ${{ env.REGISTRY }}/${{ steps.img.outputs.name }} + subject-digest: ${{ steps.build.outputs.digest }} + push-to-registry: true diff --git a/package.json b/package.json index f68364e..808f4b0 100644 --- a/package.json +++ b/package.json @@ -8,6 +8,7 @@ "start": "next start", "test": "vitest run", "test:watch": "vitest", + "typecheck": "tsc --noEmit", "db:migrate": "prisma migrate dev", "db:seed": "prisma db seed", "db:studio": "prisma studio", From ecb4b8ca18a8976cf36a610ac2e72fb998c7f678 Mon Sep 17 00:00:00 2001 From: AshAlliants Date: Fri, 31 Jul 2026 19:55:03 +0100 Subject: [PATCH 4/7] chore(github): add community health files and issue templates MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit GitHub surfaces these in the issue/PR UI and in its community-standards checklist, and their absence reads as an unmaintained project to anyone evaluating whether to trust the app with their tax records. Templates capture the things a diagnosis almost always turns on — install method, version, and tax year — and route security reports to a private advisory rather than a public issue. The tax-accuracy template requires an HMRC source link, which makes a wrong-figure report actionable instead of a disagreement. CONTRIBUTING records the conventions that already govern the codebase (integer pence, hand-authored Prisma SQL, Next 16 docs) and states the deliberate scope limits: single-user per install, UK-only. FUNDING.yml is left commented out — uncomment a platform once one is set up. --- .github/CODE_OF_CONDUCT.md | 42 ++++++++ .github/CONTRIBUTING.md | 73 +++++++++++++ .github/FUNDING.yml | 8 ++ .github/ISSUE_TEMPLATE/bug_report.yml | 118 +++++++++++++++++++++ .github/ISSUE_TEMPLATE/config.yml | 15 +++ .github/ISSUE_TEMPLATE/feature_request.yml | 65 ++++++++++++ .github/ISSUE_TEMPLATE/tax_accuracy.yml | 105 ++++++++++++++++++ .github/PULL_REQUEST_TEMPLATE.md | 24 +++++ .github/SECURITY.md | 57 ++++++++++ 9 files changed, 507 insertions(+) create mode 100644 .github/CODE_OF_CONDUCT.md create mode 100644 .github/CONTRIBUTING.md create mode 100644 .github/FUNDING.yml create mode 100644 .github/ISSUE_TEMPLATE/bug_report.yml create mode 100644 .github/ISSUE_TEMPLATE/config.yml create mode 100644 .github/ISSUE_TEMPLATE/feature_request.yml create mode 100644 .github/ISSUE_TEMPLATE/tax_accuracy.yml create mode 100644 .github/PULL_REQUEST_TEMPLATE.md create mode 100644 .github/SECURITY.md diff --git a/.github/CODE_OF_CONDUCT.md b/.github/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..11a1798 --- /dev/null +++ b/.github/CODE_OF_CONDUCT.md @@ -0,0 +1,42 @@ +# Code of Conduct + +## The short version + +Be decent. Assume the person on the other end is acting in good faith and is +busy. Quidly is a small project maintained in someone's spare time. + +## Expected behaviour + +- Keep criticism about the code, not the person. +- Accept that "no" is a legitimate answer to a feature request, and that + maintainers get to scope their own project. +- Remember that people file issues about their own tax affairs. Treat financial + details someone shares in an issue as something they trusted you with, and + don't repost it elsewhere. + +## Unacceptable behaviour + +- Harassment, insults, or personal attacks. +- Discriminatory language or imagery, or unwelcome sexual attention. +- Publishing others' private information without permission. +- Sustained disruption of discussions, or demanding free labour. + +## Scope + +This applies to all project spaces — issues, pull requests, discussions, +commit messages — and to public spaces when someone is representing the project. + +## Enforcement + +Report problems to the maintainer via +[a private security advisory](https://github.com/WarlaxZ/quidly/security/advisories/new) +if the report itself is sensitive, or by opening an issue if it isn't. + +The maintainer may warn, edit or remove contributions, or block accounts. +Enforcement decisions rest with the maintainer, who will act in proportion to +what happened. + +## Attribution + +Adapted in spirit from the [Contributor Covenant](https://www.contributor-covenant.org), +shortened to match the size of the project. diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md new file mode 100644 index 0000000..9fc808f --- /dev/null +++ b/.github/CONTRIBUTING.md @@ -0,0 +1,73 @@ +# Contributing to Quidly + +Thanks for taking an interest. Quidly is a self-hosted bookkeeping app for UK +landlords, and it deals with people's tax returns — so correctness matters more +here than velocity. + +## Ground rules + +- **Money is integer pence, end-to-end.** There is no floating-point arithmetic + anywhere in the money path. If a change introduces a `number` that represents + a fractional currency amount, it will be rejected. Store pence, format at the + edge. +- **Tax logic needs a test and a source.** Any change to rates, bands, or + thresholds must cite the HMRC page it came from in the PR description, and + come with a test that pins the expected figure. +- **This is not the Next.js you may know.** Quidly is on Next.js 16. Read the + relevant guide under `node_modules/next/dist/docs/` before writing app code — + APIs and conventions differ from older versions. +- **Prisma v7 conventions.** The datasource URL lives in `prisma.config.ts`. + Migrations are hand-authored SQL applied with `prisma migrate deploy` — not + `migrate dev`. + +## Getting set up + +```bash +npm install +npm run set-password # paste the DEV (backslash-escaped) hash into .env +# .env also needs SESSION_SECRET=... (openssl rand -base64 32) and DATABASE_URL="file:./dev.db" +npx prisma migrate deploy +npx prisma db seed +npm run dev # http://localhost:3000 +``` + +## Before you open a PR + +```bash +npm test # vitest +npm run typecheck # tsc --noEmit +npm run build # next build +``` + +All three run in CI on every PR. Green locally means green there. + +## Scope + +Quidly is deliberately **single-user per install** and **UK-first**. Two kinds +of proposal are usually out of scope: + +- Multi-tenancy, user management, or role systems. +- Tax regimes for other countries. + +If you want either, a fork is a completely reasonable answer — the AGPL exists +for exactly that. + +Good places to start, in rough order of how much they help: + +1. **Tax-year rates.** Each April, rates and thresholds change. Updating a rate + year is well-scoped and high-value. +2. **Bank CSV formats.** More UK bank export formats parsed out of the box. +3. **Bug reports with a reproduction.** Genuinely valuable even without a fix. + +## Reporting bugs + +Use the issue templates — they ask for the version, whether you're on Docker or +a dev install, and the tax year, which is almost always what a diagnosis turns +on. For anything security-related, see [SECURITY.md](SECURITY.md) instead; do +not open a public issue. + +## Licence + +Quidly is AGPL-3.0. By contributing you agree your contribution is licensed +under the same terms. Note the AGPL's network clause: if you run a modified +Quidly as a service that others use, you must offer them your changes. diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 0000000..75e2448 --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,8 @@ +# Uncomment a line once the corresponding account is set up. GitHub shows a +# "Sponsor" button on the repo for whichever of these are populated, and an +# unconfigured platform is left out rather than shown as broken. +# +# github: [WarlaxZ] # requires GitHub Sponsors to be enabled first +# ko_fi: yourhandle +# buy_me_a_coffee: yourhandle +# custom: ["https://example.com/sponsor-quidly"] diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml new file mode 100644 index 0000000..13538bd --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -0,0 +1,118 @@ +name: Bug report +description: Something isn't working the way it should +labels: ["bug"] +body: + - type: markdown + attributes: + value: | + Thanks for reporting this. Please don't paste real financial data — + redact figures and addresses, or make up equivalent numbers. + + If this is a security issue, **stop** and use + [private vulnerability reporting](https://github.com/WarlaxZ/quidly/security/advisories/new) + instead. + + - type: textarea + id: what-happened + attributes: + label: What happened + description: What did you see, and what did you expect instead? + validations: + required: true + + - type: textarea + id: steps + attributes: + label: Steps to reproduce + placeholder: | + 1. Go to Transactions + 2. Add an expense of £120 against property X + 3. Open the SA105 page + 4. Box 20 shows £0 instead of £120 + validations: + required: true + + - type: dropdown + id: install-method + attributes: + label: How are you running Quidly? + options: + - Docker (docker compose) + - Docker (ghcr.io image) + - Local dev (npm run dev) + - Local production (npm run build && npm start) + - Other + validations: + required: true + + - type: input + id: version + attributes: + label: Version or commit + description: The release tag, image tag, or `git rev-parse --short HEAD`. + placeholder: v0.1.0 + validations: + required: true + + - type: dropdown + id: area + attributes: + label: Which part of the app? + options: + - Bookkeeping (transactions, recurring, vendors) + - Bank CSV import + - Receipt scanning (AI extraction) + - SA105 / personal tax + - Limited company (corporation tax, dividends, director's loan) + - What-if planner / salary-vs-dividend optimiser + - Deductions assistant (mileage, use of home) + - Akaunting migration + - Auth / login / sessions + - Setup, Docker, or configuration + - UI / theming + - Something else + validations: + required: true + + - type: dropdown + id: tax-year + attributes: + label: Tax year involved + description: Leave as N/A if this isn't a tax calculation issue. + options: + - N/A + - 2025-26 + - 2026-27 + - 2027-28 + - Earlier year + validations: + required: true + + - type: textarea + id: logs + attributes: + label: Logs + description: > + Relevant output from `docker compose logs quidly` or the dev server, plus + any browser console errors. Redact secrets. + render: shell + + - type: textarea + id: environment + attributes: + label: Environment + placeholder: | + Host OS: Debian 12 + Browser: Firefox 141 + Reverse proxy: Caddy + COOKIE_SECURE: unset + + - type: checkboxes + id: checks + attributes: + label: Before submitting + options: + - label: I searched existing issues and this isn't a duplicate + required: true + - label: I've removed any real financial or personal data from this report + required: true diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000..d983ac3 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,15 @@ +blank_issues_enabled: false +contact_links: + - name: Question or setup help + url: https://github.com/WarlaxZ/quidly/discussions + about: > + Ask in Discussions rather than opening an issue — setup, Docker, and + "how do I record X" questions are answered there. + - name: Report a security vulnerability + url: https://github.com/WarlaxZ/quidly/security/advisories/new + about: Please report privately, not in a public issue. + - name: Official HMRC guidance + url: https://www.gov.uk/renting-out-a-property + about: > + Quidly produces estimates, not tax advice. For what you actually owe, + check HMRC or ask an accountant. diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml new file mode 100644 index 0000000..fe73e54 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -0,0 +1,65 @@ +name: Feature request +description: Suggest something Quidly should do +labels: ["enhancement"] +body: + - type: markdown + attributes: + value: | + Before writing this up, note two things that are **deliberately out of + scope**: multi-user / multi-tenant support (each install is single-user), + and tax regimes for countries other than the UK. Requests for either will + be closed — though forking is a perfectly good answer, and the AGPL is + there for that. + + - type: textarea + id: problem + attributes: + label: What problem are you hitting? + description: > + Describe the situation rather than the solution. "I have three properties + with different mortgage rates and can't see which is loss-making" is more + useful than "add a per-property P&L chart". + validations: + required: true + + - type: textarea + id: proposal + attributes: + label: What would you like Quidly to do? + validations: + required: true + + - type: dropdown + id: area + attributes: + label: Which part of the app? + options: + - Bookkeeping (transactions, recurring, vendors) + - Bank CSV import + - Receipt scanning (AI extraction) + - SA105 / personal tax + - Limited company + - What-if planner / optimiser + - Deductions assistant + - Migration from other software + - Setup, Docker, or configuration + - UI / theming + - Something else + validations: + required: true + + - type: textarea + id: workaround + attributes: + label: How are you working around it today? + description: Spreadsheet, another tool, manual calculation, not at all? + + - type: checkboxes + id: checks + attributes: + label: Before submitting + options: + - label: I searched existing issues and discussions for this idea + required: true + - label: This isn't multi-user support or a non-UK tax regime + required: true diff --git a/.github/ISSUE_TEMPLATE/tax_accuracy.yml b/.github/ISSUE_TEMPLATE/tax_accuracy.yml new file mode 100644 index 0000000..87d48df --- /dev/null +++ b/.github/ISSUE_TEMPLATE/tax_accuracy.yml @@ -0,0 +1,105 @@ +name: Tax calculation or rate issue +description: A figure Quidly produces looks wrong, or a rate needs updating +labels: ["bug", "tax-accuracy"] +body: + - type: markdown + attributes: + value: | + Tax accuracy reports are the most useful issues this project gets. + + Quidly produces **estimates, not advice** — but an estimate should still + be right. Please use made-up round numbers that still show the problem + rather than your real figures. + + - type: dropdown + id: calculation + attributes: + label: Which calculation? + options: + - SA105 box value + - £1,000 property allowance + - Section 24 finance-cost reducer + - Income tax bands (rUK) + - Income tax bands (Scottish) + - National Insurance + - Corporation tax / marginal relief + - Dividend tax + - Director's loan (s455 or benefit-in-kind) + - Mileage allowance + - Use of home + - Salary-vs-dividend optimiser + - What-if planner + - Something else + validations: + required: true + + - type: dropdown + id: tax-year + attributes: + label: Tax year + options: + - 2025-26 + - 2026-27 + - 2027-28 + - Earlier year + validations: + required: true + + - type: textarea + id: inputs + attributes: + label: Inputs + description: The figures you entered, using illustrative round numbers. + placeholder: | + Rental income: £12,000 + Mortgage interest: £4,000 + Allowable expenses: £2,000 + Other (employment) income: £30,000 + Property allowance: not claimed + validations: + required: true + + - type: input + id: expected + attributes: + label: Expected figure + placeholder: "£1,600 finance-cost reducer" + validations: + required: true + + - type: input + id: actual + attributes: + label: Figure Quidly produced + placeholder: "£800" + validations: + required: true + + - type: textarea + id: source + attributes: + label: Source + description: > + Link the HMRC page, helpsheet, or SA105 note supporting the expected + figure. This is what makes the fix verifiable — please don't skip it. + placeholder: https://www.gov.uk/guidance/income-tax-when-you-rent-out-a-property-working-out-your-rental-income + validations: + required: true + + - type: input + id: version + attributes: + label: Version or commit + placeholder: v0.1.0 + validations: + required: true + + - type: checkboxes + id: checks + attributes: + label: Before submitting + options: + - label: The figures above are illustrative, not my real tax data + required: true + - label: I understand Quidly gives estimates and is not affiliated with HMRC + required: true diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..68f8ba8 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,24 @@ +## What this changes + + + +## Why + + + +## Checklist + +- [ ] `npm test` passes +- [ ] `npm run typecheck` passes +- [ ] `npm run build` passes +- [ ] Any money value added or changed is **integer pence**, not a float +- [ ] Tax rates / bands / thresholds cite an HMRC source above, and have a test + pinning the expected figure +- [ ] New Prisma migrations are hand-authored SQL, applied with `migrate deploy` +- [ ] Docs updated (`README.md`, `.env.example`, or `docs/`) if behaviour or + configuration changed + +## Screenshots + + diff --git a/.github/SECURITY.md b/.github/SECURITY.md new file mode 100644 index 0000000..5b4a0a9 --- /dev/null +++ b/.github/SECURITY.md @@ -0,0 +1,57 @@ +# Security Policy + +Quidly holds financial records and is designed to be exposed to a network, so +security reports are welcome and taken seriously. + +## Reporting a vulnerability + +**Please do not open a public issue.** + +Report privately via GitHub's +[private vulnerability reporting](https://github.com/WarlaxZ/quidly/security/advisories/new) +— that opens a draft advisory only you and the maintainer can see. + +Please include: + +- What the issue is and roughly how bad you think it is. +- Steps to reproduce, or a proof of concept. +- The Quidly version or commit, and whether you're running Docker or a dev install. +- Whether you're behind a reverse proxy, and whether `COOKIE_SECURE` is set. + +You can expect an acknowledgement within a few days. Because Quidly is +maintained by one person in their own time, a fix may take longer than that — +you'll get an honest estimate rather than silence. + +## Supported versions + +Quidly is pre-1.0 and ships from `main`. Only the latest release receives +security fixes; there are no maintained backport branches. + +## Scope + +In scope: + +- Authentication and session handling (iron-session, argon2id password hashing). +- Authorisation gaps that expose data across properties or companies. +- SQL injection, XSS, CSRF, SSRF, path traversal. +- Anything that leaks financial data, uploaded receipts, or the session secret. +- Container issues, e.g. unnecessary privilege in the runtime image. + +Out of scope — these are documented design decisions, not bugs: + +- **Single-user by design.** Each install has one account. "A logged-in user can + see all the data in the install" is the intended behaviour. +- **`COOKIE_SECURE=false` weakens cookies.** That is the documented trade-off + for plain HTTP on a trusted LAN. Deployments behind HTTPS should leave it unset. +- Running Quidly on the public internet without a TLS-terminating proxy. +- Missing rate limiting on login for a single-user LAN app — though a concrete + attack here is still worth reporting. + +## Hardening notes for operators + +- Serve behind HTTPS (see the Caddy example in the README) and leave + `COOKIE_SECURE` unset. +- `SESSION_SECRET` should be 32+ random characters, e.g. `openssl rand -base64 32`. +- Back up the `quidly-data` volume — it holds the SQLite database and uploads. +- If you set `ANTHROPIC_API_KEY` for receipt scanning, receipt images are sent + to Anthropic's API. Leave it unset if that is not acceptable to you. From a0c24ed1c7ee8f0384a41cfda256172a99fced8a Mon Sep 17 00:00:00 2001 From: AshAlliants Date: Fri, 31 Jul 2026 19:55:03 +0100 Subject: [PATCH 5/7] chore(brand): add a 1280x640 social preview card MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Every share on Reddit, HN, Discord or X currently renders GitHub's grey auto-generated card. This uses the app's own tokens — forest #1f3d30, cream #f4f1e6, ochre rule, Fraunces + Hanken Grotesk — so a shared link looks like the product. The generating HTML is committed alongside it so the card can be regenerated rather than reverse-engineered. GitHub has no API for social preview images, so the PNG still has to be uploaded via repo Settings by hand. --- docs/social-preview.html | 124 +++++++++++++++++++++++++++++++++++++++ docs/social-preview.png | Bin 0 -> 129472 bytes 2 files changed, 124 insertions(+) create mode 100644 docs/social-preview.html create mode 100644 docs/social-preview.png diff --git a/docs/social-preview.html b/docs/social-preview.html new file mode 100644 index 0000000..ae4dd98 --- /dev/null +++ b/docs/social-preview.html @@ -0,0 +1,124 @@ + + + + + + + + + +
+
+
+ +
+
+
+
£
+
Quidly
+
+
github.com/WarlaxZ/quidly
+
+ +
+
Self-Assessment, sorted.
+
+
Free, self-hosted bookkeeping & tax for UK landlords.
+
+ +
+
SA105 & PDF export
+
Section 24 relief
+
Multi-property
+
Limited companies
+
Docker
+
+
+
+ + diff --git a/docs/social-preview.png b/docs/social-preview.png new file mode 100644 index 0000000000000000000000000000000000000000..1440d50e0b5b2eba80c4d3b1f4e7aeb5cf865555 GIT binary patch literal 129472 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 Date: Fri, 31 Jul 2026 19:55:03 +0100 Subject: [PATCH 6/7] docs(readme): fix stale claims, lead with the container, add comparison MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Corrections: - Tests badge claimed "261 passing" while the dev section said "198 tests"; the real count is 311. Replaced with a live CI badge that can't go stale. - Rates are configured for 2025-26, 2026-27 and 2027-28, not just 2025-26 — the old text undersold three years of work (see CONFIGURED_TAX_YEARS). Additions for discovery and conversion: - Quick start is now `docker compose pull`-based, with the build-from-source path kept for people who won't run someone else's binary. - A comparison table, and "who it's for" phrased the way people search: buy-to-let, HMO, portfolio, Self Assessment, SA105, Section 24. - An explicit statement that Quidly does not file with HMRC and cannot make Making Tax Digital submissions, since that's the first question a landlord reading this in 2026 will have. Alternatives are compared as categories rather than named products, so the table can't go stale or misstate a competitor's feature set. --- README.md | 151 +++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 132 insertions(+), 19 deletions(-) diff --git a/README.md b/README.md index 9b6a036..a4b47aa 100644 --- a/README.md +++ b/README.md @@ -2,12 +2,18 @@ **Self-Assessment, sorted.** — free, self-hosted UK-landlord bookkeeping and tax. -![Licence: AGPL-3.0](https://img.shields.io/badge/licence-AGPL--3.0-1f3d30) +[![CI](https://github.com/WarlaxZ/quidly/actions/workflows/ci.yml/badge.svg)](https://github.com/WarlaxZ/quidly/actions/workflows/ci.yml) +[![Latest release](https://img.shields.io/github/v/release/WarlaxZ/quidly?color=1f3d30&label=release)](https://github.com/WarlaxZ/quidly/releases) +[![Container](https://img.shields.io/badge/ghcr.io-warlaxz%2Fquidly-2496ed?logo=docker&logoColor=white)](https://github.com/WarlaxZ/quidly/pkgs/container/quidly) +[![Licence: AGPL-3.0](https://img.shields.io/badge/licence-AGPL--3.0-1f3d30)](LICENSE) ![Next.js 16](https://img.shields.io/badge/Next.js-16-000) ![SQLite](https://img.shields.io/badge/db-SQLite-044a64) -![Tests](https://img.shields.io/badge/tests-261%20passing-3a7d54) -Quidly is a self-hosted bookkeeping app built for UK landlords: track rent and expenses across your properties, then turn them into an SA105 you can file. Run it on your own box, keep your own data. +Quidly is a self-hosted **bookkeeping and tax app for UK landlords**: track rent +and expenses across your properties, then turn them into an **SA105** you can +file with your **Self Assessment** tax return. It handles the **£1,000 property +allowance**, the **Section 24** finance-cost reducer, **Scottish tax bands**, and +limited-company landlords too. Run it on your own box, keep your own data. ## Screenshots @@ -19,9 +25,54 @@ Quidly is a self-hosted bookkeeping app built for UK landlords: track rent and e +## Quick start + +```bash +mkdir quidly && cd quidly +curl -O https://raw.githubusercontent.com/WarlaxZ/quidly/main/docker-compose.yml +curl -o .env https://raw.githubusercontent.com/WarlaxZ/quidly/main/.env.example +# set SESSION_SECRET in .env, then generate a login: +docker compose run --rm quidly npm run set-password # paste the Docker-Compose hash into .env +docker compose up -d # open http://localhost:3000 +``` + +That pulls the prebuilt multi-arch image (`linux/amd64` and `linux/arm64`, so a +Raspberry Pi or ARM VPS works). See [Self-hosting](#self-hosting-with-docker) +for the `$` gotcha, HTTPS, and building from source instead. + +## Who it's for + +Landlords who file their own **Self Assessment** and would rather not keep the +books in a spreadsheet — whether that's one buy-to-let, an HMO, or a portfolio +across several properties, held personally or through a limited company. + +If you're currently on **Akaunting**, there's a +[migration path](#migrating-from-akaunting) that brings your transactions, +vendors and categories across. + ## What it is -Quidly is free and self-hosted, with a UK-first design. **Money is stored as integer pence end-to-end** — there is no floating-point arithmetic in the money path, so nothing drifts or rounds unexpectedly. Each install is **single-user**. Quidly is **not affiliated with HMRC**; it produces estimates, not tax advice. +Quidly is free and self-hosted, with a UK-first design. **Money is stored as +integer pence end-to-end** — there is no floating-point arithmetic in the money +path, so nothing drifts or rounds unexpectedly. Each install is **single-user**. +Quidly is **not affiliated with HMRC**; it produces estimates, not tax advice. + +## How it compares + +| | Quidly | Spreadsheet | Landlord SaaS | General accounting software | +| --- | :---: | :---: | :---: | :---: | +| Cost | Free | Free | Monthly subscription | Monthly subscription | +| Your data stays on your hardware | ✅ | ✅ | ❌ | ❌ | +| Knows what an SA105 box is | ✅ | ❌ | Varies | ❌ | +| Section 24 finance-cost reducer | ✅ | Manual | Varies | ❌ | +| Scottish tax bands | ✅ | Manual | Varies | Varies | +| Limited-company landlord support | ✅ | Manual | Varies | ✅ | +| Won't silently mis-round your figures | ✅ | ❌ | — | — | +| Multi-user / multi-tenant | ❌ | — | ✅ | ✅ | +| Files directly with HMRC | ❌ | ❌ | Varies | Varies | + +Deliberate trade-offs, not oversights: Quidly is single-user per install, UK-only, +and produces figures and a PDF rather than submitting to HMRC for you. ## Features @@ -29,23 +80,46 @@ Quidly is free and self-hosted, with a UK-first design. **Money is stored as int - **Receipt scanning** — optional AI extraction using your own Anthropic key. - **SA105 & personal tax** — £1,000 property allowance, Section 24 finance-cost reducer, Scottish bands, and SA105 PDF export. - **Limited companies** — corporation tax (including marginal relief), dividends, director's loan s455 + benefit-in-kind. +- **Deductions assistant** — mileage log and use-of-home claims. - **Plan ahead** — a what-if planner plus a salary-vs-dividend optimiser. - **Light & dark themes.** -## Self-host with Docker (recommended) +## Self-hosting with Docker + +The [Quick start](#quick-start) above pulls +[`ghcr.io/warlaxz/quidly`](https://github.com/WarlaxZ/quidly/pkgs/container/quidly). +To build from this checkout instead: ```bash git clone https://github.com/WarlaxZ/quidly.git && cd quidly cp .env.example .env # then set SESSION_SECRET -docker compose run --rm quidly npm run set-password # paste the Docker-Compose hash into .env -docker compose up -d # open http://localhost:3000 +docker compose -f docker-compose.yml -f docker-compose.build.yml run --rm quidly npm run set-password +docker compose -f docker-compose.yml -f docker-compose.build.yml up -d --build ``` -**Password hash & the `$` gotcha.** Docker Compose interpolates bare `$` in `env_file` values as variable references and strips them. Put the argon2 hash in `.env` with **each `$` doubled** (`$$`). `set-password` prints exactly that "Docker-Compose" form for you — it prints three forms in total: the dev backslash-escaped form, the Docker-Compose doubled form, and the raw unescaped hash. Use the Docker-Compose one here. +**Password hash & the `$` gotcha.** Docker Compose interpolates bare `$` in +`env_file` values as variable references and strips them. Put the argon2 hash in +`.env` with **each `$` doubled** (`$$`). `set-password` prints exactly that +"Docker-Compose" form for you — it prints three forms in total: the dev +backslash-escaped form, the Docker-Compose doubled form, and the raw unescaped +hash. Use the Docker-Compose one here. -**Data persists** in the `quidly-data` Docker volume — the SQLite database and uploads both live under `/data`, so they survive restarts and upgrades. +**Data persists** in the `quidly-data` Docker volume — the SQLite database and +uploads both live under `/data`, so they survive restarts and upgrades. Back that +volume up. -**`COOKIE_SECURE`.** Leave it unset (the secure default) when serving behind HTTPS. Set `COOKIE_SECURE=false` **only** if you serve plain HTTP on a trusted LAN, otherwise login cookies won't be sent. +**Upgrading.** `docker compose pull && docker compose up -d`. Migrations run +automatically on start. + +**`COOKIE_SECURE`.** Leave it unset (the secure default) when serving behind +HTTPS. Set `COOKIE_SECURE=false` **only** if you serve plain HTTP on a trusted +LAN, otherwise login cookies won't be sent. + +**Verifying the image.** Published images carry signed build provenance: + +```bash +gh attestation verify oci://ghcr.io/warlaxz/quidly:latest -R WarlaxZ/quidly +``` ## HTTPS reverse proxy (Caddy) @@ -55,7 +129,9 @@ quidly.example.com { } ``` -Caddy auto-provisions and renews TLS certificates for you. Behind HTTPS, leave `COOKIE_SECURE` unset. Traefik and nginx work equally well — just point the proxy at `localhost:3000`. +Caddy auto-provisions and renews TLS certificates for you. Behind HTTPS, leave +`COOKIE_SECURE` unset. Traefik and nginx work equally well — just point the proxy +at `localhost:3000`. ## Local development @@ -66,16 +142,25 @@ npm run set-password # paste the DEV (backslash-escaped) hash into .e npx prisma migrate deploy # apply migrations (Prisma v7: hand-authored SQL) npx prisma db seed # seed HMRC categories npm run dev # http://localhost:3000 -npm test # 198 tests + +npm test # vitest +npm run typecheck # tsc --noEmit +npm run build # next build ``` -Prisma v7 note: the datasource URL is configured in `prisma.config.ts` (read from `DATABASE_URL`), and migrations are hand-authored SQL applied with `migrate deploy` — **not** `migrate dev`. +Prisma v7 note: the datasource URL is configured in `prisma.config.ts` (read from +`DATABASE_URL`), and migrations are hand-authored SQL applied with +`migrate deploy` — **not** `migrate dev`. + +See [CONTRIBUTING.md](.github/CONTRIBUTING.md) for conventions — in particular the +integer-pence rule and the requirement that tax-rate changes cite an HMRC source. ## Migrating from Akaunting Import your existing Akaunting data (transactions, vendors, categories) into Quidly. -**Prerequisites:** Docker (for the analyse step) and a MySQL/MariaDB dump of your Akaunting database (`.sql`). +**Prerequisites:** Docker (for the analyse step) and a MySQL/MariaDB dump of your +Akaunting database (`.sql`). ```bash # 1. Analyse the dump — loads it into a throwaway MariaDB and writes a review pack @@ -92,7 +177,12 @@ npm run migrate:akaunting:apply npm run migrate:akaunting:apply -- --attachments-dir /path/to/akaunting/storage ``` -Each Akaunting *company* becomes a Quidly *property*, categories are mapped onto SA105 boxes (you review the suggestions), and recurring items carry across. Amounts are treated as GBP; non-GBP transactions are listed and skipped. The import is idempotent — re-running is safe and never duplicates (imported rows are tagged with an `externalRef`). Files under `akaunting-migration/` are git-ignored as they may contain financial data. +Each Akaunting *company* becomes a Quidly *property*, categories are mapped onto +SA105 boxes (you review the suggestions), and recurring items carry across. +Amounts are treated as GBP; non-GBP transactions are listed and skipped. The +import is idempotent — re-running is safe and never duplicates (imported rows are +tagged with an `externalRef`). Files under `akaunting-migration/` are git-ignored +as they may contain financial data. **📖 Full walkthrough: [docs/migrating-from-akaunting.md](docs/migrating-from-akaunting.md)** — how to export your Akaunting dump, review the category mapping, handle recurring items and attachments, and troubleshoot. @@ -108,17 +198,40 @@ Each Akaunting *company* becomes a Quidly *property*, categories are mapped onto | `DATABASE_URL` | Set by Docker | SQLite connection string. Dev default `file:./dev.db`; Docker sets `file:/data/quidly.db`. | | `UPLOAD_DIR` | Set by Docker | Upload directory. Dev default `./uploads`; Docker sets `/data/uploads`. | | `COOKIE_SECURE` | Optional | Set to `false` only for plain-HTTP on a trusted LAN. Leave unset behind HTTPS. | -| `ANTHROPIC_API_KEY` | Optional | Enables AI receipt scanning, using your own Anthropic key. | +| `ANTHROPIC_API_KEY` | Optional | Enables AI receipt scanning, using your own Anthropic key. Receipt images are sent to Anthropic; leave unset to keep everything local. | | `EXTRACTION_MODEL` | Optional | Vision model for receipt extraction. Defaults to a cheap vision-capable Claude model. | ## Tech stack -Next.js 16 (App Router) · Prisma v7 + SQLite (better-sqlite3 adapter) · Tailwind v4 · iron-session + argon2id · Vitest · Docker. +Next.js 16 (App Router) · Prisma v7 + SQLite (better-sqlite3 adapter) · Tailwind +v4 · iron-session + argon2id · Vitest · Docker. ## Tax accuracy & caveats -Quidly produces **estimates, not advice** — verify HMRC rates each April against the official guidance. It is currently configured for the **2025-26** tax year; other years fall back to 2025-26 with an in-app notice. Each install is single-tenant. +Quidly produces **estimates, not advice** — verify HMRC rates each April against +the official guidance. Rates are configured for the **2025-26, 2026-27 and +2027-28** tax years; years outside that range fall back to the latest configured +year with an in-app notice. + +**Quidly does not submit anything to HMRC.** It produces the figures and an SA105 +PDF; you or your accountant do the filing. Making Tax Digital for Income Tax is +being phased in for landlords — check +[HMRC's guidance](https://www.gov.uk/guidance/using-making-tax-digital-for-income-tax) +for whether it applies to you yet, because Quidly cannot make quarterly digital +submissions on your behalf. + +Each install is single-tenant. Found a figure that looks wrong? Please +[open a tax-accuracy issue](https://github.com/WarlaxZ/quidly/issues/new?template=tax_accuracy.yml) +with an HMRC link — those are the most useful reports this project gets. + +## Contributing & security + +- [CONTRIBUTING.md](.github/CONTRIBUTING.md) — conventions, scope, and what makes a good PR. +- [SECURITY.md](.github/SECURITY.md) — please report vulnerabilities privately, not as public issues. ## Licence -Licensed under [AGPL-3.0](LICENSE). Quidly is open, but the AGPL means that if you run a modified version as a network service, you must share your changes with its users. Commercial or hosted licensing from the author is possible if the AGPL doesn't fit your use. +Licensed under [AGPL-3.0](LICENSE). Quidly is open, but the AGPL means that if +you run a modified version as a network service, you must share your changes with +its users. Commercial or hosted licensing from the author is possible if the AGPL +doesn't fit your use. From a246216d6cdbe45d1a5c18e9e78b38ebca61e3b4 Mon Sep 17 00:00:00 2001 From: AshAlliants Date: Fri, 31 Jul 2026 19:55:03 +0100 Subject: [PATCH 7/7] feat(docker): default compose to the published image, add build overlay docker-compose.yml now pulls ghcr.io/warlaxz/quidly:latest so the quickstart is a pull rather than a local build. docker-compose.build.yml overlays `build: .` for development, or for operators who'd rather compile the thing handling their financial data themselves. --- docker-compose.build.yml | 9 +++++++++ docker-compose.yml | 6 ++++-- 2 files changed, 13 insertions(+), 2 deletions(-) create mode 100644 docker-compose.build.yml diff --git a/docker-compose.build.yml b/docker-compose.build.yml new file mode 100644 index 0000000..8b975c1 --- /dev/null +++ b/docker-compose.build.yml @@ -0,0 +1,9 @@ +# Overlay that builds Quidly from this checkout instead of pulling the +# published image. Useful for development, or if you'd rather not trust a +# prebuilt binary with your financial data. +# +# docker compose -f docker-compose.yml -f docker-compose.build.yml up -d --build +services: + quidly: + build: . + image: quidly-local diff --git a/docker-compose.yml b/docker-compose.yml index 9003557..e9673f1 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,7 +1,9 @@ services: quidly: - build: . - image: quidly + # Prebuilt multi-arch image (linux/amd64 + linux/arm64). + # To build from source instead: + # docker compose -f docker-compose.yml -f docker-compose.build.yml up -d --build + image: ghcr.io/warlaxz/quidly:latest env_file: .env environment: DATABASE_URL: file:/data/quidly.db