antisocial.media
the guide · free · always

Build your page in an afternoon.

This is everything. No course, no upsell at step four. You'll need: a domain (about $12), a free Cloudflare account, and an AI coding agent. If you'd rather skip a step, we'll do it.

contents

1. Decide five things

Your agent will ask you these. Decide now and the whole thing takes an hour.

  1. Your name and one line. "Sam. Makes furniture, ruins weekends." That's the public page. All of it.
  2. Your tiers. Default: friends family work. Rename them. Merge them. Add "exes" if you're brave.
  3. What goes where. Friends get bulletins and photos. Family gets the real updates. Work gets the portfolio and zero baby pictures.
  4. A look. Pick a template or describe one. "Like a 2004 band website" is a valid spec.
  5. A song. An audio file you have rights to. Your own demo, a Creative Commons track, a voice memo of your dog. Behind a play button. Always.

2. Get a domain

A domain is the only thing here that costs money and the only thing that makes it yours. Buy it at a registrar that doesn't upsell: Cloudflare Registrar (at cost, and you'll need Cloudflare anyway) or Porkbun. Avoid anything that offers you "website builder" at checkout.

skip it: domain + DNS + deploy setup is our most popular service, because nobody enjoys nameservers.

3. Point your agent at the spec

Open Claude Code, Cursor, Codex, or whatever you have, in an empty folder. Paste:

Read https://antisocial.media/agent/ANTISOCIAL.md and follow it exactly
to build my personal page with tiered private access. Interview me
first, then build, then help me deploy it to a domain I own.

It will interview you (the five things above), show a plan, and build. Say "go". Read what it built. It's about eight files and you can understand every one of them. That's deliberate.

No agent? The rest of this page is enough to do it by hand if you know a little HTML. The worker below is the only real code.

4. How tiers work (the whole trick)

Your site is a folder. Inside it: index.html (public), and folders friends/, family/, work/. A tiny program in front of the folder (a "worker") checks one cookie before serving anything from those folders.

public
  • /
  • anyone
friends
  • /friends/
  • friends, family, you
family
  • /family/
  • family, you
work
  • /work/
  • work, you

How does someone get the cookie? You give them a link: yourname.com/u/<secret>. Visiting it sets a signed cookie for that tier, good for six months, and bounces them into the folder. No account. No password. No "forgot password." A link, from you, because you know them.

Want someone out? Change the secret. Everyone with the old link is out. Give the new one to the people you still like.

Anyone without a cookie who hits /friends/ sees a polite locked page. Not a login form. A door.

5. The worker, explained

This is the only real code on the site and it's under 60 lines. It runs on Cloudflare's free tier. Your agent copies it from the spec; here it is so you know what it does.

  1. Read the cookie. Format: tier.expiry.signature. The signature is an HMAC of tier.expiry with a secret only your worker knows. If it doesn't verify, you're public.
  2. Handle /u/<code>. Compare the code to your invite secrets. Match → set the cookie, redirect to that tier. No match → the normal 404. (Never reveal that /u/ exists.)
  3. Gate the folders. If the path starts with a tier folder and the cookie's tier isn't allowed, serve locked.html with a 403.
  4. Everything else is a static file. Serve it.
  5. Guestbook. A couple of endpoints that append to a list in KV storage, with a per-IP rate limit. Optional, default on.

Full reference implementation: appendix of the spec. Secrets live in wrangler secret, never in the code.

6. Deploy

npm i -g wrangler
wrangler login                          # click Authorize in your browser
wrangler kv namespace create GUESTBOOK  # paste the id into wrangler.jsonc
openssl rand -hex 12                    # run once per secret, below
wrangler secret put INVITE_FRIENDS
wrangler secret put INVITE_FAMILY
wrangler secret put INVITE_WORK
wrangler secret put INVITE_OWNER
wrangler secret put COOKIE_SECRET
wrangler deploy                         # you get a *.workers.dev URL

Custom domain: once your domain's DNS is on Cloudflare, add two routes to wrangler.jsonc and deploy again:

"routes": [
  { "pattern": "yourname.com",     "custom_domain": true },
  { "pattern": "www.yourname.com", "custom_domain": true }
]

If the deploy complains about existing DNS records, delete the A/AAAA/CNAME records for the bare domain and www in the Cloudflare DNS page. Do not touch MX or TXT records. Those are your email.

7. Hand out keys

Your agent prints four links. Text them to people. In person is better. Put the owner link in your password manager and nowhere else.

friends:  https://yourname.com/u/8f2a91c4e7b3
family:   https://yourname.com/u/3d7e1a9b5c0f
work:     https://yourname.com/u/c1b9e4d2a6f8
owner:    https://yourname.com/u/………   (don't share)

Test it in a private window: /friends/ is locked, open the friends link, /friends/ opens, /lock logs you out.

8. Soundtrack, Top 8, guestbook

Profile song. Put the audio file in public/assets/, set the path in config.js. It renders as <audio controls preload="none">. Autoplay is banned by the spec and by decency.

Top 8. Eight names and optional links in config.js. Reorder them when someone wrongs you. This is the feature.

Guestbook. Each tier has its own. Friends sign the friends one. Your mom signs the family one. You can delete anything with the owner cookie. Spam is a non-issue when the page is behind a key.

Bulletins. Short posts, newest on top, in a plain list. If you want a real blog, tell your agent "make bulletins markdown files in a posts/ folder". It'll do it in a minute.

9. Leaving Instagram (and friends)

  1. Request your data export. Instagram: Settings → Your information → Download. It arrives as a zip in a day or two. TikTok and Facebook have the same thing.
  2. Unzip it into your site folder as instagram-export/.
  3. Tell your agent: "Build /friends/archive/ from ./instagram-export: a grid of my photos with captions and dates, newest first, no external requests."
  4. Post one last thing on the old account: your public URL and "text me for the key." Then stop posting. You don't have to delete it. It just stops being where you live.
skip it: migration service: we turn your export into an archive page and you never look at the zip.

10. Keeping it alive


give the spec to your agent →   sign the guestbook when you're live