Saltar a contenido

Technology Stack

Generated: 2026-04-06 | Scan level: exhaustive

Overview

Desparchado is a Django monolith with a co-located Vue.js 3 frontend compiled by Vite. The backend serves both HTML pages (Django templates) and a REST API consumed by Vue components. The entire stack runs inside Docker for local development.

Backend

Category Technology Version Notes
Language Python 3.14
Framework Django ^6.0
API Django REST Framework ^3.16
API Docs drf-yasg ^1.21 Swagger/ReDoc at /swagger/
Database PostgreSQL + PostGIS GIS extension for geo coordinates
ORM driver psycopg 3.3
Auth django-allauth ^65.14 Email-only login, mandatory verification
Brute-force django-axes ^8.0 5-attempt lockout, 24h cooldown
Forms django-crispy-forms + crispy-bootstrap5 Bootstrap 5 rendering
Autocomplete django-autocomplete-light ^3.12 Select2 widgets for M2M fields
Slugs django-autoslug ^1.9 Auto-generated slugs
Filters django-filter ^25.2 DRF filter backend
Map widgets Custom LeafletPointFieldWidget Leaflet.js + OpenStreetMap PointField widget (places/widgets/leaflet.py)
Cleanup django-cleanup ^9.0 Deletes orphaned media files
Frontend integration django-vite ^3.1 Loads Vite manifest in templates
Email django-ses ^4.6 AWS SES backend
HTML sanitizer html-sanitizer ^2.6 Sanitizes user-provided HTML in descriptions
External data gspread ^6.2 Google Sheets API client for event imports
Date parsing python-dateutil ^2.9 Flexible date parsing in scrapers
Monitoring sentry-sdk ^2.47 Error tracking + performance tracing (prod only)
WSGI Gunicorn ^22.0 Production app server
Timestamps django-model-utils ^5.0 TimeStampedModel base class
Debug django-debug-toolbar ^6.1 Dev-only request profiling

Frontend

Category Technology Version Notes
Framework Vue.js 3 Composition API, <script setup>
Language TypeScript ^5.4 Strict mode, no any
Bundler Vite ^6.4 Multi-entry build, HMR in dev
Plugin @vitejs/plugin-vue ^5.2 .vue SFC support
CSS SCSS via sass-embedded ^1.86
SVG vite-svg-loader ^5.1 Import SVG as raw strings
Component docs Storybook ^8.6 Vue3+Vite builder, port 6006
Linting ESLint + eslint-plugin-vue ^9.25 / ^10.0
Formatting Prettier ^3.5
Testing Vitest + Playwright ^3.1 / ^1.56 Browser-based unit tests

Infrastructure & Deployment

Category Technology Notes
Containerization Docker + docker-compose 3 services: web, frontend, db
Production host Gunicorn + Nginx desparchado.co
Database service PostGIS image (docker-containers/db) Port 5032 local, 5432 internal
Frontend service Node image (docker-containers/frontend) Port 5173 (Vite), 6006 (Storybook)
CI/CD GitHub Actions Ruff lint, CodeQL security scan, Sentry release
Error tracking Sentry Production only; traces 100%, profiles 100%
Email delivery AWS SES Region us-east-1
Storage Django FileSystemStorage (media/static) No S3
Analytics Umami Optional (ANALYTICS_ENABLED)

Architecture Pattern

Django Monolith + Embedded SPA Components

  • Django renders full HTML pages using Django templates.
  • Vue 3 components are embedded in specific pages via data-vue-component attributes on DOM elements.
  • The VueComponentMount class (mount-vue.ts) auto-discovers and mounts all registered Vue components on DOMContentLoaded.
  • Vue components call the DRF REST API (/events/api/v1/) for dynamic data.
  • No client-side routing; navigation is handled by Django URLs.

Settings Split

File Purpose
desparchado/settings/base.py Shared config (DB, auth, middleware, email, maps)
desparchado/settings/dev.py Debug=True, relaxed hosts
desparchado/settings/production.py Sentry init, tight ALLOWED_HOSTS, manifest path
desparchado/settings/test.py Test DB name override, disables external services