| .gitea | ||
| .gitattributes | ||
| CODE_OF_CONDUCT.md | ||
| CONTRIBUTING.md | ||
| LICENSE | ||
| PLAN.md | ||
| README.md | ||
| SECURITY.md | ||
Academy Network for Android
Status: specified, not built. There is no code in this repository yet.
This repo is an open invitation. The protocol work is done, the design is settled, and the hard architectural question has an answer (SPEC §20). What is missing is an Android app, and it is not written. If you want to build it, you do not need anyone's permission and you do not need to introduce yourself. Open a pull request.
What this app is
An Academy Network client node (SPEC §20).
A phone cannot be a serving node. A mobile OS suspends background processes, so a device that publishes a Tor onion service cannot keep it reachable, and a peer that appears for twenty minutes and vanishes costs the peers that dialed it more than it returns. Pretending otherwise does not add capacity to the network. It adds churn and calls it capacity.
So the Android app dials, and never accepts. It:
- syncs the entire text corpus, like every other node,
- reads offline, like every other node,
- publishes: authoring, voting, rating, and petitioning all work,
- serves no one, and pins no blobs.
It is a full citizen of the network that happens not to be a road. The keys on a phone carry exactly the same authority as the keys on a seed: standing, verifier certification, and every governance right belong to a key, never to a device.
Three things that are already true, and save you weeks
Read SPEC §20 before you start. The short version:
-
The wire protocol does not change. A client node is indistinguishable from a serving node that happens to be dialing you. You are not implementing a new protocol or a reduced one. A peer running today's code serves an Android client correctly without knowing the role exists.
-
Publishing needs no new protocol. Reconciliation is symmetric (SPEC §16). An object the phone holds and its peer lacks is sent in the very exchange that fetches what the phone is missing. Authoring falls out of the sync you already have. There is nothing to add.
-
Peer exchange excludes you automatically. An onion service never learns the address of whoever dialed it, and a node forwards only addresses it has itself dialed and synced with. A client node, publishing no address, is never advertised and never dialed back. This is a property of the transport, not a rule someone has to enforce.
The Rust node engine (academy-core, academy-net, academy-editorial,
academy-nmt) lives in the node repository and is meant to be
cross-compiled here, not reimplemented.
Four things you must not break
These are not style preferences. Each one is load-bearing, and a pull request that violates one will not be merged no matter how well it works.
-
Never fetch text selectively. The privacy guarantee of this network is a consequence of taking everything. A client that downloaded only the guides its user opened would hand the serving peer a reading profile, and a reading profile is exactly what an adversary wants from a library. Bandwidth is the price of SPEC goal 3. It is not negotiable. If the corpus ever outgrows a phone, the answer is a subject-scoped full replica (all of a subject or none of it, chosen ahead of time by the user), never a guide at a time.
-
Never add a wire field announcing the role. A role flag is a fingerprint on a network whose entire purpose is that reading is unobservable, and it is a lie the moment a peer has a reason to tell one. A node learns what a peer is by whether it can dial it. See SPEC §20.1.
-
No telemetry, no analytics, no crash reporting, no ads, no third-party SDK that phones home. Not even anonymized. Not even opt-in. The app makes exactly the connections the user asked for, and the update check (SPEC §18.4) is user-initiated only.
-
No dependency on Google Play. The APK must be installable and redistributable by hand, over USB, and by peers (SPEC §19.4). A build that only works through a store is a build with an off switch someone else owns.
The work
PLAN.md breaks it into phases, names the specific things in the desktop
app that do not exist on Android, and is honest about what is uncertain.
Start there.
The single highest-value contribution is not Android code at all: it is
client mode in the Rust node (transport.rs), which is testable on a
desktop with no emulator in sight and unblocks everything else. See
PLAN.md phase 0.
Contributing
Same rules as every other Academy repository. CONTRIBUTING.md is
distributed into this repo and describes how the mechanical merge works.
There is no CLA, no copyright assignment, and no requirement that you say
who you are. Pseudonyms are first-class here.
SPEC.md (in the spec repository) is authoritative for the protocol.
If this repo and the spec disagree, the spec is right and this repo is a
bug.
License
AGPL-3.0-or-later, like the rest of the project.