Self-hosted 360-degree feedback and performance review system.
Blik is an open-source application for conducting anonymous 360-degree feedback reviews. Built with Django, it provides organizations with a privacy-focused alternative to commercial performance review platforms.
Blik supports two local startup modes:
docker runstarts the standalone app container and uses SQLite by defaultdocker composestarts the full development stack and uses PostgreSQL by default
For a quick evaluation with ephemeral data:
docker build -t blik .
docker run -d --name blik -p 8000:8000 blikVisit http://localhost:8000/setup/ to complete the interactive setup wizard.
To persist SQLite data across container restarts without masking the application code:
docker run -d --name blik -p 8000:8000 \
-e DATABASE_URL=sqlite:////data/db.sqlite3 \
-v blik-data:/data \
blikOne-Click Deploy Options:
- DigitalOcean App Platform - Fully managed PaaS (~$20/month) - Guide
- Dokploy - Self-hosted deployment platform - Guide
Manual Deployment:
See complete guides for:
- DigitalOcean Deployment - App Platform or Droplet setup
- General Deployment Guide - Nginx/Caddy, email, SSL/HTTPS, backups
- Review Access - Token-based links and category-aggregated reports
- Admin Dashboard - Complete review cycle management interface
- Four Questionnaires - Professional Skills, Software Engineering, Manager 360, and 360 Degree Feedback templates
- Analytical Reports - Trends, peer benchmarks, perception gaps, and configurable reporting thresholds
- Email Notifications - SMTP integration for invitations
- Setup Wizard - Interactive first-run setup at
/setup/ - Docker-Ready - Containerized deployment with SQLite or PostgreSQL
- Administrator creates a review cycle and designates a reviewee
- System generates unique access tokens for each reviewer relationship
- Reviewers receive email invitations with tokenized access links
- Reviewers complete feedback forms accessible only via their token
- Responses are stored against tokens, which may contain invitation email addresses
- Reports are generated when minimum response thresholds are met
- Aggregated results are provided to reviewee and designated administrators
Blik supports confidential review workflows, but tokenized access is not an anonymity guarantee against database administrators:
- Reviewers use tokenized links rather than authenticated user accounts.
- Reports aggregate feedback by rater category and support minimum response thresholds.
- Responses reference reviewer tokens; tokens may store invitation email addresses.
- Invitation methods, permissions, thresholds, and identifying free-text comments affect confidentiality.
- Export and deletion tools support GDPR obligations; organizations remain responsible for lawful processing, retention, and access controls.
Marketing templates in templates/landing/ run under both the main application and the DB-less landing_settings deployment.
landing/context_processors.py:PRICINGsupplies hosted prices, employee caps, annual equivalents, and trial length to both deployments. Keep it aligned withsubscriptions/fixtures/plans.jsonand the checkout trial configuration; do not duplicate these values in page copy.plan_single_priceandplan_single_maxin the same dict describe the one-time Single Round. Keep them aligned with the Stripe price behindSTRIPE_PRICE_ID_SINGLEand with the 10 review-cycle credits the main app grants per purchase.- Hosted plans cap active reviewees, not organization members. Trial copy must state that a credit card is required.
- Competitor prices retain their source currency, source link, and actual verification date. Do not turn verification dates into dynamic current-year labels.
templates/landing/roi_calculator.htmldocuments its conversion and package assumptions. It uses published Blik tiers, and shows contact pricing rather than inventing a price or savings above the largest tier.- All landing layout, utilities, page components, and carousel styles live in
static/css/landing.css, loaded once by the landing base and standalone page templates. Keep page-specific rules scoped to their components so they do not affect other landing pages. Shared application and SVG diagram styles remain instatic/css/main.css, which is also loaded by reports. - Keep presentation out of template
styleattributes, embedded style blocks, and JavaScript style writes. Use component classes,hiddenfor visibility, and native progress values. The landing base owns mobile-menu and theme handlers; child pages must not register duplicate handlers. - Refresh checks: run
python manage.py check,DJANGO_SETTINGS_MODULE=landing_settings python manage.py check, andpython manage.py test accounts subscriptions landing. Render both deployments, parse JSON-LD, inspect the sitemap, and exercise calculator tier/minimum boundaries in a browser.
The standalone Docker image supports SQLite (default) and PostgreSQL:
docker run -d -p 8000:8000 \
-e DATABASE_TYPE=postgres \
-e DATABASE_URL=postgresql://user:password@host:5432/dbname \
blikOr with separate database variables:
docker run -d -p 8000:8000 \
-e DATABASE_TYPE=postgres \
-e DATABASE_HOST=your-db-host.example.com \
-e DATABASE_NAME=blik \
-e DATABASE_USER=blik_user \
-e DATABASE_PASSWORD=your_secure_password \
blikDatabase:
DATABASE_TYPE-sqlite(default) orpostgresDATABASE_URL- Full connection string (overrides individual settings)DATABASE_HOST,DATABASE_NAME,DATABASE_USER,DATABASE_PASSWORD- Individual settings
Security:
SECRET_KEY- Django secret key (auto-generated if not provided)ENCRYPTION_KEY- For encrypting SMTP passwordsALLOWED_HOSTS- Comma-separated hostnames (default:*)DEBUG-TrueorFalse(default:False)
Email & links:
SITE_DOMAIN,SITE_PROTOCOL- Public URL; every link in outgoing email is built from these, not from the request hostEMAIL_HOST,EMAIL_PORT,EMAIL_HOST_USER,EMAIL_HOST_PASSWORD,EMAIL_USE_TLS- SMTP settings
Any EMAIL_*, ORGANIZATION_NAME or ORGANIZATION_LANGUAGE variable you set here wins over the admin UI: it is re-applied on every container start, so those fields are shown read-only on the Settings page. Leave them unset (or empty) to configure email from the UI instead.
See docs/DEPLOYMENT.md for complete environment variable documentation.
git clone https://github.com/thijsdezoete/blik.git
cd blik
cp .env.example .env
docker compose -f docker-compose.yml -f docker-compose.dev.yml up -d --buildUnlike the standalone docker run example above, this Docker Compose setup uses PostgreSQL by default because docker-compose.yml starts both web and db services and sets DATABASE_TYPE=postgres.
The development override serves the app on localhost and reloads Python, templates,
and source assets inside the container. It keeps the same PostgreSQL data volume.
Use it while editing or merging branches: the base Compose file uses long-running
Gunicorn workers, whose code and cached templates require a coordinated restart.
Production continues to use the base Compose file and blik.settings.
Check that the web container is healthy:
docker compose logs -f webThen visit http://localhost:8000/setup/ to complete setup.
After changing texts, update the catalogues with
docker compose exec web python manage.py update_translations instead of editing them by hand.
See the Translation Guide for the workflow and the German terms.
See the Issues page for current development tasks. Contributors welcome for:
- Core application development
- UI/UX design
- Documentation and technical writing
- Internationalization and localization
- Security review and testing
- Deployment Guide - Production deployment with Dokploy, manual Docker, Nginx/Caddy setup, email configuration
- Admin Guide - Managing review cycles, users, and questionnaires
- User Guide - For reviewees and reviewers
- Report Guide - Understanding feedback reports
- Requirements - MVP requirements and roadmap
- Translation Guide - Updating the catalogues, marking texts, German terms
- Backend: Django 5.x with multi-organization support
- Database: SQLite (default) or PostgreSQL 15
- Frontend: Django templates with modern CSS
- Deployment: Docker and Docker Compose with Gunicorn
- Static Files: WhiteNoise for efficient static file serving
- Email: SMTP integration (supports Gmail, SendGrid, AWS SES, Mailgun, etc.)
Blik is licensed under the GNU Affero General Public License v3.0 (AGPL-3.0). See LICENSE for details.
The AGPL license ensures that any modifications used to provide a network service must be made available as open source, while allowing free use for internal organizational purposes.