carlos / contra Public

Clone
git clone https://amadan.net/carlos/contra

Plain git — no account needed to clone.

Download

Download this file

1# πŸ€– PLAN β€” why CONTRA is shaped this way, and what lands when
2
3`PROTOCOL.md` is the spec. This is the reasoning and the order.
4
5## Why build this at all
6
71Password is genuinely disappointing people. The complaints are not about
8cryptography β€” they are about a product that grew away from the thing it
9was for. That leaves an audience who already believe in password managers,
10already pay for one, and are actively looking. They arrive with an export
11file and a grievance, which is the easiest migration in software.
12
13The second reason is that the family needs it. The CARLOS apps keep
14reaching for a password manager as the place recovery credentials live β€”
15and every one of those references is a dependency on a product none of us
16control. A family password manager closes that loop.
17
18## The position
19
20Everything else in the category competes on features. CONTRA competes on a
21sentence that its competitors structurally cannot say: **the operator sees
22nothing at all** β€” not your vault, not your item names, not your email
23address, not how many vaults you have.
24
25That sentence is only worth saying if it survives audit, which is why the
26class is A1 strict and why the greps are merciless. The moment we need an
27"except…" clause, we are an A2 app competing on features again.
28
29## Build order, and why this order
30
31**1 β€” Instance + client-shape web console.**
32The crypto and the storage contract get proven exactly once, in the place
33where they can be iterated fastest and reviewed on a canary the same day.
34This surface is client-shape by force: sealing must happen where the keys
35are, so a server-rendered vault is not a thing that can exist. Marketing
36and settings pages stay server-shape beside it.
37
38Done when: signup, passphrase sign-in, recovery-code print, a working
39vault, and the merciless greps green.
40
41**2 β€” Native Mac app.**
42Fully native, and deliberately *second*. A second client written against a
43settled contract is a port; a second client written against a moving
44contract is two half-designs. Everything the Mac app needs from the server
45already exists by then.
46
47**3 β€” AutoFill Credential Provider extension (macOS).**
48This is where the product stops being a website. It is also where
49distribution gets decided early rather than late: an
50`ASCredentialProviderExtension` means a paid Apple developer account, code
51signing, notarization, and a Sparkle-versus-App-Store call. That decision
52constrains the Mac app, so it gets made at slice 2, not slice 3.
53
54**4 β€” iOS.**
55Same contract, third implementation, plus its own AutoFill extension.
56
57## Import
58
591PUX first, client-side, because that is where the users are coming from
60and because an unsealed export touching the server would break the one
61rule on day one.
62
63Bitwarden and Apple Passwords are wanted and deferred to discussions on
64this repo. Passkeys need a documented manual path: 1Password will not
65export them, so no importer can ever bring them across, and the honest
66move is to tell the user exactly which ones need re-creating rather than
67silently dropping them.
68
69## Money
70
71A real free rung, then **€5/year**.
72
73Deliberately cheap, for a reason specific to this category: a password
74manager somebody stops paying for is a password manager that loses their
75data. Price it so lapsing is never the cheaper option. Shape follows
76Slopbox β€” free rung that degrades generosity, never availability.
77
78Metering from the first write; integer cents.
79
80## Deferred, with triggers
81
82The full list is in `AGENTS.md` under "Deliberately not built yet". The
83two worth naming here:
84
85- **Cross-instance sharing (federation).** Not in v1, and the family has
86 already called this the biggest scope trap once. Single-instance sharing
87 gets proven first.
88- **Breach and reused-password monitoring.** Every implementation sends
89 something derived from a password off the device. There may be an
90 A1-compatible design; until somebody writes it down, it is not sketched.
91
92## Open questions
93
94- The recovery code's exact strength, alphabet and chunking β€” under review.
95- Whether the daemon's `use` verb may make outbound requests itself or is
96 limited to injecting into a subprocess environment β€” under review.
97- Namespace: `contra` is taken on npm and as a GitHub org, and the good
98 short domains are held. No password manager uses the name. See the
99 namespace note in the branch discussion.
100