license: relicense to AGPL-3.0-only with commercial dual-license

- LICENSE -> verbatim GNU AGPL-3.0; add LICENSE-COMMERCIAL.md + SECURITY.md
- CLA -> exclusive-license grant (contributors keep copyright); add README
  anti-rugpull covenant + relicense record
- NOTICE / README / CONTRIBUTING / CLAUDE.md / package.json x5 updated;
  contact routed through GitHub (no email placeholders)
- AGPL section 13 source offer: operator-configurable BACKSPACE_SOURCE_URL +
  build-injected commit; sourceCodeUrl+commit on /api/instance/info;
  SourceCodeLink on login/register/settings/desktop; docs + .env.example updated
This commit is contained in:
Jannis Braun
2026-07-01 16:38:22 +02:00
parent 16d75f2806
commit f481e1fe9e
34 changed files with 1084 additions and 165 deletions
+5 -1
View File
@@ -82,7 +82,7 @@ describe('GET /api/instance/info', () => {
expect(body.federatedRegistrationOpen).toBe(false);
});
it('returns the full contract: name, version, registrationOpen, federatedRegistrationOpen', async () => {
it('returns the full contract: name, version, registrationOpen, federatedRegistrationOpen, sourceCodeUrl, commit', async () => {
const res = await app.inject({ method: 'GET', url: '/api/instance/info' });
expect(res.statusCode).toBe(200);
const body = res.json();
@@ -90,5 +90,9 @@ describe('GET /api/instance/info', () => {
expect(typeof body.version).toBe('string');
expect(typeof body.registrationOpen).toBe('boolean');
expect(typeof body.federatedRegistrationOpen).toBe('boolean');
// AGPL § 13 source offer — always a URL; commit is a string or null.
expect(typeof body.sourceCodeUrl).toBe('string');
expect(body.sourceCodeUrl).toMatch(/^https?:\/\//);
expect(body.commit === null || typeof body.commit === 'string').toBe(true);
});
});
+4
View File
@@ -23,6 +23,10 @@ export async function instanceRoutes(app: FastifyInstance): Promise<void> {
version: BACKSPACE_VERSION,
registrationOpen,
federatedRegistrationOpen: settings?.federatedRegistrationOpen === 1,
// AGPL-3.0 § 13: advertise the source of the running version to every
// network user (and federated peer) — public/unauthenticated by design.
sourceCodeUrl: config.sourceCodeUrl,
commit: config.commit,
};
return reply.code(200).send(response);