Private
Public Access
Prepare for public release: de-identify docs, add contributor terms
Removes personal infra baked into copy-paste instructions and the app's own UI ahead of an eventual public release: - AboutModal's "Source code" link is now a build-time env var (VITE_SOURCE_URL) instead of a hardcoded personal Gitea URL, and hides itself when unset rather than pointing somewhere wrong - DEPLOYMENT.md's clone steps are genericized to any git host - LICENSE gets its previously-blank copyright/description lines filled in - CONTRIBUTING.md adds a lightweight contributor-terms note to keep a future dual-licensed offering possible once outside PRs start arriving Deliberately out of scope for now: git commit history (still under the real author identity) and the actual publish destination -- both still undecided. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,51 @@
|
|||||||
|
# Contributing to DS Chat
|
||||||
|
|
||||||
|
Thanks for considering a contribution.
|
||||||
|
|
||||||
|
## Reporting bugs and requesting features
|
||||||
|
|
||||||
|
Open an issue on this project's issue tracker. Include steps to reproduce
|
||||||
|
for a bug, or the problem you're trying to solve for a feature request —
|
||||||
|
that's usually more useful than a proposed solution.
|
||||||
|
|
||||||
|
## Development setup
|
||||||
|
|
||||||
|
See the root [README.md](README.md)'s Quickstart, plus
|
||||||
|
[backend/README.md](backend/README.md) and
|
||||||
|
[frontend/README.md](frontend/README.md) for the full local dev setup
|
||||||
|
(Postgres, Redis, Python venv, migrations, the Vite dev server).
|
||||||
|
[ARCHITECTURE.md](ARCHITECTURE.md) covers the overall system design if
|
||||||
|
you're orienting yourself before a larger change.
|
||||||
|
|
||||||
|
## Before opening a pull request
|
||||||
|
|
||||||
|
- **Tests**: run `pytest` in `backend/` for any backend change, and add
|
||||||
|
tests for new behavior rather than just the happy path — see
|
||||||
|
`backend/README.md`'s "Run tests" section. For frontend changes, run
|
||||||
|
`npx tsc -b` in `frontend/` and confirm `npm run build` succeeds.
|
||||||
|
- **Style**: match the conventions already in the file you're editing
|
||||||
|
rather than introducing a new pattern — this codebase doesn't have a
|
||||||
|
separate style guide beyond "look at what's already there."
|
||||||
|
- **Scope**: smaller, focused PRs are easier to review than large ones
|
||||||
|
that mix unrelated changes.
|
||||||
|
|
||||||
|
## Contributor terms
|
||||||
|
|
||||||
|
By submitting a contribution (a pull request, patch, or similar), you
|
||||||
|
agree that:
|
||||||
|
|
||||||
|
1. Your contribution is licensed under the project's own license,
|
||||||
|
AGPL-3.0-or-later ([LICENSE](LICENSE)), and
|
||||||
|
2. You grant the project's maintainer(s) a perpetual, worldwide,
|
||||||
|
non-exclusive right to also relicense your contribution under different
|
||||||
|
terms — for example, as part of a separately-licensed commercial
|
||||||
|
offering built on this project.
|
||||||
|
|
||||||
|
This keeps the option of a future dual-licensed (open-source +
|
||||||
|
commercial) version of the project available, without requiring a
|
||||||
|
separate signed agreement for every contribution.
|
||||||
|
|
||||||
|
*This is a lightweight starting point, not a substitute for legal advice —
|
||||||
|
if you're contributing something substantial, or maintaining a fork with
|
||||||
|
your own commercial plans, it's worth having this reviewed by a lawyer
|
||||||
|
rather than relying on the paragraph above alone.*
|
||||||
+16
-6
@@ -132,15 +132,16 @@ sudo -u ds-chat ssh-keygen -t ed25519 -f /srv/ds-chat/.ssh/id_ed25519 -N ""
|
|||||||
sudo cat /srv/ds-chat/.ssh/id_ed25519.pub
|
sudo cat /srv/ds-chat/.ssh/id_ed25519.pub
|
||||||
```
|
```
|
||||||
|
|
||||||
Add that public key as a **read-only deploy key** on the Gitea repo
|
Add that public key as a **read-only deploy key** in your git host's repo
|
||||||
(Settings → Deploy Keys), then:
|
settings (deploy keys are supported by GitHub, GitLab, Gitea, and most
|
||||||
|
others — look for "Deploy Keys" under the repo's Settings), then:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
sudo -u ds-chat ssh-keyscan git.darksingularity.org >> /srv/ds-chat/.ssh/known_hosts
|
sudo -u ds-chat ssh-keyscan <YOUR_GIT_HOST> >> /srv/ds-chat/.ssh/known_hosts
|
||||||
sudo -u ds-chat git clone git@git.darksingularity.org:DarkSingularity/ds-chat.git /srv/ds-chat
|
sudo -u ds-chat git clone git@<YOUR_GIT_HOST>:<YOUR_ORG>/ds-chat.git /srv/ds-chat
|
||||||
```
|
```
|
||||||
|
|
||||||
(If your Gitea's SSH is on a non-default port, adjust the clone URL and
|
(If your git host's SSH is on a non-default port, adjust the clone URL and
|
||||||
`ssh-keyscan -p <port>` accordingly.)
|
`ssh-keyscan -p <port>` accordingly.)
|
||||||
|
|
||||||
**Alternative: a personal/deployment-user access token instead of a deploy
|
**Alternative: a personal/deployment-user access token instead of a deploy
|
||||||
@@ -148,7 +149,7 @@ key** — skip the `.ssh`/`ssh-keygen`/`ssh-keyscan` commands above entirely
|
|||||||
and clone over HTTPS with the token embedded in the URL:
|
and clone over HTTPS with the token embedded in the URL:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
sudo -u ds-chat git clone https://<TOKEN>@git.darksingularity.org/DarkSingularity/ds-chat.git /srv/ds-chat
|
sudo -u ds-chat git clone https://<TOKEN>@<YOUR_GIT_HOST>/<YOUR_ORG>/ds-chat.git /srv/ds-chat
|
||||||
```
|
```
|
||||||
|
|
||||||
The token then lives in plaintext in `/srv/ds-chat/.git/config` (`git
|
The token then lives in plaintext in `/srv/ds-chat/.git/config` (`git
|
||||||
@@ -232,7 +233,16 @@ admin sets it up.
|
|||||||
`/ws`) whenever that directory exists — that's what lets Nginx Proxy
|
`/ws`) whenever that directory exists — that's what lets Nginx Proxy
|
||||||
Manager forward the whole domain to one port with no custom path routing.
|
Manager forward the whole domain to one port with no custom path routing.
|
||||||
|
|
||||||
|
Before building, copy `frontend/.env.example` to `frontend/.env.production`
|
||||||
|
and set `VITE_SOURCE_URL` to wherever *your* copy of the repo lives — see
|
||||||
|
that file's own comment for why this matters (AGPL-3.0 source-availability
|
||||||
|
compliance). Vite bakes this in at build time, so it needs to be in place
|
||||||
|
before `npm run build` runs, and needs re-running after any future change
|
||||||
|
to it.
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
|
sudo -u ds-chat cp /srv/ds-chat/frontend/.env.example /srv/ds-chat/frontend/.env.production
|
||||||
|
sudo -u ds-chat nano /srv/ds-chat/frontend/.env.production # set VITE_SOURCE_URL
|
||||||
sudo -u ds-chat bash -c 'cd /srv/ds-chat/frontend && npm ci && npm run build'
|
sudo -u ds-chat bash -c 'cd /srv/ds-chat/frontend && npm ci && npm run build'
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|||||||
@@ -629,8 +629,8 @@ to attach them to the start of each source file to most effectively
|
|||||||
state the exclusion of warranty; and each file should have at least
|
state the exclusion of warranty; and each file should have at least
|
||||||
the "copyright" line and a pointer to where the full notice is found.
|
the "copyright" line and a pointer to where the full notice is found.
|
||||||
|
|
||||||
<one line to give the program's name and a brief idea of what it does.>
|
DS Chat, a self-hosted, real-time team chat service.
|
||||||
Copyright (C) <year> <name of author>
|
Copyright (C) 2026 Keith Smith
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
This program is free software: you can redistribute it and/or modify
|
||||||
it under the terms of the GNU Affero General Public License as published by
|
it under the terms of the GNU Affero General Public License as published by
|
||||||
|
|||||||
@@ -0,0 +1,6 @@
|
|||||||
|
# Shown as the "Source code" link in the app's About screen -- required
|
||||||
|
# for AGPL-3.0 section 13 compliance once you deploy this (a link so users
|
||||||
|
# interacting with the app over the network can get the actual source,
|
||||||
|
# including any modifications you've made). Point this at wherever *your*
|
||||||
|
# copy of the repo actually lives, not the upstream project.
|
||||||
|
VITE_SOURCE_URL=https://example.com/your-org/ds-chat
|
||||||
+1
-1
@@ -112,7 +112,7 @@ src/
|
|||||||
LoginPage.tsx, SignupPage.tsx, ForgotPasswordPage.tsx, ResetPasswordPage.tsx
|
LoginPage.tsx, SignupPage.tsx, ForgotPasswordPage.tsx, ResetPasswordPage.tsx
|
||||||
ChatShellPage.tsx, AdminPage.tsx, HelpPage.tsx
|
ChatShellPage.tsx, AdminPage.tsx, HelpPage.tsx
|
||||||
|
|
||||||
styles/tokens.css design tokens (DarkSingularity theme: colors, spacing, etc.)
|
styles/tokens.css design tokens (default theme: colors, spacing, etc.)
|
||||||
sw.ts custom service worker (injectManifest): app-shell
|
sw.ts custom service worker (injectManifest): app-shell
|
||||||
precache + NetworkFirst runtime caching, push/notificationclick
|
precache + NetworkFirst runtime caching, push/notificationclick
|
||||||
handlers, SKIP_WAITING messaging for the update-prompt flow
|
handlers, SKIP_WAITING messaging for the update-prompt flow
|
||||||
|
|||||||
@@ -10,8 +10,10 @@ interface AboutModalProps {
|
|||||||
// users remotely through a computer network, you should also make sure
|
// users remotely through a computer network, you should also make sure
|
||||||
// that it provides a way for users to get its source... its interface
|
// that it provides a way for users to get its source... its interface
|
||||||
// could display a 'Source' link" -- this modal is that link, not just a
|
// could display a 'Source' link" -- this modal is that link, not just a
|
||||||
// courtesy credits screen.
|
// courtesy credits screen. Deliberately not a hardcoded URL: whoever
|
||||||
const SOURCE_URL = 'https://git.darksingularity.org/DarkSingularity/ds-chat'
|
// deploys this needs to point it at *their* copy of the repo (including
|
||||||
|
// any modifications), not the upstream project -- see frontend/.env.example.
|
||||||
|
const SOURCE_URL = import.meta.env.VITE_SOURCE_URL as string | undefined
|
||||||
|
|
||||||
export function AboutModal({ onClose }: AboutModalProps) {
|
export function AboutModal({ onClose }: AboutModalProps) {
|
||||||
return (
|
return (
|
||||||
@@ -39,11 +41,13 @@ export function AboutModal({ onClose }: AboutModalProps) {
|
|||||||
</a>
|
</a>
|
||||||
.
|
.
|
||||||
</p>
|
</p>
|
||||||
<p className="about-modal-line">
|
{SOURCE_URL && (
|
||||||
<a href={SOURCE_URL} target="_blank" rel="noopener noreferrer">
|
<p className="about-modal-line">
|
||||||
Source code
|
<a href={SOURCE_URL} target="_blank" rel="noopener noreferrer">
|
||||||
</a>
|
Source code
|
||||||
</p>
|
</a>
|
||||||
|
</p>
|
||||||
|
)}
|
||||||
|
|
||||||
<div className="modal-actions" style={{ marginTop: '1rem' }}>
|
<div className="modal-actions" style={{ marginTop: '1rem' }}>
|
||||||
<button type="button" className="btn-secondary" onClick={onClose}>
|
<button type="button" className="btn-secondary" onClick={onClose}>
|
||||||
|
|||||||
Reference in New Issue
Block a user