paxalia-dashboard
A privacy-first, self-hosted analytics, observability, security, and administration platform for Django, from Paxalia.
paxalia-dashboard brings product analytics, runtime/server visibility, security monitoring, persistent structured
logging, release context, reporting, data utilities, and a full Django-native administrative workspace into one package
that runs inside your own Django application.
There is no required third-party analytics SaaS, tracking pixel, hosted collector, or cloud dashboard.
Optional integrations such as billing models, Celery, Slack, Discord, email delivery, or webhooks are enabled only when your host project configures them.
Table of Contents
- Paxalia Dashboard v4.0.0 — Final Security & Usage Overview
- Runtime Dependency Set
- Why paxalia-dashboard?
- Comparison at a glance
- The real value: features you notice later
- What Paxalia Dashboard is — and is not
- Features
- Tech Stack
- Installation
- Configuration
- Middleware Integration
- Dashboard Pages
- Custom Event Tracking
- Real User Monitoring
- Uptime Monitoring
- Compliance
- Data Import
- Slack/Discord App
- Admin Overview
- Server Monitoring
- Bot Traffic
- Backup Management
- Internationalization
- Themes
- Exporting Data
- Billing Integration
- Security Center
- Paxalia Auth & Administrator Security
- Paxalia Error Pages
- Advanced Analytics
- Reporting & Sharing
- Paxalia API
- Dependency Health
- Notifications & Alerts
- Multi-Site Analytics
- Release Center
- Paxalia Logging / Observability
- Paxalia Admin & Packages
- Paxalia Package Format
- Operational Commands
- Security & Privacy Model
- Architecture & Extensibility
- Project Structure
- Contributing
- Ideas for contribution
- License
- Credits
Paxalia Dashboard v4.0.0 — Final Security & Usage Overview
Paxalia Dashboard v4.0.0 is a complete Django-native operational workspace: analytics, runtime observability, persistent logging, security monitoring, administration, data portability, reporting, integrations, localization, and a dedicated administrator authentication boundary all live inside the Django application that owns the data.
The v4 administrator security model is intentionally layered. The dashboard does not rely on a single password, a hidden URL, or a browser fingerprint as its only protection.
Paxalia Administrator Access
1. Password
↓
2. Mandatory 2FA
↓
3. Authorized Device
↓
4. Authentication Rate Limits
↓
5. CSRF Protection
↓
6. Isolated Administrator Authentication
↓
7. Secret Dashboard Path
↓
Protected Paxalia Dashboard
The first three layers are the required authentication chain. The remaining layers are defense-in-depth controls around that chain:
Password → TOTP / recovery → WebAuthn device
│
├── login / 2FA / device rate limits
├── Django CSRF enforcement
├── dedicated Paxalia SessionStore + cookie
└── deployment-specific private dashboard path
The default administrator mode is isolated:
Host Website Authentication
│
└── host session / host cookies
│
│ completely separate
▼
Paxalia Administrator Authentication
│
├── password
├── Paxalia TOTP
├── authorized WebAuthn credential
└── paxalia_admin_session
The two systems can use the same Django user model and the same Django session backend without sharing the same session state. This keeps the package independently usable while preventing ordinary host login, host 2FA, host session rotation, or host logout behavior from becoming the Paxalia administrator session.
The complete v4 presentation layer also includes twelve built-in themes built on shared design tokens, responsive desktop, tablet, and mobile layouts, RTL support, bundled chart/map assets, and reusable component styling.
Why paxalia-dashboard
paxalia-dashboard is a Django-native operational intelligence and administration layer for real applications.
It started from the practical need to understand what an application is doing, but a real product eventually needs much more than page-view analytics. It needs a way to observe behavior, investigate failures, understand infrastructure, review security, administer application data, move structured data between environments, and keep important operational context close to the application itself.
Paxalia Dashboard brings those concerns together inside the Django project that owns the data.
The platform combines:
- product and traffic analytics
- behavioral analytics
- bot and crawler classification
- real user monitoring
- JavaScript error visibility
- server/runtime monitoring
- slow-query and queue visibility
- uptime checks and incident history
- release and deployment context
- security monitoring
- persistent structured logging
- reporting and protected sharing
- API access and scoped keys
- backup utilities
- historical data import
- multi-site analytics
- compliance controls
- a generic Django-native Admin
- localization-aware administration
- model-aware
.paxaliapackage import/export - operational diagnostics and maintenance commands
The central design goal is:
Keep operational data close to the application that produced it, make the data inspectable, and let Django remain the source of truth.
That means Paxalia Dashboard is deliberately broad, but it is still a Django application package. It is not an alternative to Django and it does not attempt to replace Django's core responsibilities.
Your Django application continues to own:
- models and the ORM
- authentication
- permissions
- URL routing
- forms and business rules
- migrations
- database infrastructure
- deployment
- the operating system
- the reverse proxy
- physical backup/disaster-recovery systems
Paxalia adds the operational, analytical, security, administrative, and data-workflow layer around that application.
Comparison at a glance
The following comparison is intentionally broad. Paxalia Dashboard is not just an analytics counter; its scope reaches from product measurement and browser telemetry through server operations, security, persistent logging, administration, localization, and logical data portability.
This is a directional capability comparison rather than a procurement benchmark. Third-party products vary by product,
edition,
plan, integration, and deployment. N/A means the capability is outside the primary purpose of that category. Varies
means
support depends substantially on the specific product or deployment.
| Area | Capability | Google Analytics | Typical lightweight Django analytics package | paxalia-dashboard |
|---|---|---|---|---|
| Foundation | Self-hosted application | ❌ | ✅ | ✅ |
| Foundation | First-party storage in host infrastructure | ❌ | ✅ | ✅ |
| Foundation | Django-native integration | ❌ | ✅ | ✅ |
| Foundation | Required hosted analytics collector | ✅ | Usually no | ❌ |
| Foundation | No mandatory analytics SaaS dependency | ❌ | Usually yes | ✅ |
| Foundation | Bundled chart assets | ❌ | Varies | ✅ |
| Foundation | Bundled map assets | ❌ | Rare | ✅ |
| Foundation | No public CDN required for core dashboard assets | ❌ | Varies | ✅ |
| Foundation | Single configurable package surface | ❌ | Varies | ✅ |
| Foundation | Host-project configuration namespace | ❌ | Varies | ✅ |
| Foundation | Optional external integrations | Varies | Varies | ✅ |
| Analytics | Page views | ✅ | ✅ | ✅ |
| Analytics | Sessions | ✅ | ✅ | ✅ |
| Analytics | Session duration | ✅ | Varies | ✅ |
| Analytics | Bounce-related metrics | ✅ | Varies | ✅ |
| Analytics | Pages per session | ✅ | Varies | ✅ |
| Analytics | One-click date presets | ✅ | Varies | ✅ |
| Analytics | Arbitrary date ranges | ✅ | Varies | ✅ |
| Analytics | Previous-period comparison | ✅ | Rare | ✅ |
| Analytics | Searchable page tables | ✅ | Varies | ✅ |
| Analytics | Paginated page tables | ✅ | Varies | ✅ |
| Analytics | Traffic-source analysis | ✅ | Varies | ✅ |
| Analytics | Referrer analysis | ✅ | Varies | ✅ |
| Analytics | Browser breakdown | ✅ | Varies | ✅ |
| Analytics | Operating-system breakdown | ✅ | Varies | ✅ |
| Analytics | Device breakdown | ✅ | Varies | ✅ |
| Analytics | API traffic separation | Varies | Rare | ✅ |
| Analytics | API endpoint analytics | Varies | Rare | ✅ |
| Analytics | Status-code distribution | Varies | Rare | ✅ |
| Analytics | Real-time visitor monitoring | ✅ | Rare | ✅ |
| Analytics | Recent activity feed | Varies | Rare | ✅ |
| Analytics | Search-query parameter analysis | Varies | Rare | ✅ |
| Geography | Offline GeoIP database support | ❌ | Rare | ✅ |
| Geography | Country analysis | ✅ | Rare | ✅ |
| Geography | City analysis | ✅ | Rare | ✅ |
| Geography | Offline world-map presentation | ❌ | Rare | ✅ |
| Geography | Country-to-city drill-down | Varies | Rare | ✅ |
| Behavioral | Custom event tracking | ✅ | Varies | ✅ |
| Behavioral | Event categories/actions/labels | ✅ | Varies | ✅ |
| Behavioral | Event numeric values | ✅ | Rare | ✅ |
| Behavioral | Goal definitions | ✅ | Rare | ✅ |
| Behavioral | Funnel definitions | ✅ | Rare | ✅ |
| Behavioral | Funnel drop-off analysis | ✅ | Rare | ✅ |
| Behavioral | Reusable behavioral segments | ✅ | Rare | ✅ |
| Behavioral | Campaign/UTM analysis | ✅ | Varies | ✅ |
| Behavioral | Campaign-source analysis | ✅ | Varies | ✅ |
| Behavioral | Campaign-medium analysis | ✅ | Varies | ✅ |
| Behavioral | Campaign-name analysis | ✅ | Varies | ✅ |
| Behavioral | Cohort analysis | ✅ | Rare | ✅ |
| Behavioral | Retention analysis | ✅ | Rare | ✅ |
| Behavioral | Chart annotations | Varies | Rare | ✅ |
| Behavioral | Deployment-linked annotations | ❌ | Rare | ✅ |
| Web quality | Broken-link / 404 analysis | Varies | Rare | ✅ |
| RUM | Core Web Vitals | ✅ | Rare | ✅ |
| RUM | LCP collection | ✅ | Rare | ✅ |
| RUM | CLS collection | ✅ | Rare | ✅ |
| RUM | INP collection | ✅ | Rare | ✅ |
| RUM | 75th-percentile presentation | ✅ | Rare | ✅ |
| RUM | Good/needs-improvement/poor breakdown | ✅ | Rare | ✅ |
| RUM | Browser JavaScript error capture | ✅ | Rare | ✅ |
| RUM | window.onerror capture |
Varies | Rare | ✅ |
| RUM | Unhandled rejection capture | Varies | Rare | ✅ |
| RUM | Browser error deduplication | Varies | Rare | ✅ |
| RUM | Bounded browser error ingestion | Varies | Rare | ✅ |
| Uptime | Scheduled HTTP checks | Varies | Rare | ✅ |
| Uptime | GET monitoring | Varies | Rare | ✅ |
| Uptime | HEAD monitoring | Varies | Rare | ✅ |
| Uptime | POST monitoring | Varies | Rare | ✅ |
| Uptime | Expected status-code validation | Varies | Rare | ✅ |
| Uptime | Configurable timeout | Varies | Rare | ✅ |
| Uptime | Per-monitor intervals | Varies | Rare | ✅ |
| Uptime | Status history | Varies | Rare | ✅ |
| Uptime | Transition-based incidents | Varies | Rare | ✅ |
| Uptime | Recovery detection | Varies | Rare | ✅ |
| Uptime | Uptime percentage | Varies | Rare | ✅ |
| Uptime | Uptime alert integration | Varies | Rare | ✅ |
| Bot intelligence | Bot-path classification | Varies | Rare | ✅ |
| Bot intelligence | Search-engine crawler classification | Varies | Rare | ✅ |
| Bot intelligence | AI crawler classification | Varies | Rare | ✅ |
| Bot intelligence | Social-preview classification | Varies | Rare | ✅ |
| Bot intelligence | SEO-tool classification | Varies | Rare | ✅ |
| Bot intelligence | Generic bot classification | Varies | Rare | ✅ |
| Bot intelligence | Malicious/scanner classification | Varies | Rare | ✅ |
| Bot intelligence | Dedicated Bot Traffic dashboard | Varies | Rare | ✅ |
| Bot intelligence | Historical bot-category backfill | Varies | Rare | ✅ |
| Server | CPU monitoring | ❌ | ❌ | ✅ |
| Server | Per-core CPU history | ❌ | ❌ | ✅ |
| Server | Load-average monitoring | ❌ | ❌ | ✅ |
| Server | Memory monitoring | ❌ | ❌ | ✅ |
| Server | Swap monitoring | ❌ | ❌ | ✅ |
| Server | Disk usage | ❌ | ❌ | ✅ |
| Server | Disk I/O history | ❌ | ❌ | ✅ |
| Server | Network-interface statistics | ❌ | ❌ | ✅ |
| Server | Network traffic history | ❌ | ❌ | ✅ |
| Server | System-service visibility | ❌ | ❌ | ✅ |
| Server | Process monitoring | ❌ | ❌ | ✅ |
| Server | Slow-query capture | ❌ | ❌ | ✅ |
| Server | Configurable slow-query threshold | ❌ | ❌ | ✅ |
| Server | Celery queue visibility | ❌ | ❌ | ✅ |
| Server | Deployment recording | ❌ | ❌ | ✅ |
| Server | Deployment-to-chart correlation | ❌ | ❌ | ✅ |
| Security | Security Center | ❌ | Rare | ✅ |
| Security | Login activity visibility | Varies | Rare | ✅ |
| Security | Failed-login monitoring | Varies | Rare | ✅ |
| Security | Active-session visibility | Varies | Rare | ✅ |
| Security | Session-revocation visibility | Varies | Rare | ✅ |
| Security | IP blocklist controls | ❌ | Rare | ✅ |
| Security | Optional blocking middleware | ❌ | Rare | ✅ |
| Security | CSP violation reporting | ❌ | Rare | ✅ |
| Security | Security scorecard | ❌ | Rare | ✅ |
| Security | Mandatory administrator TOTP 2FA | ❌ | Rare | ✅ |
| Security | Backup-download re-authentication | ❌ | Rare | ✅ |
| Security | Failed-login threshold detection | Varies | Rare | ✅ |
| Security | Security email alerts | Varies | Rare | ✅ |
| Security | Security webhook alerts | Varies | Rare | ✅ |
| Security | In-dashboard alert history | Varies | Rare | ✅ |
| Security | Security audit events | ❌ | Rare | ✅ |
| Logging | Persistent structured application logging | ❌ | Rare | ✅ |
| Logging | Standard Python logging capture | ❌ | Rare | ✅ |
| Logging | Django logger capture | ❌ | Rare | ✅ |
| Logging | Direct paxalia.log() API |
❌ | ❌ | ✅ |
| Logging | Request lifecycle logging | ❌ | ❌ | ✅ |
| Logging | Request ID context | ❌ | Rare | ✅ |
| Logging | Correlation ID context | ❌ | Rare | ✅ |
| Logging | Trace ID context | ❌ | Rare | ✅ |
| Logging | Session context | ❌ | Rare | ✅ |
| Logging | User context | ❌ | Rare | ✅ |
| Logging | Site context | ❌ | Rare | ✅ |
| Logging | Traffic context | ❌ | Rare | ✅ |
| Logging | Browser-error integration | ❌ | Rare | ✅ |
| Logging | Exception-type storage | ❌ | Rare | ✅ |
| Logging | Stack-trace storage | ❌ | Rare | ✅ |
| Logging | Stable event fingerprints | ❌ | Rare | ✅ |
| Logging | Event grouping | ❌ | Rare | ✅ |
| Logging | Occurrence counting | ❌ | Rare | ✅ |
| Logging | Suppression counting | ❌ | Rare | ✅ |
| Logging | Representative samples | ❌ | Rare | ✅ |
| Logging | Grouping windows | ❌ | Rare | ✅ |
| Logging | Handler-topology deduplication | ❌ | Rare | ✅ |
| Logging | Configurable sensitive-key redaction | ❌ | Rare | ✅ |
| Logging | Bounded log-message sizes | ❌ | Rare | ✅ |
| Logging | Bounded stack sizes | ❌ | Rare | ✅ |
| Logging | Bounded structured metadata | ❌ | Rare | ✅ |
| Logging | Bounded browser event rate | ❌ | Rare | ✅ |
| Logging | Category-specific retention | ❌ | Rare | ✅ |
| Logging | Request-less/background logging | ❌ | Rare | ✅ |
| Logging | Detailed incident investigation | ❌ | Rare | ✅ |
| Logging | Related-event discovery | ❌ | Rare | ✅ |
| Logging | Sanitized “Copy for AI” context | ❌ | Rare | ✅ |
| Administration | Generic Django-native Admin workspace | ❌ | Varies | ✅ |
| Administration | Django Admin registry as source of truth | ❌ | Rare | ✅ |
| Administration | Application grouping | ❌ | Rare | ✅ |
| Administration | Dynamic model discovery | ❌ | Varies | ✅ |
| Administration | Capability discovery | ❌ | Rare | ✅ |
| Administration | Searchable model catalog | ❌ | Rare | ✅ |
| Administration | Application collapse/expand | ❌ | Rare | ✅ |
| Administration | Metadata-aware model search | ❌ | Rare | ✅ |
| Administration | list_display compatibility |
❌ | Varies | ✅ |
| Administration | Search compatibility | ❌ | Varies | ✅ |
| Administration | Filter compatibility | ❌ | Varies | ✅ |
| Administration | Ordering compatibility | ❌ | Varies | ✅ |
| Administration | Pagination | ❌ | Varies | ✅ |
| Administration | Date hierarchy support | ❌ | Rare | ✅ |
| Administration | list_editable compatibility |
❌ | Rare | ✅ |
| Administration | Query-state preservation | ❌ | Rare | ✅ |
| Administration | Django ModelForm integration | ❌ | Varies | ✅ |
| Administration | Fieldsets | ❌ | Varies | ✅ |
| Administration | Read-only fields | ❌ | Varies | ✅ |
| Administration | Object-level permission hooks | ❌ | Rare | ✅ |
| Administration | Safe create/read/update/delete | ❌ | Varies | ✅ |
| Administration | Deletion preview | ❌ | Rare | ✅ |
| Administration | Protected/dependent deletion handling | ❌ | Rare | ✅ |
| Administration | Safe bulk deletion | ❌ | Rare | ✅ |
| Administration | Django custom actions | ❌ | Rare | ✅ |
| Administration | ForeignKey inspection | ❌ | Rare | ✅ |
| Administration | OneToOne inspection | ❌ | Rare | ✅ |
| Administration | ManyToMany inspection | ❌ | Rare | ✅ |
| Administration | Reverse-relation inspection | ❌ | Rare | ✅ |
| Administration | Self-reference handling | ❌ | Rare | ✅ |
| Administration | TabularInline support where representable |
❌ | Rare | ✅ |
| Administration | StackedInline support where representable |
❌ | Rare | ✅ |
| Administration | Model statistics | ❌ | Rare | ✅ |
| Administration | Choice distributions | ❌ | Rare | ✅ |
| Administration | Created/updated counts where detectable | ❌ | Rare | ✅ |
| Administration | History view | ❌ | Rare | ✅ |
| Administration | Audit context | ❌ | Rare | ✅ |
| Administration | Sensitive-field masking | ❌ | Rare | ✅ |
| Administration | Django Admin fallback for exotic behavior | ❌ | N/A | ✅ |
| Localization | Configured-language discovery | ❌ | Rare | ✅ |
| Localization | Translation-system discovery | ❌ | Rare | ✅ |
| Localization | django-parler-style support | ❌ | Rare | ✅ |
| Localization | Translation completeness | ❌ | Rare | ✅ |
| Localization | Missing-translation inspection | ❌ | Rare | ✅ |
| Localization | Language-aware editing | ❌ | Rare | ✅ |
| Localization | RTL-compatible presentation | ❌ | Rare | ✅ |
| Localization | Translation-aware exports | ❌ | Rare | ✅ |
| Localization | Translation-aware imports | ❌ | Rare | ✅ |
| Packages | Logical .paxalia package format |
❌ | Rare | ✅ |
| Packages | Versioned package metadata | ❌ | Rare | ✅ |
| Packages | ZIP package container | ❌ | Rare | ✅ |
| Packages | Manifest validation | ❌ | Rare | ✅ |
| Packages | SHA-256 integrity validation | ❌ | Rare | ✅ |
| Packages | Duplicate ZIP-member protection | ❌ | Rare | ✅ |
| Packages | Archive path-traversal protection | ❌ | Rare | ✅ |
| Packages | Size/count safety limits | ❌ | Rare | ✅ |
| Packages | Selected-model export | ❌ | Rare | ✅ |
| Packages | Filtered-model export | ❌ | Rare | ✅ |
| Packages | Multi-model export | ❌ | Rare | ✅ |
| Packages | Identity-aware export/import | ❌ | Rare | ✅ |
| Packages | Configurable identity fields | ❌ | Rare | ✅ |
| Packages | ForeignKey preservation | ❌ | Rare | ✅ |
| Packages | OneToOne preservation | ❌ | Rare | ✅ |
| Packages | ManyToMany preservation | ❌ | Rare | ✅ |
| Packages | Self-reference preservation | ❌ | Rare | ✅ |
| Packages | Translation preservation | ❌ | Rare | ✅ |
| Packages | UUID serialization | ❌ | Rare | ✅ |
| Packages | Decimal/date/time serialization | ❌ | Rare | ✅ |
| Packages | File-field logical-path serialization | ❌ | Rare | ✅ |
| Packages | Lazy-translation serialization | ❌ | Rare | ✅ |
| Packages | Configurable conflict strategies | ❌ | Rare | ✅ |
| Packages | Import preview | ❌ | Rare | ✅ |
| Packages | Dry-run import | ❌ | Rare | ✅ |
| Packages | Atomic import | ❌ | Rare | ✅ |
| Packages | Partial-success import | ❌ | Rare | ✅ |
| Packages | Structured failure reporting | ❌ | Rare | ✅ |
| Packages | Failed-subset retry packages | ❌ | Rare | ✅ |
| Packages | Protected-model encryption requirements | ❌ | Rare | ✅ |
| Packages | Authenticated package encryption | ❌ | Rare | ✅ |
| Packages | Wrong-password handling | ❌ | Rare | ✅ |
| Packages | Tamper detection | ❌ | Rare | ✅ |
| Packages | Permission-aware package operations | ❌ | Rare | ✅ |
| Packages | Package operation auditability | ❌ | Rare | ✅ |
| Packages | CLI package validation | ❌ | Rare | ✅ |
| Packages | CLI package inspection | ❌ | Rare | ✅ |
| Operations | Backup path configuration | ❌ | ❌ | ✅ |
| Operations | Backup storage management | ❌ | ❌ | ✅ |
| Operations | Scheduled backup support | ❌ | ❌ | ✅ |
| Operations | Backup retention | ❌ | ❌ | ✅ |
| Operations | Background backup creation | ❌ | ❌ | ✅ |
| Operations | Chunked large-file download | ❌ | ❌ | ✅ |
| Operations | Chunked upload workflow | ❌ | ❌ | ✅ |
| Operations | Historical GA aggregate CSV import | Varies | Rare | ✅ |
| Operations | Historical Plausible aggregate CSV import | Varies | Rare | ✅ |
| Operations | Per-data-type retention | Varies | Rare | ✅ |
| Operations | Visitor-deletion tooling | Varies | Rare | ✅ |
| Operations | Scheduled email reports | Varies | Rare | ✅ |
| Operations | PDF reports | Varies | Rare | ✅ |
| Operations | Protected dashboard sharing | Varies | Rare | ✅ |
| Operations | Scoped API keys | ✅ | Rare | ✅ |
| Operations | API documentation surface | ✅ | Rare | ✅ |
| Operations | Slack command surface | Varies | Rare | ✅ |
| Operations | Discord command surface | Varies | Rare | ✅ |
| Operations | Multi-site analytics | Varies | Rare | ✅ |
| Operations | Dependency-closure inspection | ❌ | ❌ | ✅ |
| Operations | Release-artifact context | ❌ | Rare | ✅ |
| Operations | In-dashboard notifications | Varies | Rare | ✅ |
| Operations | Email alert destinations | Varies | Rare | ✅ |
| Operations | Webhook alert destinations | Varies | Rare | ✅ |
| Diagnostics | Dashboard-wide diagnostics | ❌ | Rare | ✅ |
| Diagnostics | Admin-specific diagnostics | ❌ | Rare | ✅ |
| Diagnostics | Logging-specific diagnostics | ❌ | Rare | ✅ |
| Diagnostics | Package inspection CLI | ❌ | Rare | ✅ |
| Diagnostics | Package validation CLI | ❌ | Rare | ✅ |
| Diagnostics | Focused Admin test suite | ❌ | Rare | ✅ |
| Diagnostics | Logging test suite | ❌ | Rare | ✅ |
| Diagnostics | Scheduled maintenance commands | ❌ | Rare | ✅ |
| Presentation | Internationalized UI | Varies | Rare | ✅ |
| Presentation | RTL dashboard support | Varies | Rare | ✅ |
| Presentation | Responsive desktop/tablet/mobile UI | Varies | Varies | ✅ |
| Presentation | Theme system | Varies | Rare | ✅ |
| Presentation | Multiple built-in themes | Varies | Rare | ✅ |
| Presentation | Shared design-token styling | ❌ | Rare | ✅ |
| Presentation | Offline chart/map assets | ❌ | Rare | ✅ |
The important difference is not simply the number of checkmarks. It is the co-location of these capabilities: the same Django application can own the analytics data, runtime context, logs, security signals, administrative workflows, and logical package operations without creating another independent operational data plane.
The real value: features you notice later
Not every feature has the same visibility.
Some capabilities are immediately attractive because their value is visible at a glance:
- analytics charts
- real-time visitors
- geography
- RUM
- security scorecards
- server dashboards
- elegant reports
Other capabilities are quieter. They are often the features a team does not think about while building a prototype, but they can become unusually important once the application is a real product with real data, real users, real incidents, and real operational history.
A useful way to understand Paxalia is:
WHAT ATTRACTS YOU FIRST
↓
analytics
RUM
security
server visibility
reports
↓
WHAT BECOMES IMPORTANT LATER
↓
persistent logging
request correlation
generic administration
permissions
safe CRUD
relationships
localization
package export/import
identity resolution
translation preservation
failure reporting
retry workflows
retention
diagnostics
auditability
The production gap
During early development, a team can often work with:
database
+
Django Admin
+
a few logs
+
a few analytics charts
As the product grows, the operational questions become more demanding.
You start needing to know:
What failed?
Where?
For which request?
For which user/session?
Was it one failure or thousands?
Is there a common fingerprint?
Did it begin after a deployment?
Is the problem in the browser, application, API, or server?
What related events happened around it?
You also start needing to answer administrative questions:
Which models exist?
Which applications own them?
Which permissions apply?
Which fields are sensitive?
Which records can this administrator change?
Which relationships exist?
Which translations are missing?
Which actions are available?
How can a subset of application data be moved safely?
And eventually data portability becomes practical:
Can I export selected models?
Can I preserve relationships?
Can I preserve translations?
Can I resolve identities without blindly restoring primary keys?
Can I preview the result before changing the database?
Can I dry-run it?
Can I choose update/skip behavior?
Can I perform an atomic import?
Can I isolate independent failures?
Can I retry only the failed subset?
Can protected data require encryption?
Can I validate the package before importing it?
Those are not always "shining" features.
They are the kind of features that become valuable because the application exists in the first place.
Why the package is intentionally large
Paxalia Dashboard is large because it covers a wide operational surface around Django, not because it tries to replace Django.
The package is best understood as a set of connected layers:
Django application
│
┌────────────────┼────────────────┐
│ │ │
▼ ▼ ▼
Analytics Security Application
│ │ operations
│ │ │
├───────┬────────┴───────┬────────┤
│ │ │ │
▼ ▼ ▼ ▼
RUM Logging Admin Packages
│ │ │ │
└───────┴────────────────┴────────┘
│
▼
one Django-native view
The point is not that every team needs every feature every day.
The point is that a production product eventually crosses multiple concerns, and Paxalia provides a coherent place to handle those concerns without forcing each one into a completely separate system.
A deliberate balance
Paxalia Dashboard therefore has two kinds of value:
VISIBLE VALUE
dashboards
analytics
RUM
security
reports
QUIET VALUE
logs
context
admin
permissions
portability
package integrity
localization
diagnostics
retention
audit
The first group may get someone interested.
The second group can be what makes the package difficult to replace once it becomes part of the application's operating workflow.
That balance is intentional.
What Paxalia Dashboard is — and is not
Paxalia Dashboard is a large Django application package, but it does not attempt to become a second Django.
It does not replace:
- Django's ORM
- Django models
- Django authentication
- Django permissions
- Django URL routing
- Django forms
- Django migrations
- Django Admin
- your database
- your reverse proxy
- your operating system
- your deployment system
- your infrastructure
- your physical disaster-recovery strategy
Instead, it integrates with Django's existing architecture.
The administrative data flow is deliberately:
Django Admin registry
↓
Paxalia Admin registry/adapter
↓
permissions
↓
query + services + forms
↓
Paxalia Admin views
↓
Paxalia UI
The generic package workflow is similarly additive:
registered Django models
↓
permission-aware selection
↓
logical serialization
↓
identity / relationships / translations
↓
integrity + security
↓
.paxalia package
And the logging workflow is another layer around normal application execution:
Python / Django logging
+
paxalia.log()
↓
normalization
↓
request/runtime context
↓
redaction
↓
fingerprint/grouping
↓
persistent observability
Django remains the authority.
Paxalia supplies additional operational intelligence around it.
Paxalia Dashboard and the wider Paxalia ecosystem
paxalia-dashboard is the open-source Django-focused project in the broader Paxalia product ecosystem.
The main Paxalia application is a much larger systemizing app built around Workspaces and connected systems for organizing work, time, goals, information, visual thinking, collaboration, portability, synchronization, and offline continuity.
The relationship is best understood as:
Paxalia
↓
systemize
connect
organize
operate
↓
Paxalia Dashboard
↓
help Django applications
observe
understand
protect
administer
and move their application data
The dashboard is useful independently. It does not require the main Paxalia application to run.
At the same time, it shares the broader Paxalia philosophy of building systems that become more useful when the parts connect.
Paxalia is still evolving, and the dashboard is intended as a strong foundation rather than a claim that the ecosystem has reached its final form. Future releases can add deeper integrations, more automation, more intelligent operational tooling, and other capabilities as the product and its community grow.
Features
Paxalia is intentionally a platform rather than a single dashboard widget. Features are modular: a host project can use the analytics layer, observability layer, security layer, Admin layer, package workflows, or operational utilities according to its needs.
Analytics
- Page Views & Sessions — page visits, sessions, duration, bounce-related metrics, and pages-per-session reporting.
- Traffic Sources — referrers, browsers, operating systems, devices, and source breakdowns.
- Date Range Analysis — reusable presets plus explicit start/end ranges.
- Period Comparison — compare the selected period with its corresponding previous period.
- Interactive Tables — searchable, paginated operational tables with CSV/JSON export where supported.
- API Traffic Analytics — separate API activity from normal page traffic using configurable rules.
- Real-Time Monitoring — live visitor and recent-request views with configurable refresh intervals.
- Geography — offline GeoIP-backed country and city analysis with a bundled map asset workflow.
Behavioral analytics
- Custom Events — track product interactions such as clicks, form submissions, video engagement, and downloads.
- Goals — define conversion targets and measure completion behavior.
- Funnels — inspect multi-step conversion paths and drop-off.
- Segments — build reusable behavioral audience definitions.
- Campaign / UTM Analytics — compare campaign source, medium, and campaign performance.
- Cohorts — analyze return/retention behavior across visitor cohorts.
- Annotations — connect important operational dates such as deployments, incidents, or launches to analytics charts.
- Broken Links — identify paths returning 404 responses and inspect their referring context.
Runtime observability
- Real User Monitoring — LCP, CLS, INP and field-performance breakdowns.
- JavaScript Error Tracking — browser exceptions and unhandled rejections with bounded ingestion.
- Uptime Monitoring — scheduled HTTP checks, status history, and transition-based incidents.
- Server Monitoring — CPU, memory, disk, network, services, and processes.
- Slow Query Monitoring — opt-in database query timing.
- Celery Monitoring — worker/task visibility when the host Celery application is configured.
- Deployment Tracking — release/deployment records connected to chart annotations.
- Persistent Logs — application and request observability in the same operational dashboard.
Security
- Mandatory Administrator Authentication — privileged dashboard access requires password authentication, confirmed TOTP/recovery verification, and an authorized WebAuthn device credential.
- Administrator Authentication Isolation — the default mode stores the final Paxalia administrator session in a
dedicated Django
SessionStoreand a separatepaxalia_admin_sessioncookie scoped to the dashboard path. - Authentication Rate Limiting — login, 2FA, and device ceremonies have independent configurable attempt/window limits; failed-login thresholds also feed Security Center alerting.
- CSRF Protection — authentication and state-changing browser operations are designed to remain behind Django's CSRF middleware; the bundled WebAuthn JSON helper sends the current CSRF token with POST requests.
- Secret Dashboard Path — the full administrator surface can be mounted below a deployment-specific private path; production configuration requires a high-entropy URL-safe segment.
- Security Center — authentication activity, active sessions, IP blocklists, security events, and posture.
- Security Scorecard — security configuration findings in one operational view.
- CSP Violation Reporting — application-level visibility into browser policy violations.
- Mandatory Administrator 2FA — every privileged Paxalia Dashboard administrator must complete the configured TOTP second-factor enrollment and verification before administrative access is established.
- Backup Re-authentication — recent authentication can be required before sensitive backup downloads.
- Sensitive Data Redaction — common credential and secret fields are sanitized before persistent presentation/storage where the package policy applies.
- Auditability — privileged dashboard/admin/package operations can be connected to the existing audit/security architecture.
Administration and data portability
- Generic Paxalia Admin — a Django-native model administration layer.
- Model Search and Discovery — searchable application/model catalog with collapse/expand behavior.
- Django Permission Reuse — registered
ModelAdminpermission hooks remain authoritative. - CRUD and Actions — normal administrative workflows without host-model hard-coding.
- Relationships and Inlines — inspect and manage supported Django relationship structures.
- Localization Workspace — discover and edit supported translation systems using configured project languages.
- Package Center — model-aware
.paxaliaimport/export. - Package Validation — structural and integrity validation before package mutation.
- Encrypted Packages — authenticated encryption for protected/sensitive package flows.
- Retry Packages — retry failed subsets without reconstructing them manually.
Operations and utilities
- Backup Management — configurable paths, storage, retention, scheduled backups, and chunked transfer.
- Historical Data Import — GA/Plausible aggregate CSV import without vendor OAuth credentials.
- Reporting — scheduled email/PDF reports where configured.
- Protected Sharing — read-only sharing for selected dashboard views.
- Scoped API Keys — explicit read/ingestion scopes instead of an all-purpose secret.
- Dependency Health — inspect runtime dependency state and progressively compare installed versions with available releases.
- Notifications & Alerts — in-dashboard history plus optional email/webhook delivery.
- Multi-Site Analytics — multiple configured domains represented through
Siterecords. - Release Center — release artifacts and deployment context.
Localization and presentation
- Internationalization — bundled dashboard translations for five languages in the package distribution.
- RTL — Arabic support and direction-aware dashboard behavior.
- Themes — twelve built-in themes using shared design tokens.
- Responsive UI — desktop, tablet, and mobile layouts.
- Offline Assets — charts, maps, and fonts do not require a public CDN at runtime.
Tech Stack
The package is intentionally substantial because it covers several application-lifecycle concerns around Django. The dependency footprint remains focused on Django and the subsystems this dashboard actually provides; optional integrations are not required unless the host project enables them.
| Component | Technology |
|---|---|
| Backend | Django 5.0+ / Django 6.0 compatible |
| Python | Python 3.10+ |
| Database | Any Django-supported database; PostgreSQL is a supported production target |
| Charts | Chart.js, bundled |
| World Map | Datamaps + D3.js + TopoJSON, bundled |
| GeoIP | MaxMind GeoLite2-City + geoip2 |
| User-Agent Parsing | user-agents |
| Country Codes | pycountry |
| Server Metrics | psutil |
| Package Encryption | cryptography |
| TOTP / Administrator 2FA | django-otp |
| WebAuthn / Device Auth | webauthn |
| Administrative Integration | django.contrib.admin / ModelAdmin |
| Authentication boundaries | Host Django authentication + mandatory 2FA + authorized WebAuthn device |
The current package metadata declares Python >=3.10, Django >=5.0, and includes Django 5.0 and Django 6.0
classifiers.
Runtime dependency set
The current package declares the following runtime dependencies. This is the package dependency set rather than a list of optional dependencies from a particular host application:
| Package | Declared requirement | Used for |
|---|---|---|
Django |
>=5.0 |
Core framework, ORM, sessions, authentication, forms, middleware, migrations |
user-agents |
>=2.2.0 |
Browser, operating-system, and device classification |
geoip2 |
>=4.8.0 |
Offline GeoIP lookup support |
psutil |
>=5.9.0 |
Server CPU, memory, disk, network, process, and service metrics |
pycountry |
>=22.3.5 |
Country-code and country-name support |
django-honeypot |
>=1.2.1 |
Honeypot integration used by hardened host deployments |
cryptography |
>=46.0.0 |
Authenticated package/data encryption primitives |
django-otp |
>=1.7.0,<2.0 |
Mandatory administrator TOTP authentication |
qrcode |
>=8.0,<9.0 |
QR presentation for TOTP enrollment |
webauthn |
>=3.0.0,<4.0 |
Layer 3 WebAuthn registration and authentication |
A host project can have additional dependencies such as its own Redis, Celery, Sentry, REST framework, or authentication packages. Those belong to the host application and are not silently counted as Paxalia Dashboard runtime requirements. fileciteturn29file2L1-L34
Installation
1. Install the package
pip install paxalia-dashboard
For local development:
pip install -e .
2. Add paxalia to INSTALLED_APPS
INSTALLED_APPS = [
# ...
"paxalia",
]
3. Include the dashboard URLs
The dashboard is designed to live under a private path chosen by the host project.
A minimal installation can mount:
from django.urls import include, path
urlpatterns = [
# ...
path("insights/", include("paxalia.urls")),
]
In a hardened production installation, many projects also mount Django Admin itself under a separate secret path.
For example:
from django.contrib import admin
from django.urls import include, path
urlpatterns = [
path("insights/", include("paxalia.urls")),
path("private-admin/", admin.site.urls),
]
The exact dashboard/admin paths are host-project decisions.
4. Add the analytics middleware
MIDDLEWARE = [
# Django/security/session middleware ...
"paxalia.middleware.AnalyticsMiddleware",
]
AnalyticsMiddleware resolves sites, classifies requests, records page-view/session information, and feeds the
analytics subsystem.
4a. Mount the dashboard under a deployment-specific secret path
The administrator surface should live under a private, non-predictable route chosen by the host project.
For development, a simple route such as /insights/ is acceptable. Production deployments should use a dedicated
32–128 character URL-safe random segment:
export ENVIRONMENT=production
export DASHBOARD_URL="$(python -c 'import secrets; print(secrets.token_urlsafe(48))')"
Expose that value through the host settings:
import os
DASHBOARD_URL = os.environ["DASHBOARD_URL"]
PAXALIA_DASHBOARD = {
# ...
"DASHBOARD_URL": DASHBOARD_URL,
}
Then mount Paxalia below that path:
from django.conf import settings
from django.urls import include, path
urlpatterns = [
path(
settings.DASHBOARD_URL.lstrip("/"),
include("paxalia.urls"),
),
]
Every administrator authentication route then lives below the same private mount:
<secret-dashboard-path>/auth/login/
<secret-dashboard-path>/auth/2fa/setup/
<secret-dashboard-path>/auth/2fa/verify/
<secret-dashboard-path>/auth/device/
<secret-dashboard-path>/security/
<secret-dashboard-path>/admin/...
The secret path is defense in depth, not authentication. The password, 2FA, device, rate-limit, CSRF, and session boundaries remain mandatory.
4b. Enable the isolated Paxalia administrator session
In the default mode, place the dedicated Paxalia session middleware immediately after Django's normal
SessionMiddleware, and place the isolated administrator authentication middleware after Django's
AuthenticationMiddleware:
MIDDLEWARE = [
# ...
"django.contrib.sessions.middleware.SessionMiddleware",
"paxalia.auth_middleware.PaxaliaIsolatedSessionMiddleware",
# ...
"django.middleware.csrf.CsrfViewMiddleware",
"django.contrib.auth.middleware.AuthenticationMiddleware",
"paxalia.auth_middleware.PaxaliaIsolatedAdminAuthenticationMiddleware",
# ...
"paxalia.middleware.SecurityBlockMiddleware",
"paxalia.logging.middleware.PaxaliaLoggingMiddleware",
"paxalia.middleware.SlowQueryMiddleware",
"paxalia.middleware.AnalyticsMiddleware",
]
The default isolated mode is:
PAXALIA_DASHBOARD = {
# ...
"AUTH_USE_HOST_LOGIN": False,
"AUTH_ISOLATED_SESSION_COOKIE_NAME": "paxalia_admin_session",
"AUTH_ISOLATED_SESSION_COOKIE_SAMESITE": "Lax",
"ADMIN_SESSION_MAX_AGE_SECONDS": 8 * 60 * 60,
}
The resulting administrator cookie is scoped to the dashboard path. Paxalia logout deletes the isolated administrator session without flushing the host website session.
4c. Optional host-authentication compatibility mode
Projects that deliberately want Paxalia to participate in an existing host login/2FA flow can opt in:
PAXALIA_DASHBOARD = {
# ...
"AUTH_USE_HOST_LOGIN": True,
"AUTH_LOGIN_URL": None,
"AUTH_HOST_2FA_URL_NAMES": ("core:login-2fa",),
"AUTH_HOST_2FA_INTENT_TTL_SECONDS": 600,
}
When this compatibility mode is enabled, the host project's successful second-factor route can hand the administrator
back
to the protected Paxalia destination through the signed, short-lived handoff implemented by
PaxaliaAdminHost2FARedirectMiddleware.
The middleware does not grant dashboard access by itself and does not change ordinary host login redirects when there is no active Paxalia administrator intent.
5. Run migrations
python manage.py migrate paxalia
The platform includes a deterministic migration chain for the analytics, security, compliance, operations, reporting, notification, and observability models.
6. Enable strict CSP correctly
The packaged dashboard is designed for CSP-safe script delivery.
A host project using a strict CSP should expose the existing Paxalia analytics configuration context processor and the CSP nonce context processor:
TEMPLATES = [
{
"OPTIONS": {
"context_processors": [
# ...
"paxalia.context_processors.analytics_config",
"csp.context_processors.nonce",
],
},
},
]
When using django-csp, configure its middleware and nonce policy according to the version installed by the host
project.
Example:
from csp.constants import NONCE
CONTENT_SECURITY_POLICY = {
"DIRECTIVES": {
"default-src": ("'self'",),
"script-src": (
"'self'",
NONCE,
"'strict-dynamic'",
),
}
}
Do not weaken your CSP merely to make Paxalia run.
7. Compile translations
python manage.py compilemessages -l es -l ar -l zh-hans -l pt-br
Use the actual language codes present in the host deployment.
8. Install the GeoIP database
The GeoIP database is intentionally not bundled into the repository because of its size.
Download GeoLite2-City from MaxMind and point GEOIP_PATH at the .mmdb file:
PAXALIA_DASHBOARD = {
"GEOIP_PATH": "/srv/paxalia/GeoLite2-City.mmdb",
}
The geography page can otherwise present an empty/limited state rather than fabricating location data.
9. Start the server
python manage.py runserver localhost:8000
Open the dashboard at the path you configured, for example:
http://localhost:8000/<secret-dashboard-path>/
10. Create or authorize a dashboard administrator
By default, the package recognizes Django users that are is_staff or is_superuser as administrators. Projects with a
custom administrator role can supply SECURITY_ADMIN_USER_CHECK.
For a fresh local project, Django's standard command is sufficient:
python manage.py createsuperuser
Then use the Paxalia login route beneath the secret dashboard mount:
http://localhost:8000/<secret-dashboard-path>/auth/login/
The final administrator session is created only after the full required authentication chain completes:
password
↓
confirmed TOTP / recovery code
↓
authorized WebAuthn device
↓
Paxalia administrator session
http://localhost:8000/<secret-dashboard-path>/
Configuration
All package behavior is configured through the host project's PAXALIA_DASHBOARD dictionary.
The package merges the supplied configuration with safe built-in defaults.
A representative configuration surface is:
PAXALIA_DASHBOARD = {
# ── Navigation ───────────────────────────────────────────────
"SIDEBAR_SECTIONS": [
"overview",
"pages",
"api",
"traffic",
"realtime",
"bots",
"geography",
"events",
"billing",
"releases",
"backups",
"security",
"sites",
"broken_links",
"goals",
"funnels",
"segments",
"campaigns",
"annotations",
"cohorts",
"api_keys",
"reports",
"share_links",
"notifications",
"rum",
"uptime",
"compliance",
"data_import",
"settings",
],
# ── Analytics / GeoIP ───────────────────────────────────────
"API_PATH_PREFIX": "/api/",
"GEOIP_PATH": None,
"DEFAULT_ANONYMIZE_IP": False,
"DEFAULT_IGNORED_PREFIXES": ["/admin/", "/static/", "/media/"],
"DEFAULT_IGNORED_EXTENSIONS": [
".css",
".js",
".png",
".jpg",
".svg",
".ico",
".woff2",
],
"DEFAULT_REALTIME_REFRESH": 30,
"DEFAULT_SEARCH_QUERY_PARAMS": ["q", "search", "query"],
# ── Billing integration ─────────────────────────────────────
"BILLING_INVOICE_MODEL": "billing.BillingInvoice",
"BILLING_USER_PLAN_MODEL": "billing.UserBilling",
"BILLING_DONATION_MODEL": "billing.Donation",
# ── Uploads / imports ───────────────────────────────────────
"UPLOADS_INCOMING_ROOT": None,
"UPLOAD_CHUNK_SIZE_MB": 5,
"UPLOAD_MAX_FILE_SIZE_MB": 2048,
"DATA_IMPORT_MAX_FILE_SIZE_MB": 100,
"UPLOAD_SESSION_TTL_HOURS": 24,
# ── Proxy / IP trust ────────────────────────────────────────
"TRUST_X_FORWARDED_FOR": False,
"TRUSTED_PROXY_COUNT": 1,
# ── Security Center ─────────────────────────────────────────
"SECURITY_TRACK_ONLY_STAFF": True,
"SECURITY_LOG_RETENTION_DAYS": 180,
"SECURITY_FAILED_LOGIN_THRESHOLD": 5,
"SECURITY_FAILED_LOGIN_WINDOW_MINUTES": 15,
"SECURITY_ALERT_EMAILS": [],
"SECURITY_ALERT_WEBHOOK_URL": None,
"BACKUP_REAUTH_MINUTES": 15,
# ── Server / operations ─────────────────────────────────────
"SERVER_METRIC_RETENTION_DAYS": 7,
"SLOW_QUERY_THRESHOLD_MS": 100,
"CELERY_APP_PATH": None,
# ── Compliance ──────────────────────────────────────────────
"CONSENT_MODE_ENABLED": False,
"CONSENT_COOKIE_NAME": "analytics_consent",
"CONSENT_COOKIE_GRANTED_VALUE": "granted",
"DATA_RETENTION_DAYS": {},
# ── Integrations ───────────────────────────────────────────
"SLACK_SIGNING_SECRET": None,
"DISCORD_PUBLIC_KEY": None,
# ── Multi-site ──────────────────────────────────────────────
"AUTO_CREATE_SITES": False,
# ── Anomaly detection ───────────────────────────────────────
"ANOMALY_ALERT_THRESHOLD_PERCENT": 30,
# ── Persistent Logging / Observability ──────────────────────
"LOGGING_ENABLED": True,
"LOG_CAPTURE_STANDARD_LOGGING": True,
"LOG_MIN_LEVEL": "INFO",
"LOG_REQUEST_SUCCESSES": False,
"LOG_REQUEST_ID_RESPONSE_HEADER": "X-Paxalia-Request-ID",
"LOG_MAX_MESSAGE_LENGTH": 4000,
"LOG_MAX_STACK_LENGTH": 12000,
"LOG_MAX_METADATA_BYTES": 16384,
"LOG_DEDUPE_WINDOW_SECONDS": 60,
"LOG_MAX_SAMPLES_PER_GROUP": 5,
"LOG_BROWSER_MAX_EVENTS_PER_PAGE": 50,
"LOG_BROWSER_MAX_REQUESTS_PER_MINUTE": 120,
"LOG_BROWSER_MAX_PAYLOAD_BYTES": 32768,
"LOG_BROWSER_CAPTURE_CONSOLE": False,
"LOG_BROWSER_CAPTURE_RESOURCE_ERRORS": True,
"LOG_RELEASE": None,
"LOG_SENSITIVE_KEYS": [],
"LOG_RETENTION_DAYS": {
"system": 30,
"request": 30,
"browser": 30,
"application": 30,
"login": 180,
"security": 180,
"group": 90,
},
"SECURITY_STORE_FAILED_USERNAME": True,
"SECURITY_ADMIN_USER_CHECK": None,
"APPLICATION_LOGS": [],
# ── Paxalia Admin ───────────────────────────────────────────
"ADMIN_ENABLED": True,
"ADMIN_MODEL_ALLOWLIST": [],
"ADMIN_MODEL_DENYLIST": [],
"ADMIN_MODELS": {},
"ADMIN_LIST_PER_PAGE": 50,
"ADMIN_MAX_RELATION_ITEMS": 10,
"ADMIN_MAX_BULK_OPERATIONS": 500,
"ADMIN_SENSITIVE_FIELDS": [
"password",
"password_hash",
"token",
"access_token",
"refresh_token",
"secret",
"client_secret",
"signing_secret",
"api_key",
"apikey",
"private_key",
"session_key",
"csrf_token",
"authorization",
"cookie",
"credential",
"credentials",
"secret_key",
"encryption_key",
],
"ADMIN_DJANGO_FALLBACK_ENABLED": True,
"ADMIN_LIST_EDITABLE_ENABLED": True,
"ADMIN_MAX_DELETE_PREVIEW": 100,
"ADMIN_OBJECT_HISTORY_PER_PAGE": 30,
"ADMIN_PROTECTED_NO_STORE": True,
# ── Paxalia Packages ────────────────────────────────────────
"PACKAGE_MAX_FILE_SIZE_MB": 100,
"PACKAGE_MAX_OBJECTS": 10000,
"PACKAGE_MAX_RELATIONS": 50000,
"PACKAGE_REQUIRE_ENCRYPTION_FOR_PROTECTED": True,
"PACKAGE_ALLOWED_CONFLICTS": ["update", "skip"],
}
The current package configuration surface include the Admin and logging sections above.
Mandatory administrator security configuration
The administrator security controls are policy parameters rather than feature switches. The three authentication layers cannot be disabled through normal dashboard configuration.
A complete security-focused configuration can be expressed as:
PAXALIA_DASHBOARD = {
# ── Administrator security policy ─────────────────────────────
"ADMIN_MAX_DEVICES": 5,
"ADMIN_SESSION_MAX_AGE_SECONDS": 8 * 60 * 60,
# Layer 1 — password/login rate limiting
"SECURITY_LOGIN_RATE_LIMIT_ATTEMPTS": 8,
"SECURITY_LOGIN_RATE_LIMIT_WINDOW_SECONDS": 15 * 60,
# Layer 2 — TOTP rate limiting
"SECURITY_2FA_RATE_LIMIT_ATTEMPTS": 5,
"SECURITY_2FA_RATE_LIMIT_WINDOW_SECONDS": 5 * 60,
# Layer 3 — WebAuthn/device rate limiting
"SECURITY_DEVICE_RATE_LIMIT_ATTEMPTS": 5,
"SECURITY_DEVICE_RATE_LIMIT_WINDOW_SECONDS": 5 * 60,
# Layer 3 — WebAuthn ceremony
"WEBAUTHN_CHALLENGE_TTL_SECONDS": 120,
"WEBAUTHN_RP_NAME": "Paxalia Dashboard",
"WEBAUTHN_RP_ID": None,
"WEBAUTHN_ORIGIN": None,
# Separate Paxalia administrator session
"AUTH_USE_HOST_LOGIN": False,
"AUTH_ISOLATED_SESSION_COOKIE_NAME": "paxalia_admin_session",
"AUTH_ISOLATED_SESSION_COOKIE_SAMESITE": "Lax",
"AUTH_ISOLATED_SESSION_COOKIE_DOMAIN": None,
# Public authentication surfaces
"AUTH_SIGNUP_ENABLED": True,
"AUTH_PASSWORD_RESET_ENABLED": True,
"AUTH_PASSWORD_CHANGE_ENABLED": True,
# Recovery
"SECURITY_RECOVERY_CODE_COUNT": 10,
# Private destination / presentation
"AUTH_BRAND_NAME": "Paxalia",
"AUTH_HOME_URL": "/",
"AUTH_ADMIN_HOME_URL": None,
"AUTH_SUPPORT_URL": None,
}
Important policy details:
AUTH_USE_HOST_LOGIN=Falseis the default and keeps Paxalia's administrator authentication separate from the host website authentication.AUTH_ISOLATED_SESSION_COOKIE_NAMEdefaults topaxalia_admin_session.- The isolated cookie path follows the configured dashboard path.
ADMIN_MAX_DEVICESlimits the number of active administrator device credentials.- Login, TOTP, and WebAuthn/device ceremonies each have independent rate limits.
- WebAuthn challenges are short-lived and single-use.
WEBAUTHN_RP_IDandWEBAUTHN_ORIGINshould be set explicitly in production when TLS terminates at a reverse proxy or when a stable deployed origin is known.SECURITY_RECOVERY_CODE_COUNTcontrols the number of recovery codes generated for the administrator recovery path.- These settings tune policy values; they do not remove the mandatory authentication layers.
Secret-path deployment policy
For production deployments, DASHBOARD_URL is validated as a 32–128 character URL-safe random path segment. Predictable
paths such as /admin/, /dashboard/, /insights/, /paxalia/, or /login/ must not be used as the production
secret
mount.
A typical deployment shape is:
Public application
├── normal website login
├── normal website sessions
└── public ingestion endpoints
Private Paxalia mount
├── auth/login/
├── auth/2fa/
├── auth/device/
├── security/
├── admin/
├── logs/
├── packages/
└── dashboard pages
The same private mount is used for the administrator UI and its authentication lifecycle, so the dashboard's privileged surfaces are not scattered across conventional public routes.
CSRF requirements
Keep Django CSRF middleware enabled:
MIDDLEWARE = [
# ...
"django.middleware.csrf.CsrfViewMiddleware",
# ...
]
Do not add a blanket csrf_exempt around Paxalia authentication or package-management views. The bundled browser
authentication helper sends the current CSRF token for JSON POST requests, including WebAuthn ceremonies.
fileciteturn28file0L1-L20
Configuration groups
Navigation
SIDEBAR_SECTIONS controls the navigation sections displayed and their order.
A section can still require a corresponding integration or capability before it is useful. Optional areas should not be enabled just for decoration.
Analytics
API_PATH_PREFIX determines what traffic is treated as API traffic. DEFAULT_ANONYMIZE_IP controls the default IP
storage behavior. Ignored prefixes and extensions help avoid polluting analytics with static and administrative
requests.
Uploads
UPLOADS_INCOMING_ROOT controls staging. Chunk size, total upload size, and session TTL are bounded so upload handling
does not become unbounded temporary storage.
Proxy and IP trust
TRUST_X_FORWARDED_FOR must only be enabled behind a reverse proxy you control.
Do not blindly trust arbitrary client-supplied X-Forwarded-For values.
TRUSTED_PROXY_COUNT describes how many trusted proxy hops should be considered when resolving the client IP.
Security
Security Center settings control staff-only tracking, log retention, failed-login thresholds, alert destinations, and backup download re-authentication.
Logging
The logging settings control capture level, request logging, response request-ID headers, message/stack/metadata bounds, deduplication, browser ingestion limits, retention, and redaction configuration.
Admin
The Admin settings control which registered models are exposed, page sizes, relationship display limits, bulk operation limits, sensitive field policies, fallback behavior, list-editable support, deletion preview limits, history pagination, and no-store handling.
Packages
Package limits protect import/export operations from unexpected scale.
PACKAGE_ALLOWED_CONFLICTS controls which conflict strategies may be used. The package UI and engine enforce these
settings rather than trusting arbitrary user-provided values.
Model-specific Admin configuration
ADMIN_MODELS provides optional per-model configuration without making Paxalia depend on a host application's model
names.
For example:
PAXALIA_DASHBOARD = {
"ADMIN_MODELS": {
"content.article": {
"identity_fields": ["slug"],
"sensitive_fields": ["private_token"],
},
},
}
This is a configuration extension point.
It does not replace Django registration and should not be used to build hard-coded model-specific business logic into Paxalia.
Host Django settings
The host project remains responsible for:
INSTALLED_APPSMIDDLEWARETEMPLATES- database configuration
- cache configuration
- email delivery
- sessions and cookies
- CSRF settings
- CORS
- CSP
- ASGI/WSGI deployment
- reverse proxy configuration
- authentication and identity policy
Middleware Integration
Paxalia provides multiple middleware capabilities.
AnalyticsMiddleware
Required for page-view/session collection:
MIDDLEWARE = [
# ...
"paxalia.middleware.AnalyticsMiddleware",
]
Responsibilities include:
- request classification
- site resolution
- page-view creation
- session handling
- bot/API classification
- configured ignore rules
- analytics aggregation feed
SecurityBlockMiddleware
Optional.
Place it before analytics when you want blocked IPs rejected before analytics records are created:
MIDDLEWARE = [
# ...
"paxalia.middleware.SecurityBlockMiddleware",
"paxalia.middleware.AnalyticsMiddleware",
]
SlowQueryMiddleware
Optional.
MIDDLEWARE = [
# ...
"paxalia.middleware.SlowQueryMiddleware",
"paxalia.middleware.AnalyticsMiddleware",
]
It observes Django database query execution and persists queries that reach the configured threshold.
PaxaliaLoggingMiddleware
Optional.
Place it after the host's session/authentication context when you want Paxalia request IDs, request lifecycle events, response status, and duration context:
MIDDLEWARE = [
# security/session/auth middleware ...
"paxalia.logging.middleware.PaxaliaLoggingMiddleware",
"paxalia.middleware.AnalyticsMiddleware",
]
It is intentionally separate from AnalyticsMiddleware.
The two systems answer different questions:
Analytics
"What happened to the site's traffic?"
Logging / Observability
"What happened inside the application while that request was executing?"
Recommended ordering
A common production arrangement is:
MIDDLEWARE = [
# Django / proxy / security / session / authentication ...
"paxalia.middleware.SecurityBlockMiddleware",
"paxalia.logging.middleware.PaxaliaLoggingMiddleware",
"paxalia.middleware.SlowQueryMiddleware",
"paxalia.middleware.AnalyticsMiddleware",
]
Exact ordering depends on the host application's middleware stack.
Dashboard Pages
| Page | URL | Purpose |
|---|---|---|
| Overview | / |
Core traffic summary, trends, top pages, API activity, and comparison |
| Pages | /pages/ |
Tracked paths, search, pagination, and page-level drill-down |
| Page Detail | /pages/…/ |
Detailed historical traffic for an individual path |
| API | /api/ |
API traffic, endpoint activity, and status-code distribution |
| Traffic | /traffic/ |
Referrers, browsers, operating systems, and device types |
| Geography | /geography/ |
Offline world map, countries, and cities |
| Events | /events/ |
Custom events and event breakdowns |
| Real-time | /realtime/ |
Current live visitor activity |
| RUM | /rum/ |
Core Web Vitals and browser errors |
| Uptime | /uptime/ |
Monitors, uptime history, and incidents |
| Compliance | /compliance/ |
Consent, retention, and visitor-deletion controls |
| Data Import | /import/ |
Historical aggregate CSV import |
| Billing | /billing/ |
Optional billing and revenue integration |
| Server Overview | /server/overview/ |
CPU, memory, disk, network and host health |
| Server CPU | /server/cpu/ |
CPU detail and history |
| Server Memory | /server/memory/ |
RAM and swap |
| Server Disk | /server/disk/ |
Storage and I/O |
| Server Network | /server/network/ |
Interface traffic and network statistics |
| Server Services | /server/services/ |
Running system services |
| Server Processes | /server/processes/ |
Active process information |
| Server Slow Queries | /server/slow-queries/ |
Queries crossing the configured latency threshold |
| Server Queues | /server/queues/ |
Celery state where configured |
| Server Deployments | /server/deployments/ |
Deployment history and chart context |
| Security | /security/ |
Application security posture and security events |
| Admin Overview | /admin-overview/ |
High-level user/content/login activity |
| Bot Traffic | /bots/ |
Bot volume, categories, paths and geography |
| Backups | /backups/ |
Backup configuration, creation and downloads |
| Reports | /reports/ |
Scheduled reporting |
| Share Links | /share-links/ |
Protected read-only sharing |
| Notifications | /notifications/ |
Dashboard notifications and alerts |
| Sites | /sites/ |
Multi-site configuration |
| Dependencies | /dependencies/ |
Runtime dependency health |
| Settings | /settings/ |
Dashboard preferences and operational settings |
| Logs | /logs/ |
Canonical persistent Paxalia Logs dashboard |
| Application Logs | /application-logs/ |
Application-oriented log view |
| Login Activity | /login-activity/ |
Authentication/login observability |
| Log Detail | /logs/<id>/ |
Full structured event investigation |
| Paxalia Admin | /admin/.../ |
Generic Django-native Admin under the dashboard's protected mount |
Exact route prefixes depend on the host project's dashboard mounting configuration.
Administrator authentication routes
The routes below are relative to the dashboard's configured mount:
| Route | Purpose |
|---|---|
/auth/login/ |
Layer 1 administrator password login |
/auth/logout/ |
End the isolated Paxalia administrator session |
/auth/signup/ |
Public Paxalia-branded signup surface when enabled |
/auth/password-reset/ |
Start password recovery |
/auth/password-reset/<uidb64>/<token>/ |
Password-reset confirmation |
/auth/password-change/ |
Change the current password |
/auth/2fa/setup/ |
Enroll the mandatory Paxalia TOTP authenticator |
/auth/2fa/verify/ |
Verify the Layer 2 TOTP/recovery step |
/auth/2fa/reset/ |
Reset the Paxalia 2FA state through the supported recovery flow |
/auth/recovery/regenerate/ |
Regenerate administrator recovery codes |
/auth/device/ |
Start Layer 3 authorized-device authentication |
/auth/device/options/ |
Select an available authorized-device option |
/auth/device/verify/ |
Complete WebAuthn authentication |
/auth/device/register/ |
Start authorized-device registration |
/auth/device/register/verify/ |
Complete WebAuthn device registration |
/auth/session-expired/ |
Show the expired administrator-session state |
/auth/access-denied/ |
Show the protected access-denied state |
These routes are intentionally part of the private dashboard mount in the normal deployment model.
Cross-dashboard behavior
Where supported:
- date ranges are shared through the standard dashboard filtering language
- common presets include Today, Yesterday, Last 7 days, Last 30 days, and current month
- charts provide previous-period comparison
- tables provide export actions
- responsive layouts adapt to desktop, tablet, and mobile
- Arabic layouts operate in RTL
Custom Event Tracking
Track product interactions without adding another analytics provider.
Quick start
Use the bundled event script:
<script src="{% static 'paxalia/scripts/analytics-events.js' %}"></script>
The host project should ensure the script receives the appropriate CSP nonce when a strict CSP requires one.
Data attributes
<button
data-analytics-category="download"
data-analytics-action="click"
data-analytics-label="windows">
Download for Windows
</button>
Forms can use the same mechanism:
<form
data-analytics-category="form"
data-analytics-action="submit"
data-analytics-label="contact-form">
...
</form>
JavaScript API
window.opAnalytics(
"video",
"play",
"intro-tutorial",
1
);
Event fields
| Field | Required | Description |
|---|---|---|
category |
Yes | Broad grouping such as button, video, or form |
action |
Yes | Event action such as click, play, or submit |
label |
No | Additional event context |
value |
No | Optional numeric value |
path |
No | Page path, normally derived from the browser location |
Real User Monitoring
RUM is integrated into the existing browser event system.
Web Vitals
Paxalia collects:
- LCP — Largest Contentful Paint
- CLS — Cumulative Layout Shift
- INP — Interaction to Next Paint
The dashboard presents field-data summaries and percentile-oriented reporting instead of pretending these measurements are laboratory benchmarks.
JavaScript errors
Browser-side errors are collected through:
window.onerrorunhandledrejection
The client limits event volume and deduplicates repeated failures to avoid runaway error loops.
Captured data can include:
- message
- filename
- line/column
- stack
- page context
Storage
Web Vitals reuse the existing event model.
JavaScript errors use the dedicated JSError model because useful browser failure diagnostics need more room and
structure than the generic event label field.
RUM caveats
RUM represents real visitor environments.
It varies with:
- device
- network
- browser
- workload
- application architecture
INP is captured using the package's supported browser-side measurement approach and should be interpreted as field telemetry rather than a promise of full laboratory conformance for every application architecture.
Uptime Monitoring
Uptime monitoring performs scheduled HTTP checks against configured endpoints.
Monitor configuration
A monitor can specify:
- name
- URL
- HTTP method
- expected status code
- timeout
- check interval
Scheduling
Run the check command from cron or Celery beat.
Example:
* * * * * cd /path/to/project && python manage.py check_uptime >> /var/log/paxalia-uptime.log 2>&1
Incident model
Incidents are transition-based.
A continuously failing service is represented as one incident rather than one incident row per check.
A recovery closes the incident.
Alerts
Uptime transitions reuse the package's alert/notification infrastructure and can optionally produce dashboard notifications plus configured email/webhook delivery.
A period with zero checks is represented as an empty/unknown state rather than falsely reported as 0% or 100%.
Compliance
Paxalia's compliance tooling is application-level and intentionally separate from a legal compliance certification.
Consent mode
Consent mode is disabled by default.
To require consent:
PAXALIA_DASHBOARD = {
"CONSENT_MODE_ENABLED": True,
"CONSENT_COOKIE_NAME": "analytics_consent",
"CONSENT_COOKIE_GRANTED_VALUE": "granted",
}
The host project's consent banner/CMP remains responsible for obtaining consent and setting the cookie.
The server-side gate is authoritative.
Without the required consent:
- page-view tracking is skipped
- anonymous session state is not created
- event endpoints can return a skipped response
- client tracking becomes a no-op
Data retention
Retention is configurable by data type:
PAXALIA_DASHBOARD = {
"DATA_RETENTION_DAYS": {
"pageview": 400,
"analytics_event": 400,
"js_error": 90,
"uptime_check": 90,
"slow_query": 30,
},
}
Nothing is pruned unless you explicitly configure a retention policy.
Forget this visitor
The compliance surface can delete stored analytics rows associated with a visitor identifier.
Because different observability models contain different identifiers, not every subsystem can necessarily be matched by every identifier type.
The current implementation documents those limitations rather than pretending a deletion request reached data that cannot be identified through the same field.
Privacy principle
Deletion is recorded as an audit action without reintroducing the exact raw identifier into the audit trail.
Data Import
Historical aggregate imports are supported for Google Analytics and Plausible CSV exports.
Why CSV
Paxalia deliberately avoids requiring:
- Google OAuth credentials
- vendor API clients
- vendor-specific long-lived secrets
A CSV export is already an artifact under the site's control.
Supported scope
The historical importer is designed for daily aggregate statistics.
It does not attempt to reconstruct individual page-view rows from aggregate exports.
Common metric mapping
| External column | Paxalia field |
|---|---|
| views / pageviews | total_views |
| visitors / users | closest supported unique-visitor field |
| sessions | total_sessions |
| bounce rate | derived bounce count where both rate and sessions are available |
Metrics that cannot be derived safely remain empty/zero rather than being fabricated.
Existing dates
Existing daily rows are skipped by default so a historical import does not silently overwrite live analytics.
An explicit overwrite mode is available for deployments that intentionally want replacement behavior.
Slack/Discord App
Paxalia supports both outgoing alert delivery and signed incoming command surfaces.
Slack
Configure:
PAXALIA_DASHBOARD = {
"SLACK_SIGNING_SECRET": "your-secret",
}
The Slack endpoint verifies request signatures with HMAC-SHA256.
Discord
Configure:
PAXALIA_DASHBOARD = {
"DISCORD_PUBLIC_KEY": "your-public-key",
}
Discord signature verification requires a compatible Ed25519 implementation; PyNaCl can be installed when that feature is required.
Scope
The command surface reuses the same high-level analytics snapshot logic used by reporting and sharing.
Typical periods include:
- today
- yesterday
- this week
- this month
The command response is deliberately plain text so it behaves consistently across supported chat platforms.
Admin Overview
The existing Admin Overview gives administrators a high-level summary of application activity.
It includes:
- total users
- recent registrations
- active-user-oriented metrics
- content totals
- content creation history
- login activity
- recent administrative/security context where available
This is intentionally different from Paxalia Admin.
Admin Overview
= operational summary
Paxalia Admin
= generic model administration
Server Monitoring
Server monitoring reads metrics directly from the host using psutil.
No external monitoring agent is required.
Available views
- Overview
- CPU
- Memory
- Disk
- Network
- Services
- Processes
- Slow Queries
- Queues
- Deployments
History snapshots
Historical server charts are backed by persisted ServerMetricSnapshot data.
Schedule:
* * * * * cd /path/to/project && python manage.py record_server_metrics >> /var/log/paxalia-server.log 2>&1
The command also prunes data older than SERVER_METRIC_RETENTION_DAYS.
If no snapshots have been collected, the dashboard displays an empty state instead of synthetic values.
Slow queries
Enable:
MIDDLEWARE = [
# ...
"paxalia.middleware.SlowQueryMiddleware",
]
Then configure:
PAXALIA_DASHBOARD = {
"SLOW_QUERY_THRESHOLD_MS": 100,
}
The middleware uses Django's query execution instrumentation and guards its own persistence from recursive capture.
Celery queues
Configure:
PAXALIA_DASHBOARD = {
"CELERY_APP_PATH": "myproject.celery.app",
}
Celery remains optional.
If it is not installed or not configured, the queue view returns an empty state rather than failing the dashboard.
Deployments
After deployment:
python manage.py record_deployment \
--version "$(git rev-parse --short HEAD)" \
--notes "Deploy from main"
A deployment record is stored and linked to a chart annotation.
Bot Traffic
Paxalia separates crawler/scanner traffic from normal analytics.
Path classification
You can configure known bot/scanner paths such as:
/robots.txt
/.env
/wp-admin/
/xmlrpc.php
A path match can classify a request as malicious/bot traffic.
User-Agent classification
The classifier also recognizes categories such as:
- search engines
- AI crawlers
- social preview bots
- SEO tools
- generic bot-like clients
- malicious/scanner traffic
Important limitation
User-Agent strings are claims made by the client.
Paxalia does not perform live crawler-IP verification.
A client that spoofs a legitimate crawler User-Agent can therefore be misclassified when visiting an ordinary page.
Attack-probe paths can still override those claims because a request for a known malicious path is meaningful evidence of scanner activity regardless of the reported User-Agent.
Backfilling existing traffic
When bot classification rules change, existing PageView rows are not silently rewritten.
Run:
python manage.py backfill_pageview_bot_category --dry-run
Then run the command without --dry-run when the results are understood.
Importing large path lists
python manage.py import_bot_paths /path/to/bot_paths.txt
Use --replace when you intentionally want to replace the configured list rather than merge it.
Backup Management
Backup Management is a physical/system backup facility and should not be confused with .paxalia logical packages.
Features
- configurable source paths
- configurable storage directory
- scheduled backups
- retention settings
- on-demand creation
- background processing
- chunked large-file download
- archive status
- restore/delete workflows where supported
- recent-authentication checks for sensitive downloads
Re-authentication
The host can require recent staff authentication before a backup download:
PAXALIA_DASHBOARD = {
"BACKUP_REAUTH_MINUTES": 15,
}
This check is applied to every download request.
Scheduled backups
Example:
0 2 * * * cd /path/to/project && python manage.py create_backup >> /var/log/paxalia-backup.log 2>&1
Backup policy remains a deployment responsibility.
Internationalization
The current distribution includes translations for:
| Language | Code | RTL |
|---|---|---|
| English | en |
No |
| Spanish | es |
No |
| Arabic | ar |
Yes |
| Simplified Chinese | zh-hans |
No |
| Brazilian Portuguese | pt-br |
No |
Arabic uses RTL layout direction.
The language system is based on Django's standard internationalization workflow.
Adding another language
A normal workflow is:
mkdir -p paxalia/locale/<code>/LC_MESSAGES
Then add/translate the corresponding .po file and compile:
python manage.py compilemessages -l <code>
The generic dashboard uses Django translation tags rather than hard-coded per-language template branches.
Admin localization
Paxalia Admin's model localization workspace is different from the dashboard UI translation catalog.
For model translation data:
- supported languages are discovered from Django configuration
- translation systems are discovered from model metadata
- supported translation APIs are reused
- missing translations are identified
- translations can be edited where the model exposes a supported editing surface
- package import/export can carry multilingual translation data
There is no six-language hard-coded Admin branch.
Themes
The current dashboard ships with twelve themes.
| Theme | Slug | Character |
|---|---|---|
| Dark Gold | dark |
Deep charcoal and warm gold |
| Skybound Silk | default |
Soft light presentation |
| Golden Dusk | golden |
Cream and gold |
| Azure Drift | azure |
Cool blue |
| Sunlit Meadow | sunlit |
Bright green |
| Indigo Spectrum | indigo |
Violet night |
| Arctic Horizon | arctic |
Icy blue |
| Ocean Breeze | ocean |
Teal and navy |
| Twilight Reverie | twilight |
Deep violet |
| Velvet Noir | velvet |
Crimson / dark |
| Citrine Prestige | citrine |
Gold-forward |
| Onyx Pearl | onyx |
Minimal dark / silver |
Theme contract
Themes are applied using the existing:
data-analytics-theme="..."
contract and the shared --analytics-* token vocabulary.
Persistence
The selected theme is persisted in browser storage.
Custom themes
Add a new theme selector to the existing theme stylesheet:
[data-analytics-theme="your-slug"] {
--analytics-bg: # . . .;
--analytics-surface: # . . .;
--analytics-border: # . . .;
--analytics-text: # . . .;
--analytics-text-dim: # . . .;
--analytics-gold: # . . .;
--analytics-gold-dim: rgba(...);
--analytics-gold-hover: # . . .;
--analytics-compare: # . . .;
}
Then expose it through the settings theme list.
Do not introduce a second theme system.
Exporting Data
Paxalia provides normal table exports throughout the dashboard.
CSV
CSV is suitable for:
- Excel
- Google Sheets
- scripts
- operational review
JSON
JSON is intended for:
- scripts
- integrations
- data inspection
- programmatic use
Export context
Dashboard exports respect relevant filters such as:
- selected date range
- page/path search
- country selection
- current table/query context
Exports must not be interpreted as unrestricted database dumps.
Spreadsheet safety
Administrative/logging exports are expected to use safe serialization for values that might otherwise be interpreted as spreadsheet formulas.
Billing Integration
Billing is intentionally model-configurable.
Paxalia does not own or replace your billing system.
Configuration
PAXALIA_DASHBOARD = {
"BILLING_INVOICE_MODEL": "billing.BillingInvoice",
"BILLING_USER_PLAN_MODEL": "billing.UserBilling",
"BILLING_DONATION_MODEL": "billing.Donation",
}
Dashboard capabilities
Where the host project exposes compatible models, the Billing page can provide:
- total revenue
- recent revenue
- active subscriptions/plans
- donation information
- plan breakdowns
- daily income
- MRR/ARR-oriented reporting
- churn/failed-payment context where the host model exposes it
The integration is intentionally generic rather than hard-coded to a single billing application.
Security Center
Security Center brings application-facing security visibility into the same operational environment as analytics.
Login activity
The security layer can surface:
- successful logins
- failed login patterns
- staff/privileged activity
- login locations where available
- authentication context
- related security events
Active sessions
Where the host authentication/session model provides the required data, administrators can inspect active sessions and revoke them through the appropriate workflow.
IP blocklist
Security Center can maintain blocked IPs.
When SecurityBlockMiddleware is enabled, requests from blocked addresses can be denied before analytics recording.
Brute-force alerting
Configure:
PAXALIA_DASHBOARD = {
"SECURITY_FAILED_LOGIN_THRESHOLD": 5,
"SECURITY_FAILED_LOGIN_WINDOW_MINUTES": 15,
}
Crossing the configured threshold can generate a security alert.
CSP violation reporting
Browser CSP violations can be fed into the Security Center so policy failures can be investigated alongside application observability.
Security scorecard
The Security Scorecard presents configuration/posture findings from the package's supported security checks.
It is a visibility tool, not a replacement for an external security assessment.
The Security Overview is separate from this legacy scorecard surface: it uses explicit control states and actionable configuration details rather than reducing the administrator's security posture to one number.
Administrator authentication
Paxalia Dashboard administration is protected by a mandatory three-layer authentication contract:
Layer 1 — Host Django authentication
password / configured backend
rate limiting / brute-force protection
↓
Layer 2 — Mandatory 2FA
Paxalia TOTP authenticator / recovery path
↓
Layer 3 — Authorized device credential
WebAuthn challenge + signature verification
↓
Paxalia Dashboard Admin
The layers are enforced server-side. There is no ordinary dashboard setting that turns the three-layer administrator security model off. IP address, user-agent data, and browser fingerprints are context only; they are not treated as the identity of an authorized administrator device.
Defense-in-depth administrator controls
The mandatory administrator security contract is broader than the three credential layers:
1. Password
└─ Django authentication + password validation
2. 2FA
└─ django-otp TOTP or one-time recovery code
3. Device
└─ WebAuthn challenge + credential signature verification
4. Rate limiting
└─ login + 2FA + device ceremony limits
5. CSRF
└─ Django CSRF middleware + CSRF-aware bundled JSON helper
6. Separate authentication
└─ dedicated Paxalia SessionStore + scoped cookie
7. Secret path
└─ deployment-specific private dashboard mount
Additional hardening surrounds the chain:
SecurityBlockMiddleware
+
CSP / SecurityMiddleware
+
honeypot integration
+
sensitive-field redaction
+
no-store protected responses
+
package encryption/integrity
+
bounded upload and log ingestion
+
security/audit events
The dashboard's security tooling is therefore designed as a system rather than a single score.
Security Overview
Security Overview is a read-only diagnostic surface that reports the effective state of supported controls instead
of
turning security into a single opaque score. Checks can be reported as PASS, WARNING, DANGER, DISABLED,
NOT CONFIGURED, or NOT APPLICABLE, with the current state, expected state, reason, configuration source, and a
relevant
action/page where one exists.
The checks cover the configured authentication and session stack, mandatory 2FA and enrollment, WebAuthn availability,
HTTPS and cookie posture, CSRF and SecurityMiddleware, authentication/device rate limits, brute-force monitoring,
ALLOWED_HOSTS, DEBUG, SECRET_KEY, CSP, persistent Paxalia logging and retention, protected package encryption,
sensitive-field protection, admin-gate health, active administrator devices, and challenge/session policy.
Backup re-authentication
Sensitive backup downloads can require a recent password-authentication timestamp.
Paxalia Auth & Administrator Security
Paxalia Dashboard includes a standalone, override-friendly authentication experience for host Django projects. The main Paxalia application is not required; its authentication pages were used only as the UX/design reference for the Paxalia-branded presentation.
Public authentication surfaces
The package can provide:
- Login
- Sign Up
- Password reset request
- Password reset confirmation
- Password change
- Session-expired state
- Access-denied state
These surfaces use Django's authentication, password validators, session framework, messages, CSRF protection, and configured user model rather than creating a second user/password database. Host projects can override the templates or route users to their existing authentication views.
Mandatory administrator authentication
The privileged Paxalia Dashboard flow is separate from ordinary public-site authentication. A public user can use the host application's normal login/signup flow; a dashboard administrator must complete all three security layers before a privileged Paxalia session is created.
Anonymous
↓
Paxalia Admin Login
↓
Layer 1: Django username/email + password
↓
Layer 2: confirmed TOTP / one-time recovery code
↓
Layer 3: authorized WebAuthn credential
↓
final Django/Paxalia administrator session
Intermediate authentication states are intentionally non-privileged. Reaching the password or 2FA step alone does not make the user an administrator for dashboard views, package operations, security settings, or protected APIs.
The seven security layers
Paxalia's final administrator protection model is intentionally described as seven layers because authentication credentials and deployment hardening solve different problems:
1. Password
The first layer uses the host project's configured Django user model. In isolated mode, Paxalia's default credential
boundary deliberately uses Django's ModelBackend unless the host explicitly supplies another backend through
AUTH_ISOLATED_AUTHENTICATION_BACKENDS.
The package does not create a parallel user/password database. Password validation remains Django's responsibility.
2. Mandatory 2FA
Every Paxalia administrator must have a confirmed TOTP device before normal privileged administration is permitted. Recovery codes provide a controlled recovery path without creating a password-only bypass.
3. Authorized device
Layer 3 uses WebAuthn. The server stores the public credential and safe authenticator metadata; the private credential remains with the authenticator.
Each ceremony uses a server-generated, short-lived, single-use challenge. Replay, expiry, wrong-user, and revoked-device cases are rejected.
A Paxalia Authorized Device Credential is not a guaranteed permanent hardware UUID. It represents an authorized credential that an administrator can register, name, review, and revoke.
4. Rate limiting
Authentication ceremonies are independently bounded:
Login
8 attempts / 15 minutes
2FA
5 attempts / 5 minutes
Device / WebAuthn
5 attempts / 5 minutes
The package also surfaces broader failed-login thresholds through Security Center and keeps browser event ingestion bounded through the logging subsystem.
5. CSRF
State-changing browser operations remain behind Django CSRF protection. The authentication JavaScript includes the CSRF token in JSON POST requests used by the WebAuthn ceremony.
The secure deployment rule is simple:
CsrfViewMiddleware stays enabled.
Authentication views stay CSRF protected.
Do not solve integration problems by disabling CSRF.
6. Separate authentication boundaries
In the default isolated mode, the public website and Paxalia administrator authentication do not share the same session state.
The host website keeps its normal Django session while the dashboard uses:
paxalia_admin_session
↓
dedicated Django SessionStore
↓
dashboard-path cookie scope
This means:
host login ≠ Paxalia admin login
host logout ≠ Paxalia admin logout
host session ≠ Paxalia admin session
host rotation ≠ Paxalia admin rotation
The package still uses the configured Django session engine/backend, so isolation does not require a second identity database.
7. Secret dashboard path
The full administrator surface is mounted below a deployment-specific private path. Production configuration requires a 32–128 character URL-safe random segment and rejects common predictable administrator paths.
The path is defense in depth. It is deliberately not treated as an authentication mechanism.
Authentication lifecycle
The normal administrator lifecycle is:
GET private dashboard
↓
/auth/login/
↓
password accepted
↓
/auth/2fa/
↓
TOTP or one-time recovery code accepted
↓
/auth/device/
↓
WebAuthn credential accepted
↓
final Paxalia administrator session
↓
dashboard / Admin / Security / Packages
Logout returns to the Paxalia login surface and removes the dedicated administrator session. The host website session is left intact in isolated mode.
Layer 1 — primary authentication
Paxalia uses the host project's configured Django authentication backend and existing user model wherever possible. Login attempts are rate-limited by source and identifier, and important authentication events are sent through the existing Paxalia structured logging/security infrastructure. Unknown-account failures use safe generic messages and can be tracked through the existing failed-login observability.
Layer 2 — mandatory TOTP
Every administrator must have a confirmed TOTP device before normal Paxalia Dashboard administration is permitted. The
package uses django-otp for the TOTP implementation and provides a Paxalia-branded enrollment and verification flow.
The enrollment flow is: complete primary authentication, enroll the authenticator, verify a current code, generate recovery codes, and continue to the authorized-device step. There is no normal "skip for now" path.
Recovery codes are generated with cryptographically secure randomness, stored as password hashes, individually consumed when used, revocable/regenerable, and never written to Paxalia logs.
Layer 3 — authorized device credential
Browser-based Layer 3 uses the maintained Python webauthn library and the WebAuthn browser API. Paxalia stores the
public credential and safe authenticator metadata; the private credential remains with the authenticator. Each ceremony
uses a server-generated, short-lived, single-use challenge. Replay, expiry, wrong-user, and revoked-credential cases
fail.
The credential is a Paxalia Authorized Device Credential, not a guaranteed permanent hardware UUID. An administrator can register multiple credentials up to the configured active-device limit, name them, review safe metadata, and revoke them individually.
Device management
Security → Admin Devices provides:
- device name
- active/revoked/disabled state
- registration time
- last authentication time
- authenticator/device type where available
- attachment information where available
- backup state where safely available
- rename operation
- individual revocation
Private keys, raw credential secrets, challenges, recovery codes, and other sensitive cryptographic material are never displayed as normal device data. Revocation is audited and invalidates future credential authentication; associated privileged sessions are also invalidated according to the configured session architecture.
Administrator sessions
Security → Admin Sessions shows privileged sessions recorded by the existing login-event infrastructure. Sessions can be revoked individually, all other sessions can be revoked, or all administrator sessions can be revoked. The privileged session remains valid only while the administrator is active, the confirmed second factor still exists, the authorized device credential remains active, the session has not expired, and the session has not been revoked.
WebAuthn deployment requirements
WebAuthn must use the actual deployed relying-party ID and browser origin. In production, the browser context must be
HTTPS. WEBAUTHN_RP_ID and WEBAUTHN_ORIGIN can be explicitly configured for proxy/hosted deployments; otherwise the
package derives them from the current request when safe. The dashboard does not silently fall back to password-only
access if a secure WebAuthn ceremony cannot run.
Authentication events
The authentication and device flow uses the existing structured logging/audit architecture. Examples include:
admin_login_started
admin_login_failed
admin_login_rate_limited
admin_2fa_required
admin_2fa_success
admin_2fa_failed
admin_recovery_used
admin_device_challenge_failed
admin_device_authenticated
admin_device_rejected
admin_device_registered
admin_device_revoked
admin_device_renamed
admin_session_created
admin_all_sessions_revoked
admin_logout
Exact presentation can vary by logging surface, but these events remain within the existing Paxalia observability and Security Center architecture rather than creating a parallel security-event store. Authentication secrets, TOTP codes, recovery codes, private keys, and raw WebAuthn assertions are not logged.
Security configuration
The current settings expose policy details such as active-device limits, privileged-session lifetime, authentication and 2FA/device rate limits, challenge lifetime, WebAuthn relying-party configuration, recovery-code count, and authentication page branding. These settings configure implementation details; they do not disable the mandatory administrator security layers.
Paxalia Error Pages
The package ships production-oriented Paxalia 404 and 500 templates that can be used by a generic Django project. Their visual language is adapted from the broader Paxalia product reference while using Paxalia Dashboard's own theme tokens, typography, spacing, surfaces, and responsive shell.
404
The 404 page is a branded, responsive error surface with a lightweight glitch/CRT treatment, a safe return-home action, and a browser-history action. Dynamic request information is not reflected into the page without escaping.
500
The 500 page is intentionally production-safe. It does not expose exception details, tracebacks, SQL, filesystem paths, request headers, environment variables, or secrets. The technical event belongs in Paxalia Logs, where authorized administrators can investigate the correlated application/request event.
Error-page overrides
Host projects can override templates/404.html and templates/500.html using Django's normal template-loader
precedence without editing the installed Paxalia package. Branding/home/support settings can be configured through the
existing PAXALIA_DASHBOARD namespace.
Root URL configuration
Because Django resolves handler404 and handler500 from the project's root URLconf, wire the packaged handlers there:
handler404 = "paxalia.error_handlers.paxalia_404"
handler500 = "paxalia.error_handlers.paxalia_500"
This keeps the error implementation inside Paxalia while leaving root routing and template overrides under the host project's control.
DEBUG behavior
With production DEBUG=False, the packaged 500 page remains safe and user-facing. With DEBUG=True, Django's
development
exception machinery can still provide its normal development diagnostics to the developer; Paxalia does not treat DEBUG
as
a mechanism for bypassing administrator authentication.
Advanced Analytics
Goals
Goals represent target behaviors such as:
/signup/
purchase
form:submit
and can be used to measure completion.
Funnels
Funnels describe ordered steps such as:
landing page
↓
pricing
↓
signup
↓
checkout
Segments
Segments provide reusable audience definitions.
They can combine supported behavioral dimensions instead of forcing administrators to reproduce the same filters manually.
Campaigns
Campaign analysis works with campaign parameters and provides source/medium/campaign-oriented breakdowns.
Cohorts
Cohort analysis focuses on return behavior over time rather than one aggregate visitor total.
Annotations
Annotations connect events such as:
- deployments
- campaigns
- incidents
- launches
- operational changes
to the analytics timeline.
Reporting & Sharing
Scheduled reports
The reporting subsystem can schedule high-level dashboard summaries and deliver them through configured email workflows.
The package can also generate PDF output where the optional PDF dependency is available.
Public share links
Protected read-only share links allow external stakeholders to view a selected dashboard surface without receiving staff credentials.
These links are intended to be narrowly scoped and protected.
Exports
Reporting workflows can generate:
- CSV
- JSON
- PDF, where configured
The reporting path reuses existing dashboard computation rather than maintaining a separate analytics calculation engine.
Paxalia API
Paxalia provides an application-level API surface for supported analytics data.
API keys
API access uses scoped keys rather than one universal secret.
Scopes can distinguish ingestion/read behavior.
Browser event ingestion
The browser event collector uses the public event endpoint:
/api/paxalia/event/
The event path is intentionally separate from the private dashboard mount.
JS error ingestion
Real User Monitoring uses a corresponding public endpoint for browser JavaScript errors.
API documentation
The host deployment can expose protected API documentation/schema routes through its normal Django URL configuration.
Dependency Health
Dependency Health provides an operational view of the installed dependency closure.
It can help identify:
- installed versions
- direct dependencies
- transitive dependencies
- available release information where the configured environment permits comparison
The dashboard does not silently upgrade dependencies.
Dependency changes remain an explicit deployment decision.
Notifications & Alerts
Paxalia supports in-dashboard notifications plus optional external destinations.
Alert categories can include:
- security
- anomaly
- uptime
- deployment/operational events
- supported system alerts
Optional delivery destinations include:
- webhook endpoints
- supported chat integrations
Alert delivery is deliberately best-effort.
A notification delivery failure should not turn the underlying application event into an application failure.
Multi-Site Analytics
Multiple domains can be represented by Site records.
Requests are resolved by hostname and associated with active sites.
Configure:
PAXALIA_DASHBOARD = {
"AUTO_CREATE_SITES": False,
}
Automatic site creation is disabled by default.
This avoids silently creating database rows for unexpected hostnames.
Release Center
The Release Center provides release and deployment context.
Deployment tracking can connect application releases to analytics annotations.
Example:
python manage.py record_deployment \
--version "$(git rev-parse --short HEAD)" \
--notes "the deployed release"
The result is a deployment record plus a matching chart annotation.
Release artifact management remains separate from deployment event tracking.
Paxalia Logging / Observability
The platform adds a canonical persistent logging and observability subsystem under paxalia.logging.
This is one of the major differences between the earlier analytics-only architecture and the platform.
The logging system does not replace:
- analytics
- RUM
- Security Center
- server metrics
- existing application logging
Instead it creates a shared structured observability layer that can connect those sources when appropriate.
Core architecture
Python / Django loggers
│
├── Paxalia logging handler
│
└── paxalia.log(...)
│
▼
normalized event context
│
├── redaction
├── fingerprinting
├── grouping
├── deduplication
└── bounded persistence
│
▼
PaxaliaLogEvent
│
├── PaxaliaLogGroup
├── Logs dashboard
├── Application Logs
├── Login Activity
├── Log Detail
└── exports / retention
Direct application logging
The package exposes a simple application-facing entry point:
import paxalia
paxalia.log(
"Workspace synchronization failed",
level="ERROR",
category="application.sync",
action="sync_failed",
metadata={
"workspace_id": "...",
},
)
The helper uses the same canonical logging pipeline as standard Python/Django logs.
Standard logging capture
When enabled, ordinary logger calls can be captured without changing application code:
import logging
logger = logging.getLogger(__name__)
logger.error(
"Synchronization failed",
extra={
"category": "application.sync",
"action": "sync_failed",
},
)
Paxalia normalizes the record before persistence.
Request lifecycle logging
PaxaliaLoggingMiddleware can provide:
- request IDs
- response-status events
- duration
- request path
- method
- site
- session context
- authenticated user context
- correlation/trace identifiers
Configure:
MIDDLEWARE = [
# ...
"paxalia.logging.middleware.PaxaliaLoggingMiddleware",
]
The middleware is designed for request context.
Paxalia logging also supports request-less events from:
- background jobs
- startup code
- CLI commands
- scheduled management commands
- direct application logging
Event context
A stored event can contain structured fields for:
- severity
- source
- category
- action
- logger name
- message
- exception type
- stack trace
- module
- file
- line number
- function
- session ID
- request ID
- correlation ID
- trace ID
- request method
- request path
- response status
- duration
- site
- traffic type
- bot category
- user ID
- user display information
- admin marker
- IP context where configured
- User-Agent
- browser
- operating system
- device
- process ID
- thread name
- host
- environment
- release
- structured metadata
- sensitive-data state
Not every event has every value.
Fingerprints and grouping
Paxalia can calculate a stable fingerprint from structural event characteristics.
Related events can be grouped and summarized through:
- first-seen time
- last-seen time
- occurrence count
- suppressed count
- sample count
- grouping window
- representative metadata
This lets an administrator see:
1 underlying problem
↓
4,812 occurrences
↓
5 retained representative samples
instead of manually opening thousands of duplicate log rows.
Deduplication
Handler-topology duplication is guarded so the same record is not persisted repeatedly simply because it passed through multiple supported logging paths.
Exception capture
The logging layer records:
- exception type
- normalized message
- stack trace
Stack/message lengths are bounded through configuration.
Redaction
Sensitive values are sanitized before persistent presentation/storage according to the package's redaction policy.
Common credential classes include:
password
token
access_token
refresh_token
secret
api_key
private_key
authorization
cookie
credential
session key
encryption key
Host projects can extend the sensitive-key configuration.
The objective is:
useful debugging context
+
low probability of credential persistence
not simply deleting every form of structured metadata.
Browser observability
The browser-side RUM/error system can feed relevant errors into the canonical logging/investigation workflow.
Log dashboard
The Logs page supports investigation through:
- date filtering
- severity filtering
- source/result filters
- search
- structured event rows
- pagination
- auto-refresh
- detail navigation
- related-event discovery
Less frequently used controls are kept behind secondary filtering so the main operational surface stays calm.
Log detail
The detailed event surface is built for incident investigation rather than only showing a single message.
It can expose:
- event identity
- request/network context
- client/browser context
- runtime context
- grouping information
- structured metadata
- exception details
- stack traces
- related events
A sanitized Copy for AI workflow can prepare structured incident context for external debugging or AI-assisted analysis.
The copied context is intentionally sanitized rather than treating the raw event database as a safe prompt source.
Login activity
Authentication-related observability can be inspected independently through the Login Activity dashboard.
Failed-login identifiers can be privacy-controlled.
Retention
Current logging retention configuration is category-specific:
PAXALIA_DASHBOARD = {
"LOG_RETENTION_DAYS": {
"system": 30,
"request": 30,
"browser": 30,
"application": 30,
"login": 180,
"security": 180,
"group": 90,
},
}
Run a dry run first:
python manage.py paxalia_logs_prune --dry-run
Then schedule pruning:
python manage.py paxalia_logs_prune
Logging-specific safety properties
The observability system is designed so that:
- sensitive values are redacted
- payload sizes are bounded
- browser event rates are bounded
- metadata sizes are bounded
- identifiers are normalized
- grouping state is bounded
- logging failures do not break the primary application request path
- request-less logging remains supported
Paxalia Admin & Packages
The platform includes a full Paxalia Admin and the Paxalia Package Center.
Detailed implementation notes also live in:
docs/PAXALIA_ADMIN_PACKAGES.md
Paxalia Admin philosophy
Paxalia Admin is not a replacement for Django Admin architecture.
Its model flow is:
Django Admin registry
↓
PaxaliaAdminRegistry
↓
model definition / adapter / capabilities
↓
query / services / forms
↓
Paxalia Admin views
↓
Paxalia dashboard UI
Django remains the source of truth for:
- model registration
- ModelAdmin configuration
- permissions
- model forms
- supported custom actions
- inline definitions
Django Admin remains the fallback for exotic behavior that cannot safely be rendered by Paxalia Admin.
Model discovery
The Admin workspace discovers models from Django's registered ModelAdmin registry.
It can expose metadata such as:
- application label
- model label
- verbose name
- verbose plural name
- capabilities
- search support
- filter support
- ordering
- list display
- list editable
- actions
- relationship fields
- inline definitions
- localization capability
- identity fields
- sensitive fields
- protected behavior
The registry is dynamic.
Host model names are not hard-coded into Paxalia.
Models browser
The Models page is intentionally catalog-oriented.
It provides:
- application groups
- searchable models
- application collapse/expand
- compact model cards
- capability metadata
- responsive layouts
- meaningful empty states
Application groups expose accessible toggle controls with aria-expanded and aria-controls.
Model search can match:
- verbose model name
- model label
- application label
- application verbose name
- visible model metadata
Changelists
Paxalia Admin supports normal record browsing with:
- list display
- sorting
- search
- filters
- pagination
- date hierarchy where supported
- query-string state preservation
- record selection
- supported list-editable formsets
- CSV/JSON data workflows where exposed
- optimized relationship loading where possible
List editable
When the registered ModelAdmin uses Django's list_editable, Paxalia Admin can reuse the corresponding formset
behavior.
The Django management-form prefix semantics are preserved so editable formsets behave like Django expects.
CRUD
The generic Admin surface supports:
Create
↓
Django ModelForm
↓
validate
↓
save
↓
audit
Read
↓
safe presentation
↓
sensitive masking
↓
relationship inspection
Update
↓
permission check
↓
ModelForm
↓
validate
↓
save
↓
audit
Delete
↓
permission check
↓
deletion collector
↓
preview
↓
confirm
↓
delete
↓
audit
Permissions
Paxalia Admin uses Django permission semantics.
Access is not granted simply because a model is registered.
The current architecture checks:
- staff access
- model-level permissions
- object-level permission hooks where available
- add/change/delete capabilities
- action permissions
- localization permissions
- package permissions
Sensitive fields
Sensitive-field configuration is applied at the display layer and package layer where applicable.
Examples:
password
token
access_token
refresh_token
client_secret
api_key
private_key
authorization
cookie
secret_key
encryption_key
Sensitive values should not appear as normal list/detail values.
Protected workflows can require stronger controls rather than simply showing the value.
Relationships
Paxalia Admin recognizes Django relationship structures including:
- ForeignKey
- OneToOneField
- ManyToManyField
- reverse relations
- self-references
- supported inline relations
The query layer can optimize common relationship loading.
Inline admins
The Admin diagnostics inspect registered inline definitions.
Supported inline presentation uses Django's existing TabularInline/StackedInline concepts where the generic Paxalia
surface can safely reproduce them.
Exotic inline behavior remains eligible for Django Admin fallback.
Actions
Normal Django custom actions can be surfaced through the Paxalia action workflow.
Permission checks remain enforced before execution.
Action failures are surfaced rather than silently treated as success.
Statistics
Model statistics can include, where the model makes them detectable:
- record totals
- created counts
- updated counts
- related counts
- choice distributions
- localization completeness
The exact statistics are model-dependent and are never hard-coded around a particular host application.
History and audit
Paxalia Admin can show:
- history
- recent changes
- actor context
- timestamps
- object context
- Django admin log entries
- Paxalia security audit events
Sensitive values remain redacted.
Localization workspace
Translatable models can expose a localization workspace.
The workflow is:
discover translation system
↓
discover configured languages
↓
inspect completeness
↓
choose language
↓
edit supported translation fields
↓
save through model translation API
Languages come from Django configuration.
The Admin does not hard-code a fixed number of language tabs.
Package Center
Package operations are protected by the same administrator security boundary as the rest of Paxalia. Export/import, protected models, encrypted packages, and retry-package workflows run only inside the privileged dashboard context.
The package UI is available from Paxalia Admin and is divided into deliberate workflows:
Package Center
├── Export
├── Import
└── History
Export and import screens intentionally separate:
Scope
Models
Filters
Options
Security
Action
rather than presenting every control as one giant form.
Paxalia Package Format
.paxalia is a model-aware logical package format.
It is not a raw database dump.
Conceptually:
ordinary package
package.paxalia
├── manifest.json
├── integrity.json
└── data.json
and an encrypted package can use the encrypted data member:
package.paxalia
├── manifest.json
├── integrity.json
└── data.enc
The exact package internals are versioned by the package format itself.
Manifest
The manifest records package metadata required for validation and compatibility.
It allows the reader to establish:
- package format version
- logical package metadata
- model scope
- object/relationship context
- translation information where included
- encryption state
Integrity
Package contents are integrity-checked with SHA-256 hashes.
Tampered package data must fail validation.
Archive safety
The package reader validates archive structure before database mutation.
Security checks include defenses for:
- duplicate ZIP members
- path traversal
- invalid archive structure
- unsupported versions
- invalid encryption metadata
- size/count limits
- malformed records
- malformed relationships
The package file extension itself is not treated as a security boundary.
Serialization
The exporter handles supported Django/Python values such as:
- UUID
- datetime
- date
- time
- Decimal
- timedelta
- Path
- bytes
- JSON-compatible structures
- Django
FieldFilelogical paths - lazy translation values
- relationship identities
The serializer does not blindly call json.dumps() on arbitrary model values.
Unsupported or unexpected data is treated as an explicit export problem where required rather than silently presented as a complete successful package.
Identity resolution
Imports use configured identity fields where appropriate.
Examples include:
- primary key
- unique field
- slug
- username
- configured field combinations
Identity resolution occurs before relationship restoration.
New records normally receive new Django IDs unless the package strategy explicitly requires identity restoration.
Relationships
Paxalia packages can preserve supported:
- ForeignKey relationships
- OneToOne relationships
- ManyToMany relationships
- self-references
- supported translation relationships
Relationship restoration is identity-aware and does not depend on archive row order.
Conflicts
The current default allowed strategies are:
update
skip
The package engine validates the selected conflict strategy against configured policy.
Import preview
The Import workflow can preview:
- model count
- record count
- creates
- updates
- skips
- potential failures
- relationships
- translations
- encryption state
- validation state
The preview is generated from actual package validation and planning.
It is not an illustrative hard-coded result.
Dry run
A dry run validates and plans without permanent database mutation.
It can detect:
- malformed records
- identity conflicts
- missing relationships
- incompatible fields
- translation problems
- permissions
- size/count limits
- encryption requirements
Atomic imports
Atomic import uses Django transactions according to the configured scope.
If required work fails, the configured transaction boundary can roll back mutations.
Partial imports
Partial import allows independent valid work to remain committed while failed work is isolated and reported.
A relationship-dependent operation should not be called a successful partial import when the dependency graph makes the resulting data invalid.
Failure reporting
Failures are structured around:
- model
- object identity
- field
- relationship
- translation
- exception category
- safe failure reason
Secret material should not be included.
Retry packages
Failed subsets can be packaged for retry where practical.
The retry package preserves the relevant operation context without forcing an administrator to reconstruct the failed data manually.
Protected models
Configured protected models can require encryption:
PAXALIA_DASHBOARD = {
"PACKAGE_REQUIRE_ENCRYPTION_FOR_PROTECTED": True,
}
This policy is enforced by the package engine, not only by the UI.
Encryption
Paxalia package encryption uses authenticated encryption via the optional cryptography dependency.
The current security module uses:
AES-256-GCM
PBKDF2-HMAC-SHA256
with bounded/validated KDF parameters.
Wrong passwords and tampering produce package-security failures rather than partial plaintext processing.
Package limits
Current defaults include:
PAXALIA_DASHBOARD = {
"PACKAGE_MAX_FILE_SIZE_MB": 100,
"PACKAGE_MAX_OBJECTS": 10000,
"PACKAGE_MAX_RELATIONS": 50000,
}
These limits are intended to keep administrative package operations predictable.
CLI validation
Validate:
python manage.py paxalia_package_validate export.paxalia
Inspect:
python manage.py paxalia_package_inspect export.paxalia
Encrypted package inspection requires the appropriate password input according to the command's options.
Important distinction: package vs backup
Use physical backups for:
- disaster recovery
- database restoration
- server recovery
- infrastructure migration
- full system restore
Use .paxalia packages for:
- logical application-data transfer
- selected model migration
- model-aware export/import
- translation transfer
- environment-to-environment content movement
- controlled administrative data exchange
Do not use a logical package as your only disaster-recovery mechanism.
Operational Commands
Paxalia contains management commands for analytics, operations, logging, Admin diagnostics, package validation, and maintenance.
Analytics and operational commands
python manage.py aggregate_daily_stats
python manage.py backfill_pageview_bot_category
python manage.py backfill_pageview_is_api
python manage.py check_uptime
python manage.py cleanup_uploads
python manage.py create_backup
python manage.py detect_anomalies
python manage.py import_bot_paths /path/to/bot_paths.txt
python manage.py prune_analytics_data
python manage.py prune_security_logs
python manage.py record_deployment --version "$(git rev-parse --short HEAD)"
python manage.py record_server_metrics
python manage.py seed_analytics
python manage.py send_scheduled_reports
Logging diagnostics and retention
python manage.py paxalia_logs_test --keep
python manage.py paxalia_logs_prune --dry-run
python manage.py paxalia_logs_prune
Dashboard diagnostics
python manage.py paxalia_dashboard_test --keep --no-ui
python manage.py paxalia_dashboard_test --keep
Administrator authentication/security tests
The security/authentication suite can be run directly:
python manage.py test paxalia.test_security_auth -v 2
python manage.py test paxalia.test_security_cleanup_fix22 -v 2
python manage.py test paxalia.test_security_ux_fix21 -v 2
The focused security tests cover the password/2FA/device flow, isolated-session semantics, logout behavior, rate-limit enforcement, WebAuthn ceremony handling, and security UI contracts.
Paxalia Admin diagnostics
python manage.py paxalia_admin_test
The Admin diagnostics check areas such as:
- Django Admin registry
- Admin enabled state
- registered model discovery
- model configuration
- ModelAdmin compatibility
- list-editable support
- deletion preview compatibility
- relationship and inline discovery
- history routes
- sensitive-field policy
- hardening settings
Diagnostic model counts are intentionally dynamic.
Do not hard-code values from one host environment into the package.
Package inspection
python manage.py paxalia_package_validate export.paxalia
python manage.py paxalia_package_inspect export.paxalia
Suggested schedules
Daily aggregation:
0 0 * * * cd /path/to/project && python manage.py aggregate_daily_stats
Server history:
* * * * * cd /path/to/project && python manage.py record_server_metrics
Uptime checks:
* * * * * cd /path/to/project && python manage.py check_uptime
Anomaly detection:
10 * * * * cd /path/to/project && python manage.py detect_anomalies
Analytics retention:
0 3 * * * cd /path/to/project && python manage.py prune_analytics_data
Security log retention:
20 3 * * * cd /path/to/project && python manage.py prune_security_logs
Paxalia log retention:
30 3 * * * cd /path/to/project && python manage.py paxalia_logs_prune
Security & Privacy Model
Paxalia is designed to keep data on the host application.
That does not mean "privacy automatically solved."
The host project still controls:
- database access
- operating system security
- reverse proxy
- authentication
- administrator accounts
- backups
- network policy
- retention choices
- proxy trust
- email/webhook destinations
- access to exported files
Application-level security principles
Paxalia uses:
- Django authentication
- staff checks
- Django permissions
- object-level ModelAdmin permission hooks where available
- CSRF protection
- sensitive-field redaction
- no-store handling for protected responses where configured
- package structural validation
- package integrity checks
- package encryption requirements
- ZIP archive safety controls
- bounded upload/package limits
- audit/security events
Secret dashboard paths
The dashboard can be mounted at a private path.
This is useful as a defense-in-depth measure.
It must not be treated as an authentication mechanism by itself.
For the final v4.0.0 deployment model, the private path is configured through DASHBOARD_URL and, in production, is
validated as a 32–128 character URL-safe random segment.
All privileged dashboard routes and the Paxalia administrator authentication lifecycle can live beneath that same private mount:
<secret-path>/
├── auth/
├── security/
├── admin/
├── logs/
├── packages/
└── dashboard/
The browser-facing public application can keep normal authentication and public ingestion routes outside this mount.
Public ingestion endpoints
Browser event ingestion is intentionally public because visitors send anonymous telemetry to it.
Public ingestion endpoints must therefore validate and bound input on the server.
Proxy trust
Only enable forwarded-IP trust behind a controlled proxy infrastructure.
Logging privacy
Persistent observability makes debugging easier, but it also creates another sensitive data store.
The logging system therefore:
- redacts credential-like fields
- bounds message and stack sizes
- bounds metadata
- bounds browser event rates
- supports retention policies
- distinguishes diagnostic context from secrets
- supports privacy-aware failed-login identifier handling
Admin privacy
Paxalia Admin is designed to avoid displaying configured sensitive fields as normal values.
Protected values should not be exposed simply because an administrator can browse the model.
Package privacy
Normal exports omit configured sensitive fields.
Protected-model export can require encryption.
Package failure reports must not expose secret material.
Backups
Physical backups contain whatever the configured backup scope includes.
Treat them as highly sensitive infrastructure artifacts and protect their storage and transport accordingly.
What Paxalia does not do
Paxalia does not:
- replace your OS firewall
- rotate all application credentials for you
- verify crawler identity through a live IP-range lookup
- replace a dedicated WAF
- replace a dedicated SIEM
- automatically upgrade dependencies
- provision your Redis/Celery/PostgreSQL infrastructure
- operate your mail server
- replace a physical disaster-recovery strategy
- certify legal compliance
Production principle
Use Paxalia as an application-level observability, analytics, administration, and security layer alongside your normal infrastructure controls.
Paxalia and Django
Paxalia Dashboard is an application package for Django, not a replacement for Django.
| Responsibility | Django / host project | Paxalia Dashboard |
|---|---|---|
| ORM and database models | Authoritative | Integrates with them |
| Authentication | Authoritative | Reuses host authentication and adds the mandatory admin verification layers |
| Model permissions | Authoritative | Reuses Django permission and ModelAdmin hooks |
| URL routing | Authoritative | Adds dashboard/package routes |
| Business logic | Authoritative | Observes and administrates without owning host business rules |
| Django Admin registry | Authoritative | Uses it as the source of truth for generic Admin |
| Analytics | Host/application data | Provides the analytics layer |
| Structured application logging | Host/Python logging APIs | Provides persistent observability and investigation |
| Server/runtime telemetry | Host environment | Provides application-facing monitoring |
| Logical data portability | Host data | Provides .paxalia package workflows |
| Physical backups | Host infrastructure | Provides complementary backup-management utilities |
| Deployment | Host infrastructure/CI | Records deployment context |
| Final operational authority | Host project | Remains with the host project |
This separation is deliberate. Paxalia becomes powerful by integrating with Django rather than by trying to replace the framework it runs inside.
Architecture & Extensibility
Paxalia is intentionally modular.
Analytics architecture
HTTP request
↓
middleware
↓
classification / site resolution
↓
persistent analytics models
↓
aggregation / reporting
↓
dashboard views
↓
browser UI
Logging architecture
stdlib / Django logging
+
paxalia.log()
↓
normalization
↓
context
↓
redaction
↓
fingerprint / grouping
↓
persistent observability
↓
logs / audit / investigation
Admin architecture
django.contrib.admin registry
↓
PaxaliaAdminRegistry
↓
adapter / definition / capabilities
↓
permissions
↓
query + services + forms
↓
views
↓
Paxalia Admin UI
Package architecture
selection / queryset
↓
generic serializer
↓
identity map
↓
relationship data
↓
translation data
↓
manifest + integrity
↓
optional authenticated encryption
↓
.paxalia archive
Extension philosophy
Host applications can extend Paxalia through configuration and their existing Django architecture.
Good extension points include:
- ModelAdmin registration
- model-specific identity fields
- sensitive-field configuration
- dashboard section configuration
- application log adapters
- billing models
- Celery app path
- site records
- translation models
- theme configuration
Avoid hard-coding host application models into Paxalia itself.
Final v4.0.0 Security Checklist
Before exposing Paxalia Dashboard to real users, verify the deployment as one complete boundary:
[ ] Password authentication is active
[ ] Administrator accounts are recognized by the configured admin policy
[ ] TOTP enrollment is confirmed
[ ] Recovery codes are generated and stored safely
[ ] At least one authorized WebAuthn device is registered
[ ] Device revocation is tested
[ ] Login / 2FA / device rate limits are configured
[ ] Django CSRF middleware is enabled
[ ] Paxalia administrator session isolation is enabled
[ ] The isolated administrator cookie is scoped to the private dashboard path
[ ] Production DASHBOARD_URL is a long random segment
[ ] WebAuthn RP ID and origin match the deployed HTTPS origin
[ ] ALLOWED_HOSTS is configured correctly
[ ] DEBUG=False in production
[ ] SECRET_KEY is configured securely
[ ] CSP/SecurityMiddleware remain enabled
[ ] Sensitive fields are protected in Admin
[ ] Security Overview reports the expected posture
[ ] Backup downloads use the configured re-authentication policy
[ ] Authentication and security events are visible in Paxalia observability
A secret path, a password, 2FA, or WebAuthn by itself is not the complete security model. The package is designed so these controls reinforce one another.
Project Structure
The security/authentication layer is organized into separate policy, rate-limit, health-diagnostic, WebAuthn, and view modules:
The v4 security/authentication implementation additionally includes dedicated session-isolation and host-authentication- bridge modules. The complete tree below is intentionally kept in the README so contributors can see the full package layout rather than a reduced feature summary:
paxalia/
├── admin_security.py
├── error_handlers.py
├── security_health.py
├── security_rate_limit.py
├── webauthn_services.py
├── views/
│ ├── auth.py
│ ├── admin_security.py
│ ├── mfa.py
│ └── security.py
├── migrations/
│ └── 0022_paxalia_admin_security.py
└── templates/
├── 404.html
├── 500.html
├── paxalia/
│ ├── security_overview.html
│ ├── security_authentication.html
│ ├── admin_devices.html
│ └── admin_sessions.html
└── paxalia_auth/
├── login.html
├── signup.html
├── forgot-password.html
├── reset-password.html
├── password_change.html
├── two-factor.html
├── two-factor-setup.html
├── recovery-codes.html
├── device-register.html
└── device-verify.html
A representative source tree looks like:
paxalia-dashboard/
├── paxalia
│ ├── admin_auth_middleware.py
│ ├── admin_center
│ │ ├── adapter.py
│ │ ├── __init__.py
│ │ ├── package_views.py
│ │ ├── permissions.py
│ │ ├── query.py
│ │ ├── registry.py
│ │ ├── services.py
│ │ ├── urls.py
│ │ ├── utils.py
│ │ └── views.py
│ ├── admin.py
│ ├── admin_security.py
│ ├── alerts.py
│ ├── anomalies.py
│ ├── api_keys.py
│ ├── apps.py
│ ├── auth_middleware.py
│ ├── auth.py
│ ├── bot_classification.py
│ ├── bots_paths.txt
│ ├── chat_ops.py
│ ├── cohorts.py
│ ├── compliance.py
│ ├── conf_uploads.py
│ ├── context_processors.py
│ ├── conversions.py
│ ├── data_import.py
│ ├── error_handlers.py
│ ├── forms.py
│ ├── geoip
│ │ ├── GeoLite2-ASN.mmdb
│ │ ├── GeoLite2-City.mmdb
│ │ └── GeoLite2-Country.mmdb
│ ├── __init__.py
│ ├── locale
│ │ ├── ar
│ │ │ └── LC_MESSAGES
│ │ │ ├── django.mo
│ │ │ └── django.po
│ │ ├── en
│ │ │ └── LC_MESSAGES
│ │ │ └── django.po
│ │ ├── es
│ │ │ └── LC_MESSAGES
│ │ │ ├── django.mo
│ │ │ └── django.po
│ │ ├── pt-br
│ │ │ └── LC_MESSAGES
│ │ │ ├── django.mo
│ │ │ └── django.po
│ │ └── zh-hans
│ │ └── LC_MESSAGES
│ │ ├── django.mo
│ │ └── django.po
│ ├── logging
│ │ ├── application.py
│ │ ├── context.py
│ │ ├── fingerprint.py
│ │ ├── handler.py
│ │ ├── __init__.py
│ │ ├── middleware.py
│ │ ├── redaction.py
│ │ └── services.py
│ ├── management
│ │ └── commands
│ │ ├── aggregate_daily_stats.py
│ │ ├── backfill_pageview_bot_category.py
│ │ ├── backfill_pageview_is_api.py
│ │ ├── check_uptime.py
│ │ ├── cleanup_uploads.py
│ │ ├── create_backup.py
│ │ ├── detect_anomalies.py
│ │ ├── import_bot_paths.py
│ │ ├── paxalia_admin_test.py
│ │ ├── paxalia_dashboard_test.py
│ │ ├── paxalia_logs_prune.py
│ │ ├── paxalia_logs_test.py
│ │ ├── paxalia_package_inspect.py
│ │ ├── paxalia_package_validate.py
│ │ ├── prune_analytics_data.py
│ │ ├── prune_security_logs.py
│ │ ├── record_deployment.py
│ │ ├── record_server_metrics.py
│ │ ├── seed_analytics.py
│ │ └── send_scheduled_reports.py
│ ├── middleware.py
│ ├── migrations
│ │ ├── 0001_initial.py
│ │ ├── 0002_security_center.py
│ │ ├── 0003_csp_violations.py
│ │ ├── 0004_pageview_is_api.py
│ │ ├── 0005_flip_anonymize_ip_default.py
│ │ ├── 0006_multisite.py
│ │ ├── 0007_goals_funnels_segments_annotations.py
│ │ ├── 0008_dashboard_access_permissions.py
│ │ ├── 0009_paxalia_api_key.py
│ │ ├── 0010_reporting_sharing.py
│ │ ├── 0011_notifications.py
│ │ ├── 0012_bot_category.py
│ │ ├── 0013_js_error.py
│ │ ├── 0014_uptime_monitoring.py
│ │ ├── 0015_ops_monitoring.py
│ │ ├── 0016_compliance_permission.py
│ │ ├── 0017_data_import.py
│ │ ├── 0018_fix_dailysitestats_duplicates.py
│ │ ├── 0019_sharelink_password_hash.py
│ │ ├── 0020_paxalia_observability.py
│ │ ├── 0021_remove_loginevent_paxalia_log_is_ad_8ef5a0_idx_and_more.py
│ │ ├── 0022_paxalia_admin_security.py
│ │ └── __init__.py
│ ├── models.py
│ ├── packages
│ │ ├── engine.py
│ │ ├── format.py
│ │ ├── __init__.py
│ │ ├── localization.py
│ │ └── security.py
│ ├── permissions.py
│ ├── queue_monitor.py
│ ├── report_delivery.py
│ ├── reporting.py
│ ├── requirements.txt
│ ├── revenue.py
│ ├── rum.py
│ ├── security_audit.py
│ ├── security_health.py
│ ├── security_rate_limit.py
│ ├── security_scorecard.py
│ ├── segments.py
│ ├── settings.py
│ ├── signals.py
│ ├── static
│ │ └── paxalia
│ │ ├── icons
│ │ │ ├── archive
│ │ │ │ ├── icon-file-text.svg
│ │ │ │ ├── icon-global.svg
│ │ │ │ └── icon-time-spendin.svg
│ │ │ ├── brand
│ │ │ │ ├── icon-brand.png
│ │ │ │ └── icon-brand.svg
│ │ │ ├── dependencies.js
│ │ │ ├── realtime.js
│ │ │ ├── sidebar.js
│ │ │ ├── ui
│ │ │ │ ├── icon-bar-chart.svg
│ │ │ │ ├── icon-bot.svg
│ │ │ │ ├── icon-cpu.svg
│ │ │ │ ├── icon-download.svg
│ │ │ │ ├── icon-harddisk.svg
│ │ │ │ ├── icon-key.svg
│ │ │ │ ├── icon-layers.svg
│ │ │ │ ├── icon-memory.svg
│ │ │ │ ├── icon-network.svg
│ │ │ │ ├── icon-overview.svg
│ │ │ │ └── icon-server.svg
│ │ │ └── ui-multi
│ │ │ ├── icon-cloud-uploading.svg
│ │ │ └── icon-setting.svg
│ │ ├── scripts
│ │ │ ├── admin-center.js
│ │ │ ├── admin-overview.js
│ │ │ ├── analytics-events.js
│ │ │ ├── api.js
│ │ │ ├── auth.js
│ │ │ ├── backups.js
│ │ │ ├── billing-chart.js
│ │ │ ├── bots.js
│ │ │ ├── chart.umd.js
│ │ │ ├── d3.v3.min.js
│ │ │ ├── datamaps.world.min.js
│ │ │ ├── dependencies.js
│ │ │ ├── error.js
│ │ │ ├── events-chart.js
│ │ │ ├── filter-bar.js
│ │ │ ├── geography-map.js
│ │ │ ├── language-manager.js
│ │ │ ├── logging-filter.js
│ │ │ ├── logs.js
│ │ │ ├── overview.js
│ │ │ ├── page-detail.js
│ │ │ ├── realtime.js
│ │ │ ├── security.js
│ │ │ ├── server
│ │ │ │ ├── cpu.js
│ │ │ │ ├── disk.js
│ │ │ │ ├── memory.js
│ │ │ │ ├── network.js
│ │ │ │ ├── overview.js
│ │ │ │ ├── processes.js
│ │ │ │ └── services.js
│ │ │ ├── sidebar.js
│ │ │ ├── theme-manager.js
│ │ │ ├── topojson.v1.min.js
│ │ │ ├── upload-widget.js
│ │ │ └── webauthn.js
│ │ └── styles
│ │ ├── base.css
│ │ ├── components
│ │ │ ├── about.css
│ │ │ ├── admin.css
│ │ │ ├── auth.css
│ │ │ ├── backup.css
│ │ │ ├── buttons.css
│ │ │ ├── charts.css
│ │ │ ├── dependencies.css
│ │ │ ├── error.css
│ │ │ ├── export-btn.css
│ │ │ ├── filter-bar.css
│ │ │ ├── icon.css
│ │ │ ├── logging.css
│ │ │ ├── menu.css
│ │ │ ├── notifications.css
│ │ │ ├── release-center.css
│ │ │ ├── rum.css
│ │ │ ├── security.css
│ │ │ ├── server.css
│ │ │ ├── settings-form.css
│ │ │ ├── sidebar.css
│ │ │ ├── stat-cards.css
│ │ │ ├── tables.css
│ │ │ ├── topbar.css
│ │ │ ├── typography.css
│ │ │ └── upload.css
│ │ ├── dashboard-refinements.css
│ │ ├── layout.css
│ │ ├── themes.css
│ │ └── tokens.css
│ ├── templates
│ │ ├── 404.html
│ │ ├── 500.html
│ │ ├── paxalia
│ │ │ ├── about.html
│ │ │ ├── admin
│ │ │ │ ├── audit.html
│ │ │ │ ├── bulk_delete.html
│ │ │ │ ├── delete_confirmation.html
│ │ │ │ ├── history.html
│ │ │ │ ├── home.html
│ │ │ │ ├── model_list.html
│ │ │ │ ├── model_localization.html
│ │ │ │ ├── model_overview.html
│ │ │ │ ├── models.html
│ │ │ │ ├── model_stats.html
│ │ │ │ ├── object_detail.html
│ │ │ │ ├── object_form.html
│ │ │ │ ├── package_center.html
│ │ │ │ ├── package_export_center.html
│ │ │ │ ├── package_export.html
│ │ │ │ ├── package_history.html
│ │ │ │ ├── package_import_center.html
│ │ │ │ ├── package_import.html
│ │ │ │ └── package_result.html
│ │ │ ├── admin_devices.html
│ │ │ ├── admin_overview.html
│ │ │ ├── admin_sessions.html
│ │ │ ├── annotations.html
│ │ │ ├── api_docs.html
│ │ │ ├── api.html
│ │ │ ├── api_keys.html
│ │ │ ├── application_logs.html
│ │ │ ├── auth_base.html
│ │ │ ├── backup_reauth.html
│ │ │ ├── backups.html
│ │ │ ├── base.html
│ │ │ ├── billing.html
│ │ │ ├── bots.html
│ │ │ ├── broken_links.html
│ │ │ ├── campaigns.html
│ │ │ ├── cohorts.html
│ │ │ ├── compliance.html
│ │ │ ├── dashboard.html
│ │ │ ├── data_import.html
│ │ │ ├── dependencies.html
│ │ │ ├── email
│ │ │ │ └── report_digest.html
│ │ │ ├── error_base.html
│ │ │ ├── events.html
│ │ │ ├── funnels.html
│ │ │ ├── geography.html
│ │ │ ├── goals.html
│ │ │ ├── includes
│ │ │ │ ├── filter_bar.html
│ │ │ │ └── pagination.html
│ │ │ ├── log_detail.html
│ │ │ ├── login_activity.html
│ │ │ ├── logs.html
│ │ │ ├── mfa_enroll.html
│ │ │ ├── notifications.html
│ │ │ ├── page_detail.html
│ │ │ ├── pages.html
│ │ │ ├── realtime.html
│ │ │ ├── releases.html
│ │ │ ├── reports.html
│ │ │ ├── rum.html
│ │ │ ├── security_admins.html
│ │ │ ├── security_authentication.html
│ │ │ ├── security.html
│ │ │ ├── security_overview.html
│ │ │ ├── segments.html
│ │ │ ├── server_cpu.html
│ │ │ ├── server_deployments.html
│ │ │ ├── server_disk.html
│ │ │ ├── server_memory.html
│ │ │ ├── server_network.html
│ │ │ ├── server_overview.html
│ │ │ ├── server_processes.html
│ │ │ ├── server_queues.html
│ │ │ ├── server_services.html
│ │ │ ├── server_slow_queries.html
│ │ │ ├── settings.html
│ │ │ ├── shared_dashboard.html
│ │ │ ├── share_links.html
│ │ │ ├── sites.html
│ │ │ ├── traffic.html
│ │ │ └── uptime.html
│ │ └── paxalia_auth
│ │ ├── access-denied.html
│ │ ├── device-register.html
│ │ ├── device-verify.html
│ │ ├── forgot-password.html
│ │ ├── login.html
│ │ ├── password_change_done.html
│ │ ├── password_change.html
│ │ ├── password_reset_complete.html
│ │ ├── password_reset_done.html
│ │ ├── password_reset_email.html
│ │ ├── password_reset_subject.html
│ │ ├── recovery-codes.html
│ │ ├── reset-password.html
│ │ ├── session-expired.html
│ │ ├── signup.html
│ │ ├── two-factor.html
│ │ └── two-factor-setup.html
│ ├── templatetags
│ │ ├── analytics_tags.py
│ │ └── __init__.py
│ ├── test_admin_center.py
│ ├── test_live_logging_fix26.py
│ ├── test_logging.py
│ ├── test_security_auth.py
│ ├── test_security_cleanup_fix22.py
│ ├── test_security_ux_fix21.py
│ ├── tests.py
│ ├── uptime.py
│ ├── urls.py
│ ├── views
│ │ ├── about.py
│ │ ├── admin_overview.py
│ │ ├── admin_security.py
│ │ ├── annotations.py
│ │ ├── api_docs.py
│ │ ├── api_keys.py
│ │ ├── api.py
│ │ ├── auth.py
│ │ ├── backup.py
│ │ ├── billing.py
│ │ ├── bots.py
│ │ ├── broken_links.py
│ │ ├── campaigns.py
│ │ ├── chat_ops.py
│ │ ├── cohorts.py
│ │ ├── compliance.py
│ │ ├── csp_reports.py
│ │ ├── dashboard.py
│ │ ├── data_import.py
│ │ ├── dependencies.py
│ │ ├── events.py
│ │ ├── export.py
│ │ ├── geography.py
│ │ ├── goals.py
│ │ ├── __init__.py
│ │ ├── login_activity.py
│ │ ├── logs.py
│ │ ├── mfa.py
│ │ ├── notifications.py
│ │ ├── page_detail.py
│ │ ├── pages.py
│ │ ├── paxalia_api.py
│ │ ├── realtime.py
│ │ ├── releases.py
│ │ ├── reports.py
│ │ ├── rum.py
│ │ ├── security.py
│ │ ├── segments.py
│ │ ├── server.py
│ │ ├── settings.py
│ │ ├── share_links.py
│ │ ├── sites.py
│ │ ├── traffic.py
│ │ ├── uploads.py
│ │ ├── uptime.py
│ │ └── utils.py
│ └── webauthn_services.py
├── LICENSE
├── MANIFEST.in
├── pyproject.toml
├── README.md
├── setup.cfg
└── setup.py
The .mmdb GeoIP database is intentionally excluded from Git because of its size.
Contributing
Contributions are welcome.
The goal is to preserve Paxalia's existing architecture rather than accumulating independent feature-specific systems.
Development setup
git clone https://github.com/paxalia/paxalia-dashboard.git
cd paxalia-dashboard
python -m venv .venv
source .venv/bin/activate
pip install -e .
Then run the appropriate checks.
Baseline checks
python manage.py check
python manage.py paxalia_admin_test
python manage.py paxalia_logs_test --keep
python manage.py paxalia_dashboard_test --keep --no-ui
Focused Admin tests:
python manage.py test paxalia.test_admin_center -v 2
When working on logging:
python manage.py test paxalia.test_logging -v 2
python manage.py paxalia_logs_test --keep
When working on package functionality, also run:
python manage.py paxalia_package_validate path/to/test-package.paxalia
python manage.py paxalia_package_inspect path/to/test-package.paxalia
Diagnostic expectations
Do not claim a subsystem is healthy merely because a single page loads.
When a change touches Admin, verify:
- registry discovery
- permissions
- model browsing
- CRUD
- relationships
- inline support
- package operations
- localization
- diagnostics
When a change touches logging, verify:
- stdlib capture
- direct
paxalia.log() - request context
- request-less events
- exception persistence
- redaction
- grouping/fingerprints
- dashboard visibility
- retention/pruning
- non-fatal failure behavior
Developer conventions
Paxalia uses:
- Django-native patterns
- token-driven CSS
- reusable components
- external JavaScript modules
- defensive progressive enhancement
- explicit security boundaries
- generic configuration instead of host-model assumptions
Do not introduce an external UI framework merely to build an Admin page.
Do not move host-specific business logic into Paxalia.
Do not silently swallow operational failures merely to keep the UI looking successful.
Commit message format
Use Conventional Commit style:
type(scope): short summary
Common types:
feat(scope): ...
fix(scope): ...
refactor(scope): ...
style(scope): ...
docs(scope): ...
chore(scope): ...
perf(scope): ...
polish(scope): ...
test(scope): ...
For substantial changes, use a structured body:
feat(admin): improve generic model discovery
Scope:
- paxalia/admin_center/registry.py
- paxalia/templates/paxalia/admin/models.html
- paxalia/static/paxalia/scripts/admin-center.js
Changes:
- Added searchable application grouping
- Preserved Django ModelAdmin registration semantics
- Improved responsive presentation
Behavior:
- Administrators can locate models without scanning the entire registry
Impact:
- Large host projects remain easier to administer
Branching
A typical repository policy is:
main
feat/<name>
feat/<scope>/<name>
fix/<issue>
hotfix/<issue>
refactor/<name>
docs/<description>
Keep changes focused.
Avoid mixing an unrelated backend migration, dashboard redesign, and Admin change into one commit.
Ideas for contribution
The previous roadmap contained several items that are now implemented. The remaining ideas should therefore focus on capabilities that genuinely extend the current platform.
| Feature | Description | Effort |
|---|---|---|
| City bubbles on the world map | Add a richer country-to-city visualization on the geography surface | Medium |
| Session replay / user journey | Show a controlled sequence of anonymous session events without introducing fingerprinting | Large |
| Custom dashboards | Let administrators assemble selected cards/charts into personalized dashboard views | Large |
| Behavior flow diagram | Visualize supported page/event transitions | Large |
| Additional languages | Add complete translation catalogs for more locales | Small |
| Section-specific theme preference | Allow selected dashboard sections to use controlled presentation modes | Medium |
| Admin dashboard widgets | Surface selected analytics indicators alongside the generic Admin workspace | Medium |
| Advanced retention/cohort exploration | Add deeper cohort comparisons and retention views | Medium |
| More alert policies | Add configurable thresholds for selected operational/security conditions | Medium |
| A/B testing integration | Add first-party experiment measurement while keeping the data model explicit | Large |
| Anonymous heatmap tooling | Capture privacy-safe click-density data without browser fingerprinting | Large |
| Expanded export formats | Add carefully scoped machine-oriented logical package profiles | Medium |
| Package dependency planner | Show explicit dependency ordering before larger package imports | Medium |
| Admin saved views | Allow administrators to save safe model list/filter configurations | Medium |
| Admin bulk workflow queue | Move very large administrative operations into an explicit queued workflow | Large |
| Plugin / extension system | Allow controlled registration of additional dashboard sections and Admin capabilities | Large |
| Local AI incident summaries | Generate optional summaries from sanitized log context without sending raw logs to a hosted AI provider | Large |
New contributions should preserve Paxalia's central principles:
privacy-first
self-hosted
Django-native
security-aware
generic
auditable
maintainable
License
This project is licensed under the Apache License 2.0.
See LICENSE for the complete license text.
In practical terms, the Apache 2.0 license permits:
- use
- reproduction
- modification
- distribution
- commercial use
- derivative works
subject to the license conditions.
Credits
Built by Parsa Zaydany and published under the Paxalia brand.
The Story
Paxalia was built around a simple idea:
software should help people work with time, information, and collaboration without requiring every piece of their operational data to leave their own environment.
The dashboard reflects the same philosophy.
Instead of depending on a third-party analytics collector, it keeps application analytics and operational telemetry inside the Django project that owns the data.
About Paxalia
Paxalia is a workspace, timer, planner, and team-tools platform covering areas such as:
- focused time tracking
- notes
- goals
- an infinite canvas/board
- Life OS workflows
- live shareable pages
- events and alarms
- team communication
The Paxalia Dashboard is the open-source Paxalia project focused on Django applications and is part of the same ecosystem.
Support
If Paxalia helps your project, useful forms of support include:
- starring the repository
- sharing it with the Django community
- contributing a language
- contributing tests
- contributing documentation
- contributing a feature
- supporting Paxalia through the project's official support/donation channels
Thank you for using paxalia-dashboard.
Future Security Setup & Bootstrap Tooling
Planned / not implemented in the current release.
This section documents a future contribution direction only. None of the commands below are available from the current package. Do not copy them into deployment automation expecting them to exist today.
The long-term goal is to provide an interactive Paxalia project-setup layer that can diagnose a Django project, preview proposed security/configuration changes, create backups, and then apply only changes that the administrator explicitly approves.
Future paxalia_check
A future command may provide a single read-only project health entry point:
python manage.py paxalia_check
The intended scope includes Django deployment checks, Paxalia security checks, authentication checks, configuration checks, logging checks, and Admin checks.
Future paxalia_setup
A future interactive setup command may inspect the host project and show a preview before making changes:
python manage.py paxalia_setup
The future workflow could inspect the project, preview proposed changes, create backups, configure Paxalia, configure security, configure logging, and configure authentication while preserving existing project behavior.
Future security setup
A future security-focused mode could be exposed as:
python manage.py paxalia_setup security
python manage.py paxalia_setup security --apply
A future implementation should first inspect the project safely and present a deterministic preview. Depending on the project, it could eventually:
- detect existing security/authentication packages
- propose only compatible dependencies
- back up files before mutation
- update
.envsafely where the project uses environment-based settings - update
.env.exampleand.gitignorewhen appropriate - configure security middleware
- configure Paxalia logging
- configure administrator authentication and security
- run Django/Paxalia validation after applying changes
The future tooling must preserve existing settings instead of blindly rewriting arbitrary settings.py files.
Future production security setup
A future production-oriented mode could be exposed as:
python manage.py paxalia_setup security --production --apply
This would still need to preview its intended changes, create backups, detect conflicts, and stop rather than silently overwrite project-specific configuration. Production mode should maximize safe automation, not remove administrator control.
Explicitly outside the current release
The current package does not automatically:
- migrate
settings.pysecrets into.env - rewrite
.envfiles - modify
requirements.txt,pyproject.toml, Poetry configuration, or other dependency manifests - rewrite arbitrary Django settings files
- bootstrap a deployment automatically
- provide the future
paxalia_checkcommand - provide the future
paxalia_setupcommand
For the current release, Security Overview is intentionally diagnostic and read-only: it tells administrators what is active, what is missing, and what requires attention. Future setup tooling can build on those diagnostics later without changing the completed security architecture.
Created with love by the Paxalia team for the world — because detail matters.
Detail is in the layers you may not notice first: thoughtful security boundaries, password + 2FA + authorized-device authentication, rate limits, CSRF protection, isolated administrator sessions, a private dashboard path, twelve token-driven themes, a clean Django-native structure, careful data portability, persistent observability, and the small decisions that make the whole system feel considered.
Paxalia Dashboard is built around the belief that the details are part of the product.
Release files for paxalia-dashboard 4.0.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| paxalia_dashboard-4.0.0.tar.gz | 799.9 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| paxalia_dashboard-4.0.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 1.7 MB
Release files / paxalia_dashboard-4.0.0.tar.gz
| Download URL | paxalia_dashboard-4.0.0.tar.gz |
|---|---|
| Size | 799.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
eb8d4475ba4e3e19df69e5d06248845b8fdf289177f4e0a127d1e00d036c06bb
|
|
BLAKE2b-256 checksum How to use checksums |
a96149b8e04f81945090ccb3259e0cb8c859bd18a4c5ef9ca68897d24e3a9151
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.3
|
Release files / paxalia_dashboard-4.0.0-py3-none-any.whl
| Download URL | paxalia_dashboard-4.0.0-py3-none-any.whl |
|---|---|
| Size | 880.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
4d5a197d2f4de146def3a994a9c07c0b4d4da82a0c34a1cf27b96c2fde43689b
|
|
BLAKE2b-256 checksum How to use checksums |
b06789a2e101ec6f1bdb52a58e42f4a7af12ccbe9cd32f915fdc1e29046b7556
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.3
|