Thanks for your interest in contributing! Canal4 is an AGPLv3-licensed open-source project and welcomes bug reports, feature requests, and pull requests.
- Code of Conduct
- Getting Started
- Project Structure
- Development Workflow
- Submitting a Pull Request
- Reporting Bugs
- Commit Style
Be respectful and constructive. Harassment, personal attacks, and dismissive behaviour are not welcome.
git clone https://github.com/YOUR_USERNAME/Canal4.git
cd Canal4| Tool | Version | Purpose |
|---|---|---|
| Node.js | ≥ 22 | Development |
| SpacetimeDB CLI | ≥ 2.0.5 | Logic & Schema |
| Docker + Compose | ≥ 24 | Deployment |
# 1. Start SpacetimeDB locally
spacetime start
# 2. Build & publish the module
cd spacetimedb && npm install && npm run build && npm run publish-local
cd ..
# 3. Start the web dashboard (Vite)
cd webapp
npm install
cp .env.example .env
# Edit .env with your local SpacetimeDB values if needed
npm run dev
# 4. (Optional) Start the desktop display node (Electron)
cd ../display
npm install
npm run dev- Edit
spacetimedb/src/index.ts(reducers) orspacetimedb/src/schema.ts(tables) - Rebuild:
cd spacetimedb && npm run build - Republish:
npm run deploy-local
- Add the key to
locales/en.json(and other languages if applicable). Since both apps share the same file, the key will be available to both. - Use
t('your.key')in the React component — never hardcode user-visible strings.
Canal4 uses WebAuthn (Passkeys) for all user accounts.
- When developing locally, ensure you are using a browser that supports WebAuthn (Chrome, Edge, Safari, Firefox).
- Note that WebAuthn may behave differently over
localhostvs127.0.0.1in some browsers; consistently using one is recommended.
-
Create a branch from
main:sgit checkout -b feat/your-feature-name
-
Make your changes. Keep commits focused and atomic.
-
Test locally — both the web app and (if relevant) the desktop app.
-
Check for TypeScript errors:
cd webapp && npx tsc -b cd ../display && npm run typecheck
-
Open a PR against
mainwith:- A clear title describing what changed.
- A short description of why (not just what).
- Steps to test, if non-obvious.
- No hardcoded user-visible strings (use
t()with locale keys). - New locale keys added to
locales/en.json. - TypeScript types are valid.
- If schema changed: bindings were regenerated and committed.
Open a GitHub Issue with:
- What you expected to happen.
- What actually happened (include console errors/logs if available).
- Steps to reproduce.
- Environment: OS, browser/Electron version, SpacetimeDB version.
Use short, imperative commit messages:
feat: add channel role badge to venue list
fix: locale key missing for connection_error
chore: update SpacetimeDB module dependencies
docs: update deploy instructions in README
Prefix convention:
| Prefix | Use for |
|---|---|
feat: |
New feature |
fix: |
Bug fix |
chore: |
Build, tooling, dependencies |
docs: |
Documentation only |
style: |
Formatting, CSS tweaks |
refactor: |
Code restructure |
i18n: |
Locale / translation changes |
By contributing to Canal4, you agree that your contributions will be licensed under the AGPLv3.