A lightweight, mobile-first contact page designed to open from an NFC tag. One static template supports multiple profiles with no framework, build step, backend, tracking, or third-party dependency.
public/.danny entry in public/profiles.js, give it a unique key and matching slug, then replace its values.https://yourdomain.com/their-slug/.Optional fields can be empty or omitted. Missing organization, bio, phone, email, LinkedIn, and additional links are hidden automatically. The vCard is generated in the browser for the selected profile.
Use an optional ordered actions array when a profile needs different buttons. Built-in action types phone, email, and linkedin use the matching profile field. Facebook, Instagram, websites, or other actions provide their own url. An action is automatically skipped when its required value is empty.
jamie: {
slug: "jamie",
fullName: "Jamie Example",
title: "Program Manager",
organization: "Example Organization",
bio: "A short professional biography.",
photo: "jamie.jpg",
phone: "+12125550123",
email: "jamie@example.com",
linkedin: "https://www.linkedin.com/in/example/",
actions: [
{ type: "phone", label: "Call" },
{ type: "facebook", label: "Facebook", url: "https://www.facebook.com/example/" },
{ type: "instagram", label: "Instagram", url: "https://www.instagram.com/example/" },
{ type: "email", label: "Email" },
],
links: [],
},
The root URL loads the defaultProfile set near the top of public/profiles.js. The page intentionally uses noindex metadata because it is designed for direct NFC sharing; this reduces search-engine discovery but does not make publicly hosted contact details private.
From this folder, run:
python3 -m http.server 8000
Then visit http://localhost:8000/?profile=danny. Python’s basic server does not support clean-path rewrites, but the query fallback loads the identical profile. Test the contact download and available secondary actions on a phone before writing the final HTTPS URL to the NFC tag.
This is an assets-only Cloudflare Worker with no backend script or build step. Deploy it with:
npx wrangler deploy
wrangler.jsonc publishes only the files in public/ and uses not_found_handling: "single-page-application", so clean paths such as /danny/ and /jamie/ serve the shared template.
In Cloudflare Workers Git integration, leave the build command empty and use npx wrangler deploy as the deploy command. No output directory, Worker entrypoint, or environment variables are required.