GlobeJoke
中文

Draft · pending legal review

This is a working draft. It has not been reviewed by a lawyer and will change before it is final. It is not legal advice.

Privacy

Last updated 2026-11-06

This page lists the data the site actually handles, field by field. It is written to match the code, not to sound reassuring.

The short version

  • No account, and we never ask for your name, phone number, address or ID.
  • No advertising, social or analytics cookies of our own; no cross-site tracking.
  • The only contact details we hold are the ones you type into a submission or takedown form. We never ask for them anywhere else.
  • Votes are stored under a hash. The plaintext anonymous id stays in your browser.

What we store and why

The site has no login. To keep votes honest it needs a stable pseudonym, so your browser is given a random identifier the first time you vote.

  • gj_anon (anonymous id) — a random UUID created on your first vote, stored in a first-party cookie: HttpOnly, SameSite=Lax, secure in production, two years. Our database stores only sha256(your id + a server-side salt) in votes.anon_hash. The plaintext value never reaches the database. It exists to (a) let you change your vote instead of voting twice and (b) slow down abuse.
  • IP address — read once per request and used only for rate limiting. We store sha256(ip + salt) as a short-lived rate-limit key (minutes for votes, up to two days for the submission and takedown forms). The plaintext IP is not written to our database. Cloudflare, as the host, sees each request the way any web server does.
  • Votes — the joke id, the hashed anonymous id, the vote value (funny / meh / confused) and timestamps. Used for the counts shown on the site.
  • Anonymous events — we run our own first-party anonymous event table. It currently records four event types: page_view, joke_view, next_joke and share (share events also carry platform and category). Events are keyed only by the hashed anonymous id; we never store plaintext IPs and never build cross-site profiles.
  • Contributor nickname — if you submit a joke and ask to be credited, the nickname you give us is stored with the joke and shown publicly.
  • Submission email (optional) — if you send a joke and choose to leave an email address, it is stored with the submission. Use: replying to you and confirming your permission to publish, plus takedown contact. It is not used for marketing and never shown publicly. Planned retention: 12 months after the submission is resolved, then deleted. Until the automatic clean-up exists, ask us and we delete it.
  • Submission IP hash — the submission form stores sha256(ip + salt) with the submission, solely to block repeated spam. Plaintext IP is never stored.
  • Consent record — when you submit, we store that you ticked the consent box, the time, and which version of the terms you agreed to (currently terms-2026-11). It is the proof that we may publish the joke.
  • Takedown requests — if you use the takedown form, we store the link you gave, your reason, the contact you entered and timestamps, so we can act on it and reply. Only the team sees this.

Cookies and local storage

Five small pieces of state, none of them used for advertising or cross-site tracking.

We also count visits ourselves: the page records an anonymous event (page view, joke view, next-joke click, share click) in our own database, keyed only by the hashed anonymous id above. A session is 30 minutes of inactivity; there is no dedicated analytics cookie — the anonymous cookie above is reused for this counting. No third-party analytics, no profiles, no cross-site data.

  • gj_anon — cookie, HttpOnly, SameSite=Lax, two years. Keeps your votes attached to the same anonymous id so you can change them. JavaScript on the page cannot read it.
  • gj_lang — cookie, one year, readable by the page (the language switcher needs it). Remembers that you chose Chinese so the home page stops redirecting you to /zh.
  • gj_theme — browser localStorage, never sent to the server. Remembers light / dark / auto.
  • gj_sleep — browser localStorage, never sent to the server. Remembers bedtime mode.

Third parties

  • Cloudflare — hosting, DNS/CDN and the D1 database. Every request passes through Cloudflare, which processes technical request data under its own privacy terms. We send it nothing beyond what serving the site requires.
  • Cloudflare Web Analytics (Cloudflare Insights) — the host injects Cloudflare's own traffic-analytics beacon so we can see aggregate page views. It is Cloudflare's product, not a tracking script we wrote, and we do not use it to build profiles across sites.
  • Cloudflare Turnstile — a human check. It is used only on the submission form, to tell people from bots, and not on any reading page.
  • GitHub Actions — builds and deploys the site. Build logs contain code, not visitor data.
  • No Google Analytics, no advertising network, no email-marketing platform, no error-tracking SaaS. The only external scripts the site loads are Cloudflare's analytics beacon and — on the submission form, where it is enabled — Cloudflare Turnstile.

Where the data lives

Data is stored in Cloudflare D1, configured in the Asia-Pacific region. Cloudflare is a global network, so requests and backups may be processed in other locations; that is how the platform works.

We do not sell, rent or trade personal data. We share it only with the processors above to run the site, or where the law requires it.

How long we keep it

  • Rate-limit keys: minutes for votes, up to two days for the submission and takedown forms. They are written with an expiry and cleaned up.
  • Anonymous events (page_view / joke_view / next_joke / share): kept for 90 days for aggregate statistics, then archived or deleted. Votes: kept for the life of the site so counters and history stay meaningful.
  • Submission email: planned 12 months after the submission is resolved, then deleted. Until the automatic clean-up exists, we delete on request.
  • Consent record: kept while the joke remains published, as proof of permission.
  • Takedown requests: kept while the request is being handled and for the internal audit trail. There is no automated deletion yet; ask us to delete your contact details at any time.
  • Contributor nickname: as long as the joke is published, or until you ask us to remove the credit.
  • Cookies: 24 months for gj_anon and 12 months for gj_lang, or until you clear them.

Your rights

You can ask us to show you the data linked to you, export it, correct it, or delete it. Email hello@globejoke.com; we reply within five working days.

One honest limitation: votes are keyed by a hash and we hold no lookup table from email to hash. We can find your vote records only if you give us the gj_anon value from your browser (developer tools → Application → Cookies). Without it, we cannot tell your records apart from anyone else's. If you simply want to disappear from the counters, clearing the cookie is enough: the records stay, but nothing links them to you.

We honour deletion requests even where we might have a basis to keep a record, unless the law requires us to keep it for a legal claim.

Children

The site is not directed at children under 14. If you are under 14, please do not submit personal information; ask a parent or guardian to contact us instead. If we learn that a child under 14 submitted personal data, we delete it.

Changes

When this page changes, the "last updated" date changes with it. If we start collecting something new, it will be listed here before it is collected.

Contact

Questions, requests and complaints:

hello@globejoke.com

Contact page →