A Django-powered interactive art portfolio featuring a force-directed graph visualization of curated artworks. Built with D3.js v3, Mapbox GL, and a fully editable admin interface.
- Interactive Visualization: Force-directed graph with dynamic connecting lines between artworks
- 60 Curated Artworks: Managed through Django admin with multi-language support (EN/DE/NL)
- Fully Editable via Admin: No code changes needed for content updates
- Menu items and structure
- Menu content sections (Contact, Websites, CO2 Compensation, Impressum)
- Categories and item relationships
- Artwork metadata and media files
- Multi-Language Support: English, German, Dutch
- Responsive UI: Search, zoom controls, and language switcher
- RESTful API: Tastypie-compatible endpoints for items, categories, and menu
- Django 5.2.8: Web framework
- MySQL 8.0: Dual database setup (local + remote)
- Gunicorn: WSGI HTTP server
- Nginx: Reverse proxy with CORS support
- D3.js v3: Force-directed graph visualization
- Mapbox GL JS v3.0.1: Map rendering
- jQuery 3.7.1: DOM manipulation
- Lodash 4.17.21: Utility functions
- Slick Carousel 1.9.0: Media gallery
- History.js: Browser history management
/opt/bitrauschen/
├── app/
│ └── index.html # Main frontend HTML
├── artworks/
│ ├── admin.py # Django admin configuration
│ ├── api_views.py # REST API endpoints
│ ├── cms_models.py # CmsItem model (60 artworks)
│ ├── menu_models.py # MenuItem, MenuContent, Category models
│ ├── home_views.py # Home page view
│ └── templates/ # Django templates
├── bitrauschen/
│ ├── settings.py # Django settings
│ ├── db_router.py # Database routing logic
│ └── wsgi.py # WSGI configuration
├── static/app/
│ ├── script.js # Main visualization logic
│ ├── settings.js # Frontend configuration
│ ├── style.css # Styles
│ ├── mapboxutil.js # Mapbox utilities
│ └── atlas_*.{json,png} # Sprite atlases
└── urls.py # URL routing
- Python 3.10+
- MySQL 8.0
- Nginx
- Virtual environment
-
Clone the repository
cd /opt git clone <your-repo-url> bitrauschen cd bitrauschen
-
Create virtual environment
python3 -m venv venv source venv/bin/activate -
Install dependencies
pip install django gunicorn mysqlclient django-cors-headers pillow
-
Configure databases Edit
bitrauschen/settings.pywith your database credentials:default: Remote WordPress database (Infomaniak)local_artworks: Local MySQL for artworks, auth, admin
-
Run migrations
python manage.py migrate --database=local_artworks
-
Create superuser
python manage.py createsuperuser
-
Collect static files
python manage.py collectstatic --noinput
-
Start Gunicorn
gunicorn --bind 127.0.0.1:8000 --workers 3 --timeout 120 bitrauschen.wsgi:application
-
Configure Nginx
- Proxy to
http://127.0.0.1:8000 - Add CORS headers for
/static/and/api/ - Set
client_max_body_size 10Mfor uploads
- Proxy to
cms_item (60 artworks)
id,title_en/de/nl,content_en/de/nlmediafile1-10: Media file pathslink_website,link_youtube, etc.latitude,longitude: For map positioningcreated,updated_at
menu_item (Hamburger menu structure)
title,url,order,is_active
menu_content (Menu section content)
section_key,title,content_html,order
category (Art categories)
name_en/de/nl,slug,color
item_category (Many-to-many relationships)
item_id,category_id
All endpoints return JSON:
GET /api/v1/item/- List all artworksGET /api/v1/item/<id>/- Get single artworkGET /api/v1/category/- List categoriesGET /api/v1/atlas/- Get sprite atlas metadataGET /api/v1/menu/- Get menu itemsGET /api/v1/menu-content/- Get menu content sections
Access at https://yourdomain.com/admin/
Available sections:
- CMS Items: Manage 60 artworks with thumbnails
- Menu Items: Edit menu structure (title, URL, order)
- Menu Content: Edit section content (Contact, Impressum, etc.)
- Categories: Manage art categories
- Item Categories: Link artworks to categories
- Force-Directed Graph: Items push/pull based on relationships
- Dynamic Lines: Beautiful connecting lines between related items
- Search: Real-time filtering by title, category, year
- Language Switching: Toggle between EN/DE/NL
- Media Gallery: Slick carousel for multiple images per item
- Map Integration: Mapbox GL for geographic context
Edit static/app/settings.js:
base_url: API endpoint base- Map configuration
- Visualization parameters
Key settings in bitrauschen/settings.py:
ALLOWED_HOSTSCORS_ALLOWED_ORIGINSDATABASES(dual database setup)MEDIA_ROOT,MEDIA_URLSTATIC_ROOT,STATIC_URL
Custom router in bitrauschen/db_router.py directs:
artworks,auth,admin,contenttypes,sessions→local_artworks- Everything else →
default(WordPress database)
All content editable via admin panel - no code changes needed!
- Add/Edit Artworks:
/admin/artworks/cmsitem/ - Manage Menu:
/admin/artworks/menuitem/ - Edit Content Sections:
/admin/artworks/menucontent/ - Categories:
/admin/artworks/category/ - Link Items to Categories:
/admin/artworks/itemcategory/
- Console debug statements commented out in
script.js - Thumbnails use original files from
/media/cms_archive/ - CORS enabled for API and static file endpoints
- Database writes go to local MySQL via custom router
Core Python packages:
Django==5.2.8gunicornmysqlclientdjango-cors-headerspillow
Frontend libraries (CDN):
- D3.js v3
- Mapbox GL JS v3.0.1
- jQuery 3.7.1
- Lodash 4.17.21
- Slick Carousel 1.9.0
- History.js 1.8
- Automatic thumbnail generation (60px, 120px)
- Populate categories dynamically
- Enhanced search with fuzzy matching
- Export/import functionality
- Real-time collaboration features
[Specify your license here]
Kaspar Koenig
- Website: https://kasparkoenig.com
- Email: studio@kasparkoenig.com
Last Updated: December 3, 2025
Version: 1.0.0 - Initial stable release with fully editable admin system