Privacy & Security
Your privacy is fundamental to how Julia is built. This page provides a detailed technical overview of how we protect your data, authenticate your identity, and ensure that your information remains private and secure.
Data Protection Layer
Learn about our zero-knowledge architecture that ensures your personal data never reaches AI providers. This is Julia's key privacy differentiator.
Core Privacy Principles
Data Isolation
Every query to our database is scoped to your user ID. It's technically impossible for one user to access another user's data.
Minimal Data Collection
We only store what's necessary to provide the service. No analytics tracking, no behavioral profiling, no data selling.
Secure Authentication
Passwordless authentication using cryptographically secure magic links. No passwords to leak or forget.
Data Deletion
You can delete your data at any time. Account deletion removes all your information from our systems.
Authentication System
Julia uses a passwordless authentication system that's both more secure and more convenient than traditional passwords. Here's how it works:
Magic Link Authentication
When you need to access the web dashboard, Julia generates a secure magic link that allows one-time access without entering a password.
Token Generation
A 256-bit cryptographically secure random token is generated using crypto.randomBytes(32). This token has the same entropy as a high-security password.
Secure Storage
The token is stored in Redis with a 1-hour expiration. It's mapped to your user ID but cannot be reverse-engineered to reveal your identity.
Single Use
Once you click the magic link, the token is immediately deleted. It cannot be reused, even if someone intercepts it after you've used it.
JWT Session
After successful authentication, you receive a short-lived JWT access token (15 minutes) and a refresh token stored as an httpOnly cookie (7 days).
Rate Limiting
To prevent abuse, magic link requests are rate-limited:
- Maximum 10 magic link requests per hour (production)
- Limits tracked per user ID, not IP address
- Clear error messages when limits are reached
OAuth & Third-Party Access
When you connect your Google or Microsoft account, Julia uses OAuth 2.0 — the industry-standard protocol for secure authorization. This is the same system used by apps like Slack, Zoom, and Notion.
How OAuth Works
You Authorize Access
You're redirected to Google or Microsoft's login page where you authenticate directly with them. Julia never sees your password.
Scoped Permissions
You grant specific permissions (calendar read/write, email access). Julia only requests the minimum permissions needed to function.
Token Exchange
Google/Microsoft gives Julia an access token (expires in ~1 hour) and a refresh token (used to get new access tokens without re-authorization).
Automatic Refresh
When the access token expires, Julia automatically uses the refresh token to get a new one. This happens transparently in the background.
Revoke Access Anytime
You can revoke Julia's access to your Google or Microsoft account at any time:
- • From Julia: Go to Settings → Integrations → Disconnect
- • From Google: Visit myaccount.google.com/permissions
- • From Microsoft: Visit account.microsoft.com/consent
Data Storage & Isolation
Your data is stored in a PostgreSQL database with strict isolation between users. Here's what we store and how we protect it:
What We Store
| Data Type | Purpose | Retention |
|---|---|---|
| User Profile | Email, name, timezone, preferences | Until account deletion |
| Messages | Conversation history for context | Until account deletion |
| Memory Profile | Your preferences and facts (JSON) | Until account deletion |
| Memory Episodes | Important events and conversations | Until account deletion |
| Contacts | People you interact with | Until account deletion |
| Tasks | Your to-do items | Until account deletion |
| OAuth Tokens | Access to Google/Microsoft | Until you disconnect |
| Audit Events | Security and debugging logs | 90 days |
User Isolation
Every database query is scoped to your user ID. This is enforced at the application level through:
- JWT authentication that includes your user ID in every request
- TypeORM queries that always include
WHERE user_id = :userId - Foreign key constraints that cascade delete when a user is removed
- Database indexes on user_id for performance and enforcement
Communication Security
In Transit
- • All connections use HTTPS (TLS 1.3)
- • Secure cookies with httpOnly flag
- • sameSite=lax to prevent CSRF
- • CORS configured for specific origins
Messaging Platforms
- • WhatsApp uses end-to-end encryption
- • Telegram uses client-server encryption
- • Webhook signatures verified
- • Messages processed, not stored long-term
Account Deletion
You have the right to delete your account and all associated data at any time. Here's what happens when you delete your account:
- 1Immediate: Your account is marked as deleted and you lose access
- 230-day grace period: Your data is retained but inaccessible, in case you want to recover your account
- 3After 30 days: All data is permanently deleted (CASCADE delete on all related tables)
- 4Channel identities: Anonymized to "Deleted User" rather than deleted, to maintain conversation integrity
What We Don't Do
- ✕We don't sell your data to third parties
- ✕We don't use your data to train AI models
- ✕We don't share your data with advertisers
- ✕We don't track you across websites
- ✕We don't store your Google/Microsoft passwords
- ✕We don't access more data than necessary
- ✕We don't keep data after you delete your account