Skip to content

Repository files navigation

Duesday logo

Duesday

The day they finally pay you.

A free, worldwide consumer-compensation engine with exact figures,
pinpoint citations and letters you send yourself. You keep 100%.

Website Licence AGPL-3.0 654 regimes 131 countries 11,381 tests 0% commission

The Duesday landing page


The problem

Claims agencies take a cut of money that was already yours. AirHelp charges 35%, rising to 50% if a case reaches court. FairShake takes 20% of arbitration wins. Ownwell takes 25% of property-tax savings. DoNotPay charged a subscription, earned a D- BBB rating, and was ordered by the FTC in January 2025 to pay $193,000 over its "robot lawyer" marketing.

They are all charging for the same thing: the gap between what a statute already says you are owed and how hard it is to find out.

The free alternatives are narrow. Resolver handles UK complaints. MissingMoney searches unclaimed property but writes no letters. Delay Repay apps do one railway. Nobody had built one free, self-serve, multi-category engine that spans the world.

What it does

Give it the facts of a dispute. It runs them against every legal regime that could apply — not just the obvious one — and tells you:

  • What each regime says you are owed, to the cent, in the currency the statute names.
  • Why, as a step-by-step reasoning trace with the pinpoint citation behind each step. No competitor shows their working.
  • Which deadlines are running, which ones kill the claim if missed, and how long is left.
  • What the other side will say, and what to say back, with authority.
  • Where to escalate — the actual named regulator, ombudsman or court, what it costs, and whether its decision binds them.
  • A finished letter you send yourself, in your own name, in your language or theirs.

The reasoning pipeline

Claim dashboard

Every result can be added to a private claim ledger. It tracks the amount at stake, stage history, correspondence, recoveries and fatal or procedural deadlines. It is local-first and there is nothing else: the file lives in your browser, and a JSON export is how it moves to another device.

The Duesday claim dashboard

When several regimes cover the same facts it reconciles them rather than adding them up. A Paris–New York delay is covered by both EU261 and the Montreal Convention, but Article 12(1) lets the fixed award be set off against further damages — so "€600 + $2,100" would be a lie, and "€600" would leave money on the table. The engine models the interaction and reports what is realistically recoverable alongside the theoretical maximum.

What it deliberately is not

It is not a law firm and gives no legal advice. It is a document-assembly and information tool. You send everything yourself, in your own name; it never acts as your agent and never contacts anyone for you. It promises no outcome.

That posture is the architecture, not timidity. Taking a contingency fee would make it a regulated claims-management company. Acting as agent walks toward the unauthorised practice of law. Promising recovery is the exact conduct the FTC penalised DoNotPay for. Staying free, self-serve and honest keeps all three problems away — and the conformance suite enforces it in code: a rule module whose prose promises an outcome fails the build.

Coverage

654 regimes across 223 jurisdictions in 131 countries. Run npm run validate:rules for the live figure — it is counted from the registry, never written down.

Worldwide coverage

Category Regimes Examples of what is modelled
Rental deposits 170 All 50 US states + DC with their real multipliers, plus 80 countries — South Africa's interest-bearing duty under RHA s.5, Turkey's three-month cap under TBK 342, Argentina's return-at-current-value rule, Colombia's outright prohibition
Flight disruption 86 EU261/UK261 with the CJEU case law, US DOT, Canada APPR, Brazil ANAC 400, Nigeria Part 19, Indonesia PM 89/2015, Korea's KFTC standards, Russia's Air Code art. 120
Unclaimed property 80 Every US state portal, 10 federal programmes and 30 countries — including which regimes forfeit (France, Switzerland, Spain) and which are perpetual
Data rights 66 GDPR, UK GDPR, 30+ US state laws, PIPL, APPI, PIPA, POPIA, LGPD, DPDP and the Gulf regimes
Medical billing 39 No Surprises Act, Good Faith Estimates, 501(r) charity care, the Medicare limiting charge, QMB, and 16 countries
Card and bank billing 38 FCBA, Reg E, UK s.75, PSD2, plus scheme chargeback rules as a separate non-statutory route
Rail delay 35 GB Delay Repay, EU 2021/782 and 23 national schemes
Parcel delay 35 UPU, the CMR Convention's 8.33 SDR/kg, Montreal cargo, Hague-Visby, and 22 postal operators
Subscriptions 34 ROSCA, US state auto-renewal laws, EU CRD, UK DMCCA, Chile's botón de arrepentimiento
Hidden fees 28 FTC 16 CFR 464, California SB 478, EU 1008/2008 art. 23, UK DMCCA
Class actions 23 Rule 23, mass arbitration, EU Directive 2020/1828, the UK CAT regime
Unwanted calls 16 TCPA and its state analogues, PECR, CASL
Baggage 4 Montreal (1,519 SDR since Dec 2024), Warsaw, EU 2027/97, 14 CFR 254

Every entry carries a confidence rating. high means the figure reads off primary legislation. medium means an official regulator page. low means we could not verify it from a primary source — and a low entry states no figure at all. It names the regulator and the route and says so plainly. A regime we cannot verify ships as an honest gap rather than a confident guess. Today that is 94 high, 272 medium and 288 low, and the low count is a feature.

