Skip to main content

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.


Test Instance Creds

RoleUsernamePassword
Staffroot@hacksthlm.setestuser123



TODO — Theming (HackSthlm)

Make it not look like android 5. Current priority: make it look nice &  match HackSthlm visual identity.

  • [ ] Replace default logo with HackSthlm logo (SVG preferred)
  • [ ] Update primary/accent colors in src/frontend/src/quasar-variables.sass to 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.

#RequestPriorityOwnerNotes
1RFID door access integrationHighTBDNeeds hardware mapping
2Swish payment integrationHighTBDCheck MemberMatters billing plugins
3Slack/Discord welcome webhook on member approvalMediumTBD 
4Self-service locker assignmentMediumTBD 
5Member-visible resource calendarLowTBD 
6Two-factor auth enforcement for adminsMediumTBD 

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
      ↓
[Production server]

GitHub Actions — Suggested Workflow Files

  • .github/workflows/ci.yml — runs on every PR: lint, unit tests
  • .github/workflows/deploy.yml — runs on merge to main: build image, deploy to prod

Environment Variables / Secrets

Store these in GitHub Actions secrets (Settings → Secrets and variables → Actions):

SecretDescription
DJANGO_SECRET_KEYDjango secret key
DB_PASSWORDPostgres password
STRIPE_SECRET_KEYBilling (if used)
DEPLOY_SSH_KEYSSH key for deploy target
REGISTRY_TOKENContainer registry push token

🔲 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

BranchPurpose
mainProduction-ready — protected, requires PR
developIntegration branch for ongoing work
feature/<name>New features
fix/<name>Bug fixes
chore/<name>Config, deps, docs

Submitting a Pull Request

  1. Branch off develop:
    git checkout developgit pull origin developgit checkout -b feature/your-feature-name
    
  2. Make your changes, commit with clear messages:
    git commit -m "feat: add Swish payment integration"
    
  3. Push and open a PR against develop:
    git push origin feature/your-feature-name
    
  4. In the PR description: what changed, why, and how to test it.
  5. Request review from at least one person in the responsibility table.
  6. 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

AreaPrimaryBackupNotes
Infrastructure / hostingTBDTBD 
CI/CD pipelineTBDTBD 
Backend (Django)TBDTBD 
Frontend (Vue/Quasar)TBDTBD 
Theming / designTBDTBD 
Door / hardware accessTBDTBD 
Billing & paymentsTBDTBD 
Member supportTBDTBD 
Security & secretsTBDTBD 

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.

Backups

🔲 TODO: Set up automated DB backups. At minimum, a daily pg_dump to 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.

#QuestionStatusOwner
1Which payment provider? Stripe (already supported) or Swish?Open
2Self-hosted vs managed hosting — where does this run?Open
3Do we maintain a fork long-term or contribute changes upstream?Open
4Staging environment — do we want one?Open
5SSO / login via HackSthlm accounts (OAuth)?Open
6GDPR — where is member data stored, who has access, retention policy?Open
7How 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.