MemberMatters
MemberMatters
Status: Work in progress — we are testing
MemberMatters is an open-source membership management platform used by HackSthlm for managing members, access control, billing, and space resources.
- Prod URL:
https://members.hacksthlm.se - Test URL:
https://mm.s2.hacksthlm.se - Source: membermatters/membermatters on GitHub
Test Instance Creds
| Role | Username | Password |
|---|---|---|
| Staff | root@hacksthlm.se |
testuser123 |
TODO — Theming (HackSthlm)
Make it not look like android 5. Current priority: make it look nicenice. &IT LOOKS matchSO HackSthlmANDROID visual identity.GOD
- [ ] Replace default logo with HackSthlm logo (SVG preferred)
- [ ] Update primary/accent colors in
src/frontend/src/quasar-variables.sassto match HackSthlm palette - [ ] Set site name, tagline, and "about" blurb in Admin → Configuration → Site Settings
- [ ] Replace favicon
- [ ] Update email templates (sender name, footer, logo)
- [ ] Review and update all public-facing copy (welcome email, door unlock messages, etc.)
- [ ] Dark mode
check — make sure custom colors don't break it - [ ] Mobile layout
pass — especially the portal dashboard
HackSthlm brand reference: (link to brand guide / Figma / drive folder here)
Requests / Feature Backlog
Things we want but haven't built or configured yet.
| # | Request | Priority | Owner | Notes |
|---|---|---|---|---|
| 1 | RFID door access integration | High | TBD | Needs hardware mapping |
| 2 | Swish payment integration | High | TBD | Check MemberMatters billing plugins |
| 3 | Medium | TBD | ||
| 4 | Medium | TBD | ||
| 5 | Member-visible resource calendar | Low | TBD | |
| 6 | Two-factor |
Medium | TBD |
Add requests as GitHub issues and link them here.
CI/CD Pipeline
Current Setup
(Fill in once decided — options below as starting point)
[GitHub repo] → push to main
↓
[GitHub Actions]
- Lint & test (frontend + backend)
- Build Docker image
- Push to registry (ghcr.io/hacksthlm/membermatters)
↓
[Deploy trigger]
- SSH deploy / Watchtower /
Portainer webhook
↓
[Productionshitbox server]- for now]
GitHub Actions — Suggested Workflow Files
.github/workflows/ci.yml— runs on every PR: lint, unit tests.github/workflows/deploy.yml— runs on merge tomain: build image, deploy to prod
Environment Variables / Secrets
Store these in GitHub Actions secrets (Settings → Secrets and variables → Actions):
| |
| |
| |
| |
|
🔲TODO:Decide on registry (GHCR vs self-hosted), deployment method, and staging environment.
Working with the Git Repo
Repository
- Upstream:
https://github.com/membermatters/membermatters - HackSthlm fork:
https://github.com/hacksthlm/membermatters(create if not done)
Initial Setup
# Clone the HackSthlm fork
git clone https://github.com/hacksthlm/membermatters.git
cd membermatters
# Add upstream remote to stay in sync with the official project
git remote add upstream https://github.com/membermatters/membermatters.git
git fetch upstream
Branch Strategy
| Branch | Purpose |
|---|---|
main |
Production-ready — protected, requires PR |
develop |
Integration branch for ongoing work |
feature/<name> |
New features |
fix/<name> |
Bug fixes |
chore/<name> |
Config, deps, docs |
Submitting a Pull Request
- Branch off
develop:git checkout developgit pull origin developgit checkout -b feature/your-feature-name - Make your changes, commit with clear messages:
git commit -m "feat: add Swish payment integration" - Push and open a PR against
develop:git push origin feature/your-feature-name - In the PR description: what changed, why, and how to test it.
- Request review from at least one person in the responsibility table.
- Squash-merge once approved.
Syncing with Upstream
Do this periodically to pull in upstream bug fixes and features:
git fetch upstream
git checkout develop
git merge upstream/main
# resolve conflicts if any, then push
git push origin develop
Who Is in Charge of What
| Area | Primary | Backup | Notes |
|---|---|---|---|
| Infrastructure / hosting | TBD | TBD | |
| Backend (Django) | TBD | TBD | |
| Frontend (Vue/Quasar) | TBD | TBD | |
| Theming / design | TBD | TBD | |
| Door / hardware access | TBD | TBD | |
| Billing & payments | TBD | TBD | |
Update this table when ownership is decided.
Connecting Infrastructure
Stack Overview
[ Members / admins ]
│ HTTPS
▼
[ Reverse proxy ] ← Nginx / Caddy / Traefik
│
[ MemberMatters ] ← Django + Gunicorn (Docker)
│
[ PostgreSQL ] ← Persistent DB
[ Redis ] ← Celery task queue / caching
│
[ MQTT broker ] ← Door controller / hardware (optional)
Docker Compose (Quick Start)
cp .env.example .env
# edit .env — at minimum set SECRET_KEY, DB creds, SITE_URL
docker compose up -d
docker compose exec app python manage.py migrate
docker compose exec app python manage.py createsuperuser
Reverse Proxy
MemberMatters runs on port 8000 internally. Point your proxy to it and terminate TLS there. Example Caddyfile snippet:
members.hacksthlm.se {
reverse_proxy membermatters:8000
}
Door / Access Control (MQTT)
MemberMatters has built-in support for MQTT-based door controllers. Configure in Admin → Access Control.
- Broker address: (TBD)
- Topics follow the pattern
membermatters/doors/<door-id>/... - Refer to upstream docs: MemberMatters Access Control
Backups
🔲TODO:Set up automated DB backups. At minimum, a dailypg_dumpto off-site storage.
# Manual backup
docker compose exec db pg_dump -U membermatters membermatters > backup_$(date +%F).sql
Open Questions
Things that are unresolved and need a decision or more investigation.
| # | Question | Status | Owner |
|---|---|---|---|
| 1 | Which payment provider? Stripe (already supported) or Swish? | Open | — |
| 2 | Self-hosted vs managed hosting — where does this run? | Open | — |
| 3 | Do we maintain a fork long-term or contribute changes upstream? | Open | — |
| 4 | Staging environment — do we want one? | Open | — |
| 5 | SSO / login via HackSthlm accounts (OAuth)? | Open | — |
| 6 | GDPR — where is member data stored, who has access, retention policy? | Open | — |
| 7 | How do we handle the transition from the current membership system? | Open | — |
Last updated: <!-- date --> — ping #membermatters on Slack/Discord if anything is out of date.