Privacy

Claim evaluation runs in your browser. Your booking reference, address and card details never reach a server at all. The API stores nothing: a request is evaluated and discarded.

There are no accounts. Nothing here asks who you are — not the catalogue, not the letters, not the API, and not the claim flow, which is the part that would ordinarily sit behind a signup and is exactly the part that most needs to stay on your machine. Claims are written to this browser's local storage as one versioned document; that document is also the export format, so moving to another device means downloading a file and importing it there.

The consequence runs both ways and is worth stating plainly: clearing the browser's site data deletes your claims, and nobody — including us — can restore them.

The Content-Security-Policy is what makes the promise auditable rather than merely stated. With no auth stack it names no external host at all, and the end-to-end suite asserts that list is empty rather than allow-listing anyone.

Getting started

npm install
npm run dev          # http://localhost:3000
npm run check        # typecheck + lint + validate rules + validate data + test
npm run e2e          # end-to-end, against a production build

No credentials are required, in development or in production. There is no database to provision, no auth provider to configure and no secret without which the app degrades: it has no accounts and no server-side storage, so a fresh clone is a complete deployment.

The only optional configuration is a flight-lookup provider key, which pre-fills an itinerary from a flight number. The claim flow works without it and the UI degrades cleanly when it is absent. See .env.example.

Two surfaces

Everything you do lives in the workspace under /dashboard behind one sidebar. The public pages are the landing page, the API reference and the four explanatory pages. Nothing is gated — there is no account — so this is layout rather than permission, and a workspace URL is as shareable and as crawlable as any other.

The API

Free, unauthenticated, rate-limited per IP. Full reference at /api, machine spec at /api/v1/openapi.json.

The Duesday API reference

curl -X POST https://duesday.sohamaggarwal.com/api/v1/evaluate \
  -H 'Content-Type: application/json' \
  -d '{
    "claim": {
      "category": "flight-disruption",
      "legs": [{
        "carrier": "LH", "flightNumber": "400",
        "origin": "FRA", "destination": "JFK",
        "scheduledDeparture": "2026-06-01T10:00:00Z",
        "scheduledArrival": "2026-06-01T18:00:00Z"
      }],
      "disruption": "delayed",
      "arrivalDelayMinutes": 270,
      "cause": "technical-fault",
      "passengerCount": 2,
      "incidentDate": "2026-06-01"
    }
  }'

Or with the typed client:

import { createClient } from '@claimback/sdk';

const duesday = createClient();
const result = await duesday.evaluate(claim);

console.log(result.bestTotal); // what is realistically recoverable
console.log(result.evaluations[0].trace); // why, step by step

There is also a lookup layer, so a passenger types BA117 and a date instead of hand-entering the carrier, both airports, four timestamps and the delay. It runs server-side behind our own origin — the browser never talks to a provider, the CSP forbids it — and only ever sends a flight number and a date. See the flight section of .env.example for exactly what leaves the server, and what happens when no provider is configured.

Repository layout

packages/core      Rules-engine kernel: domain types, evaluation, money, geo,
                   dates. Pure, isomorphic, dependency-light — runs identically
                   in a Node route, a Worker, and the browser.
packages/rules     Every jurisdiction, as a pure (input, context) -> Evaluation
                   function plus citations. Adding a country is data, not code.
packages/data      Airports, airlines, carrier claim channels, 352 regulators
                   and ADR bodies, 91 unclaimed-property portals, 333
                   jurisdictions, public-holiday calendars.
packages/letters   Multi-language document assembly to text, markdown and
                   print-ready HTML.
packages/sdk       Zero-dependency typed API client.
apps/web           Next.js app and the public REST API.

Design

The interface is documented in docs/DESIGN.md, and it is a contract rather than a mood board: the Tailwind palette is replaced rather than extended, so a colour nobody chose is a build error. The product uses one blue action accent, semantic colours only for money and deadlines, restrained motion, and a shared ledger grammar from the landing page through the dashboard and API reference.

docs/REFERENCE-STUDY.md records the measured teardown of 21 reference sites that informed it.

Contributing a jurisdiction

Read docs/RULE-AUTHORING.md. The short version: a rule module is a pure function with citations, it records why it decided what it decided, it cites primary law rather than a blog, and it would rather say "we do not know" than state a number nobody checked.

npm run validate:rules is the gate. It will fail you for a missing citation, a duplicate id, a letter template that does not exist, or prose that promises an outcome.

Naming

The product name lives in exactly one place: packages/core/src/brand.ts. Nothing else may hardcode it — not UI copy, not a letter, not an error type URI, not an API base URL — and npx tsx scripts/rename.ts --check fails if anything does. Renaming is npx tsx scripts/rename.ts "NewName" --domain newname.example.

Licence

AGPL-3.0-or-later. If you run a modified version as a service, your users get the source. A tool built to stop people being charged a percentage of their own money should not be quietly closed up and resold.

About

Free, self-serve, keep-100% consumer compensation engine - worldwide rules engine, letter generator, and API

Resources

Contributing

Security policy

Stars

4 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages