← Back to how it's built

Draft: reviewed line by line before open testing. Don't take anything at face value.

Principles

The fancier decides what happens to his data — not us, not a subscription status, not a support ticket. Everything below follows from that, including the pricing, and including the last section, which explains honestly why a project built on that principle is nonetheless not open source.

Each principle says what it means in the product today, and what stands behind it. Where the answer is "a test", the test is named. Where it is "you can check it yourself", the step number is given. Nothing here is a statement of intent dressed up as a fact.

The user decides what happens to their data

Export is available at any time, with a subscription or without one, and produces a plain CSV that opens in any spreadsheet. Deleting the account empties the live database immediately and destroys the photos at once, with no copy in any backup.

You can check this — steps 5, 6, 7 and 8 of the walkthrough on Your data, which also states exactly how long copies of the rows survive in routine backups before expiring.

That page states the backup window plainly rather than stopping at "deleted", which is the same principle applied to the description of the principle.

Export is always free

During the trial, after it, and after a subscription lapses. There is no state of the account in which your own records become unreachable: when the subscription ends the account stays readable and the export still works.

You can check this today — walkthrough step 5. Nothing in the code gates the export, because there is nothing in the code that gates anything: there is no billing integration yet.

That is honest but it is not durable, so it is written down as work rather than left as a good intention: when paid features ship, a test must assert that the export path carries no entitlement check, and it lands with the billing integration rather than after it. On that day this claim stops depending on a walkthrough step and starts depending on a test, which is a stronger thing.

No punitive caps

The trial is not crippled to sell the subscription, and no bird limit appears after it either.

You can check this — walkthrough step 3: add a bird, then add two more. Nothing asks you to upgrade and nothing stops you.

This is the clearest place the product disagrees with its market. With some cloud rivals, the day you stop paying is the day you can no longer reach what you wrote; here it is the day the account goes read-only and the export still works. That is the whole difference, and it is the only one that matters when the subject is twenty years of records.

Import-friendly

A fancier's records are already somewhere: another app's export, an electronic timing system's file, a federation's classification sheet. Meeting him there is a feature, not a courtesy.

Enforced. Every importer is a plugin registered in one place (packages/core/src/importers/registry.ts) and every one is tested against a real sample file. An importer with no fixture does not ship, because an importer that has never met a real file is a guess.

If your federation or your clock produces a format we do not read yet, send us a sample. That is the whole process.

Romanian first

Romanian is the source language and English mirrors it — not the other way around, and not a translation layer added afterwards. The vocabulary in the app is the vocabulary a Romanian columbofil actually uses.

Enforced. A parity suite fails when a key exists in one language and not the other (apps/mobile/src/i18n/parity.test.ts), and a doctrine rule fails the build when a user-facing string bypasses translation — including screen-reader labels, which are text somebody reads even though nobody sees them.

This is a design decision rather than a limitation. Software built for a large market and then translated into a small one is recognisable to the people in the small one, and it is recognisable as an afterthought.

What we do not do

No ads. Your data is never sold or shared with third parties. No cross-app or cross-site tracking.

Enforced by the published privacy policy, which binds us and which names the complete list of what leaves the phone — six analytics events, generated from the same constant the app uses, carrying no ring number, no bird, no race and no identifier.

Pricing, in the future tense

There is nothing to buy today. No billing integration exists in this project; the terms of service describe paid features because they were written to be ready for them, and this page will not pretend the button is there.

What paid features will sell, when they exist: convenience. Automatic imports rather than manual ones, richer pedigree documents, extra publishing. What they will never sell is access to your own records — no paywall in front of your birds, your results or your export. The distinction matters enough to state before there is any money involved, because it is much easier to hold to a line drawn early.

Why this is not open source

The honest answer has three parts, and none of them is that open source is wrong.

The code is the product. This is a commercial project in a small market, built by one person against competitors with more money and more staff. What they lack is not information about how to build a loft manager — the domain is well understood and the incumbents have decades of it. What takes the time is the care: the importers tested against real files, the numbers that match the federation's, the forms that work one-handed in a loft. Publishing that would hand a funded competitor a year of unglamorous work, and there is no version of this project that survives being second to a better-resourced copy of itself.

The parts that would genuinely help another developer are published here instead. How the numbers are computed, with the functions quoted, is on How we calculate. How authorisation works and what proves it is on Security. The architecture and the decisions behind it, including the ones that went badly, are on Architecture. That is most of what someone would open the repository to learn, and it is free to read without a clone.

What you are owed is not the source — it is your data and a way out. Open source is one answer to "what happens to me if this project disappears", and it is a good one. It is not the only one. A free, complete, plain-format export you can run today, with a subscription or without one, without asking us, answers the same question directly — and unlike a published repository, it works even for a fancier who will never compile anything.

Whether the pure domain package could be opened on its own — the calculations, the parsers, the ring formats, with none of the product around them — has been looked at seriously and is a decision for later rather than a promise now. It would take a real publishing commitment and an API that other people could rely on, and it is not a thing to do halfway.

Further reading

  • Why — why this was built at all, in the first person. These principles are the commitments; that page is the motive behind them.
  • Architecture — how the thing is built, and the trade-offs.
  • Security — the authorisation model and the tests behind it.
  • Your data — the same commitments, written for the fancier whose data is in it.