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

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.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.

# 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 Slack/Discord welcome webhook on member approval Medium TBD  
4 Self-servicestorage lockerbox assignment Medium TBD  
5 Member-visible resource calendar Low TBD  
6 Two-factor auth enforcement for admins 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 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

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

  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

Area Primary Backup Notes
Infrastructure / hosting TBD TBD  
CI/CD pipelineTBDTBD 
Backend (Django) TBD TBD  
Frontend (Vue/Quasar) TBD TBD  
Theming / design TBD TBD  
Door / hardware access TBD TBD  
Billing & payments TBD TBD  
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.

# 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.