PRIVACY POLICY
Privacy Policy
Effective date · 2026-05-15 — last updated · 2026-05-16
Flikt ("we", "the app") is a self-hosted screenshot uploader. This
policy describes what data Flikt handles, where it goes, and how long it
stays. The default server (img.fisicaro.xyz) is operated by
Flavio Fisicaro. Self-hosted instances are operated by whoever runs
them; this policy describes only the default server.
SECTION · 01
What stays on your device
Tokens, settings, signed-in email.
- Your OAuth session token (JWT), stored in the OS application data
directory (
~/Library/Application Support/Flikton macOS,%APPDATA%\Flikton Windows,~/.config/Flikton Linux). - Your chosen server URL and capture hotkey.
- Your signed-in email, cached for display.
SECTION · 02
What's stored on the server
Index rows; no plaintext bytes.
The server keeps a JSON record per signed-in user containing:
- Your Google account ID (Google's opaque
subidentifier). - Your Google account email address.
- A Google Drive refresh token, encrypted at rest with AES-256-GCM.
This token lets the server upload to your Drive on your behalf via the
drive.filescope and nothing else. - Per-upload metadata: a short opaque ID, the IV (initialisation vector) used to encrypt the image, an "encrypted: true" flag, and a creation timestamp.
The server does not store image bytes in plaintext. In Drive mode uploads stream straight through to your Google Drive folder; in encrypted mode (the default in v0.3.0+) the server only ever handles AES-256-GCM ciphertext — the decryption key never reaches the server.
SECTION · 2B
End-to-end encryption
The server holds ciphertext. The fragment holds the key.
Flikt v0.3.0+ encrypts every capture with a fresh AES-256-GCM key
before upload. The key never leaves your device except as a URL
fragment (the part after #), which browsers, proxies, and
Cloudflare never send upstream. The viewer page at
img.fisicaro.xyz/v/<id> reads the key from
location.hash client-side and decrypts via the browser's
built-in WebCrypto API.
What this means in practice:
- The Flikt operator (the maintainer with SSH/filesystem access) cannot view your uploads. They hold ciphertext + a few index fields (upload ID, encrypted flag, IV, creation time, owner user-ID).
- Anyone you share the full URL with — including the
#k=...fragment — can decrypt and view the image. Same trust model as today's URLs; just made explicit. - Link unfurlers (Slack, Discord, Twitter) cannot see the fragment, so encrypted images do not render inline by default. You can opt individual uploads in via the in-app History view's Make previewable toggle — that uploads a 256-pixel server-readable thumbnail. The full-resolution image stays encrypted either way.
- Decryption keys live in your device's local store. Lose the device without exporting your keys (Settings → Export keys…) and the encrypted images are unrecoverable.
Threat model
| Attacker has | Refresh tokens | Image contents |
|---|---|---|
.users.json backup leak only | No | No |
Both .users.json and .env | Yes | No — ciphertext only |
| Running container shell (SSH) | Yes | No — key never reaches server |
| Your device with local key store | — | Yes |
Full URL incl. #k=... | — | Yes |
SECTION · 03
What's stored in Google Drive
Your Drive, your files.
- The image files Flikt uploads, organised into
Flikt/YYYY-MM/subfolders by upload month inside a top-levelFliktfolder Flikt creates in your Drive root. - Each file is accessible only to you via your Google account, plus anyone you share a public Flikt URL with.
- The
drive.filescope is "non-sensitive" by Google's classification: Flikt can only see files it created. It cannot read, modify, or list any other file in your Drive.
SECTION · 04
Public access to your uploads
Encrypted captures (v0.3.0+) yield a URL of the form
img.fisicaro.xyz/v/<random-id>#k=<base64-key>.
Anyone with the full URL including the fragment can decrypt
and view the image — anyone with only the prefix sees an inert viewer
page that fails to decrypt. The random ID is 8 characters from a
64-character alphabet (effectively unguessable). Legacy uploads from
pre-v0.3.0 builds are served as plaintext via the older
img.fisicaro.xyz/<id> URLs and remain reachable that
way until you delete them.
SECTION · 05
Deletion
Delete anywhere.
- From the app: open History (tray menu → History), click Delete on any image. This removes both the server's index entry and the file from your Drive.
- Directly in Drive: deleting the file from the "Flikt" folder in your Drive immediately breaks the public URL.
- Revoke access entirely: visit Google account permissions and remove Flikt. The server's cached refresh token becomes useless. Your existing images stay in Drive until you delete them.
SECTION · 06
Retention
The server enforces a per-user upload cap (default 1000). Once you hit the cap, the oldest image is automatically deleted from Drive when you upload a new one. Cap is configurable per server.
If you don't sign in to Flikt for 12 months, the maintainer reserves the right to delete your server-side record (Google account ID, email, refresh token, index). Your image files in your own Drive are not touched.
SECTION · 07
Third parties
- Google — handles OAuth + Drive. Subject to Google's privacy policy.
- Cloudflare — fronts the public URL for DDoS protection. Sees IP addresses of viewers and request paths. Subject to Cloudflare's privacy policy.
Flikt itself uses no analytics, no advertising trackers, no telemetry. The server logs request metadata (path, status code, IP) to its own log file for debugging; logs rotate after 7 days.
SECTION · 08
Security
Defense in depth, not privacy from the operator.
- JWT sessions are signed with a 256-bit secret. Tokens expire after 14 days.
- Refresh tokens are kept server-side only and never sent to the desktop app. At rest they are wrapped with AES-256-GCM; the key lives in the server's environment, so the operator (who has both) can still decrypt them. This is defense in depth against a backup or file-level leak, not privacy from the operator.
- All traffic to the server is HTTPS-only via Cloudflare.
- The server source is open: github.com/FisiFla/flikt. If you find a vulnerability, please email [email protected].
SECTION · 09
Children
Flikt is not directed at children under 13. We don't knowingly collect data from anyone under 13. If you believe a child has used Flikt, please email [email protected] and we'll remove their record.
SECTION · 10
Changes to this policy
If we materially change what's collected or shared, we'll publish a new policy here with an updated "Last updated" date. Substantial changes (new third-party processors, broader data collection) will also be announced via the GitHub repo's README.
SECTION · 11
Contact
Email [email protected] or open an issue at github.com/FisiFla/flikt/issues.