Solidarity.
Free tools for union stewards and officers — on-device communications,
grievance tracking, sector workflows, and workforce time.
Multi-union by design. Self-host the Officer Hub.
unionops.org · Try Comms · Self-host
Stewarded by Ryan Morris. Source-available · all rights reserved · LICENSE
OPSEU/CAAT is the first adopter (reference tenant seed), not a platform default. Any union can run with their own branding, CA steps, and enabled modules.
| Comms toolbox | Officer Hub | |
|---|---|---|
| Who | Stewards, communicators, any local | Officers, stewards, stability committees |
| Where | Public site — no account required | Authenticated /app (Auth.js + MFA) |
| Data | Browser-side; Brand Kit in localStorage |
Hosted by you; you are the data controller |
| Try it | unionops.org | Self-host or local demo logins below |
Guides and generators for social, print, union boards, and websites. Everything runs in the browser — no analytics, no upload of member photos to our servers.
| Channel | What you get |
|---|---|
| Brand | Brand Kit, Logo Builder, Resizer, Document & Slide Generator (Word / Excel / PowerPoint) |
| Union boards | Board Banner & Trim, Board Notice Maker, Solidarity Posters, QR Board / Link Cards |
| Print & social | Flyer Maker, Graphic Maker, Quote Cards, Meeting Backgrounds, Alt-text helper |
| Website | Static site ZIP (GitHub Pages–ready) + deploy guide |
| Guides | First week, Blueprint, Strike Guide, Photo Consent, Comms Resources, channel guides, captions & examples, Brand Assets, manifesto, install |
Accessibility: font scaling, high contrast, reduced motion — EN/FR throughout.
Phases 0–5 complete, plus Workforce Time 8-lite. Memory adapters today; Postgres + RLS is next.
- Grievance tracker — CA-configurable steps, timeline, immutable notes, email drafts (copy only), bundle export (JSON + PDF)
- Overdue board — upcoming / overdue sorted by days late
- Meetings & ICS — schedule on a grievance; download calendar files
- Member communication log — channel, direction, summary
- College bumping — PDF/text compare, stability committee sessions, decision record (committee decides — never auto-decided)
- Workforce Time (8-lite) — clock in/out, job codes, approvals, CSV export, optional GPS punch tagging (
/app/time)
- CA clause snippets — union-scoped library; insert into notes
- Within-union marketplace — share templates with your local only (never cross-union)
- Officer handoff — reassign cases + download package (president/admin)
- Hybrid backup — passphrase-encrypted export/import; passphrase stays in-browser
- Steward mobile — optional read-only compact mode
Role-gated write actions match the API. Confidential modules sit behind MFA.
UnionOps is local-first for Comms, not “no servers ever.”
| Surface | What happens to data |
|---|---|
| Comms tools | Graphics, brand kit, and uploads stay in your browser. No analytics. |
| Officer Hub you host | Sessions and hub records live on that instance. You are the data controller. Prefer Canadian hosting for confidential modules. |
| Demo / CI accounts | Workshop and test only — not for real member case files. |
Full policy: Privacy · docs/COMPLIANCE.md · SECURITY.md
npm ci
cp .env.example .env.local # set AUTH_SECRET (openssl rand -base64 32)
npm run dev # http://localhost:3000/enMore detail: docs/guides/SETUP.md
Password demo123:
| Account | Notes |
|---|---|
president@local243.ca |
MFA gate (dev accepts any 6-digit code) |
stability@local243.ca |
Bumping / stability |
steward@local243.ca |
Steward |
solo@example.ca |
Solo account — no MFA |
Routes: /en/app/login · /en/app · /en/app/mfa
- Image:
ghcr.io/hackmods/union-communications:main(CI onmain);:vX.Y.Z/:lateston tags - CapRover: container port 3000; set
AUTH_SECRETandAUTH_URL - Health:
GET /api/health→{"status":"ok"}
Guide: docs/guides/DEPLOY.md
Before production: unique AUTH_SECRET, correct HTTPS AUTH_URL (no trailing slash), never use demo123 for real grievances — if you host it, compliance is on you.
- Postgres + RLS — every table scoped by
unionId/localId - Multi-union onboarding UI — tenant signup/invite (seed-only today)
- Attachments + virus scan — grievance docs & bumping PDFs
- ApiAdapter — authenticated API persistence for hub clients
- Workforce Time (full) — scheduling, PTO, union rollup
See docs/ROADMAP.md and docs/PROGRESS.md.
| Doc | Purpose |
|---|---|
| Vision | Multi-union product scope |
| Architecture | Stack, tenancy, DataAdapter |
| Setup / Deploy | Operator guides |
| RBAC | Roles — never cross-union data |
| Compliance | Privacy, AODA |
| Roadmap / Progress | Phase status |
| Contributing | Source-available contribution rules |
| Security | Vulnerability reporting |
| Reference tenant | OPSEU/CAAT first adopter seed |
Agent entry point: AGENTS.md
UnionOps is stewarded by Ryan Morris, intended as a Canadian non-profit / community labour project. The code is source-available under LICENSE: you may run and self-host for your local; redistribution and competing commercial hosting require written permission.
Solidarity.
