Pangram verdict · v3.3
We believe that this document is fully human-written
AI likelihood · overall
HumanArticle text · 407 words · 2 segments analyzed
Posted on July 5, 2026 • 0 views
You need a webring! Yes, you! If you have (1) a personal website and (2) n+0 friends, you should set up a webring. What is a webring? Well its just a circular linked list of websites that have some topic assiged to it. It could be a hobby, a passion, or just your friends! The lore behind webrings is pretty deep, I would read more about it here linky. But to be honest, all you need to know is it's just fun. How does one set up a webring? The easy but tedious way: Just manually tell your group to link each other your websites so it loops. Site A would link to Site B, B to C and C back to A. The more complexish way Set up a web server that stores a json file of all your friends websites, then just have a /prev and /next route that will auto navigate. import ring from './ring.json';
const {members} = ring;
export default { /** * This is the standard fetch handler for a Cloudflare Worker * * @param request - The request submitted to the Worker from the client * @param env - The interface to reference bindings declared in wrangler.jsonc * @param ctx - The execution context of the Worker * @returns The response to be sent back to the client */ async fetch(request, env, ctx): Promise<Response> { const pathname = new URL(request.url).pathname; // get referrer
const referrer = new URL(request.url).searchParams.get('from') || request.headers.get('referer') || request.headers.get('referrer') || ''; const currentMember = members.find(member => member.url === referrer);
if (!
currentMember) { return new Response('Member not found', {status: 404}); }
switch (pathname) { case '/': return new Response('Zadu'); case '/next': const nextMember = members[(members.indexOf(currentMember) + 1) % members.length];
// redirect to the next member's URL return Response.redirect(nextMember.url, 302); case '/prev': const prevMember = members[(members.indexOf(currentMember) - 1 + members.length) % members.length];
// redirect to the previous member's URL return Response.redirect(prevMember.url, 302); case '/random': const randomMember = members[Math.floor(Math.random() * members.length)];
// redirect to a random member's URL return Response.redirect(randomMember.url, 302); default: // If the pathname does not match any known routes, return a 404 response return new Response('Not Found', {status: 404}); } }, } satisfies ExportedHandler<Env>; I personally used a cloudflare worker for this, since that is free and I don't expect heavy usage from it. You can see the full soure code here.
Moar: On America’s 250th, the continuing story.