Solidarity.
Free Comms tools for union stewards and officers — on-device communications,
plus Officer Hub and Local Portal for casework. Multi-union by design.
Comms stay free. Hosted Officer Hub or Local Portal has a cost. Self-host stays an option.
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 or by UnionOps; that host is the data controller |
| Cost | Free. No ads, no paywall on a poster. | Self-host: your server. If UnionOps hosts it for a local, hosting has a cost — enough to cover it, not a lock-in fee. |
| 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, solidarity page, install |
Accessibility: font scaling, high contrast, reduced motion — EN/FR throughout.
Phases 0–5 complete, plus Workforce Time 8-lite. Postgres + RLS adapters ship behind *_DB_BACKEND flags (default memory for demos; production flip via docs/guides/POSTGRES_OPS.md or docs/guides/CAPROVER_POSTGRES.md).
- 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 · Security · docs/COMPLIANCE.md · docs/guides/HOSTED_SECURITY.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. Addresses use reserved unionops.test (RFC 2606) so they are not real union or local mailboxes.
| Account | Notes |
|---|---|
president.243@unionops.test |
MFA gate (dev accepts any 6-digit code) |
stability.243@unionops.test |
Bumping / stability |
steward.243@unionops.test |
Steward |
solo@unionops.test |
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 |
| CapRover + Postgres | Durable self-host on CapRover |
| 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.
Comms stay free (on-device, no ads). If UnionOps hosts Officer Hub or Local Portal for a local, that hosting has a cost — enough to keep the service online, not a lock-in subscription. Self-host remains an option. Public promise: unionops.org/en/manifesto.
Solidarity.
