Trust & Security
Skua is designed for sharing work outputs – charts, tables, analysis results. Here's exactly how we protect that data, what our limits are, and what you should think about before uploading.
The right mindset
Skua is a sharing tool, not a vault. It's built for the outputs of your work – the chart you'd put in a slide deck, the table you'd paste into Slack. If you wouldn't email it to a colleague, don't snap it.
We take security seriously and have built real protections (detailed below), but we also believe in being straight with you: any time you put data on a third-party service, you're trusting that service. We want to earn that trust by being transparent about what we do and don't do.
Snapshot URLs are unguessable
Every snapshot gets a 12-character ID generated using secrets.choice() from Python's cryptographic random module. The alphabet is base62
(a–z, A–Z, 0–9), giving each ID 71.5 bits of entropy –
over 3 sextillion possible combinations.
IDs have no sequential or time-based component. Knowing one ID tells you nothing about any other. At the rate of 1 billion guesses per second, it would take over 100,000 years to find a single valid ID by brute force – and our rate limiting would block you long before that.
That said, URLs are not passwords. Anyone who has a snapshot URL can view it. Don't share the URL with people you wouldn't want to see the content.
Access model
Skua uses a capability-based access model: the URL is the credential. This is the same model used by Google Docs "anyone with the link" sharing, Figma share links, and most file-sharing services.
- Public snapshots appear on your profile page and are viewable by anyone with the URL
- Private snapshots (verified accounts only) are hidden from your profile but still accessible via URL – "private" controls discoverability, not access
There is no login-gated viewing. This is by design – it means you can share a URL with anyone (including people who don't have a Skua account) and it just works. The tradeoff is that if a URL leaks, the content is visible. If you need login-gated access control, Skua isn't the right tool for that content today.
Authentication
Sessions are token-based. Your token is stored locally on your machine at ~/.skua/session (anonymous) or ~/.skua/token (verified).
- Tokens are hashed with SHA-256 before storage – the server never stores your raw token
- Email verification tokens are single-use and expire after 15 minutes
- No cookies are used – the Python client sends your token via an HTTP header
Encryption
In transit: all connections use HTTPS/TLS with Let's Encrypt certificates. HTTP requests are redirected to HTTPS. HSTS is enabled with a 1-year max-age. HTTP/2 is supported.
At rest: snapshot data and the PostgreSQL database live on encrypted block storage on a dedicated Hetzner VPS in Ashburn, Virginia (US East). We do not currently offer client-side encryption – data is encrypted by the infrastructure, not by the application.
Security headers are set on all responses: X-Frame-Options, X-Content-Type-Options, Strict-Transport-Security.
Rate limiting & abuse prevention
Two layers of rate limiting protect the service:
- Request rate limits – 60 uploads per minute, 200 per hour (burst-friendly for notebook "Run All" workflows). Read endpoints allow 1,000 requests per hour.
- Failure-based blocking – 20 failed requests (404s, invalid IDs) in 5 minutes triggers an automatic IP block with escalating durations: 10 minutes, 1 hour, then 24 hours for repeat offenders.
Nginx enforces a 10 MB upload cap and a 10 requests/second rate limit before traffic reaches the application.
Data retention
- Anonymous: snapshots expire after 7 days
- Verified: 90-day retention, resetting on each update, with a 1-year maximum
An automated cleanup process runs hourly. When a snapshot expires, both the database record and the stored file are permanently deleted – storage first, then database, so no orphaned files remain accessible.
What we collect
No tracking cookies. No telemetry from the Python package. No user agents or referrers logged. Website analytics via Fathom (privacy-focused, cookieless, GDPR compliant).
What we do collect – the minimum needed to operate:
- Your uploaded content – exactly what you pass to
skua.snap() - IP address – for rate limiting and abuse prevention only, not linked to identity
- Email – only if you verify, used only for sending your token
- Metadata – timestamps, content sizes, view counts
Input validation
All input is validated at multiple layers – the Python client validates
locally for fast feedback, and the backend re-validates everything with
Pydantic models regardless of what the client sends. Database queries use
parameterized statements via SQLAlchemy (no string interpolation, no SQL
injection risk). CSV exports sanitize cells that start with formula
characters (=, +, @) to prevent
injection in spreadsheet applications.
Open source client
The Python package is open source (MIT License). You can read exactly what data the client sends, how it serializes your objects, and what HTTP requests it makes. There are no hidden analytics, no phone-home calls, no data collection beyond what's needed to upload your snapshot.
Our recommendation
Skua is a good fit for:
- Charts and visualizations you'd present to your team
- DataFrames and tables with non-sensitive business data
- Analysis results, model outputs, experiment summaries
- Anything you'd put in a slide deck or Slack message
Think twice before uploading:
- PII, health records, or financial data covered by regulation
- Credentials, API keys, or secrets
- Proprietary data your employer restricts from third-party services
- Anything where URL-based access isn't sufficient
When in doubt, ask: "Would I be comfortable if this URL were forwarded to someone I didn't intend?" If yes, snap it. If not, keep it local.
Continuity
Skua is built and operated by one person. If Skua ever shuts down, I'll give at least 30 days notice and keep read access available during that window so you can save anything you need. The Python client is open source and your snapshots are always accessible via their URLs for as long as the service runs.
Security questions or concerns? Contact hello@skua.dev.