Note: since I only have 2 credits to cover the cost of 2 .cv domains, I can't open registrations to everyone. If you're part of the OlaCV team and would like to try it, please let me know via discord/mail/telegram.

Inspiration

Your CV is the most important document in your professional life, but sharing it is stuck in the past — export a PDF, attach it to an email, upload it to a job board, and lose control. You can't update it, track it, or style it. Building a personal site means stitching together a registrar, hosting, DNS, SSL, and email — technical work that has nothing to do with presenting yourself professionally. We wanted to fix that with .cv domains, where the TLD literally stands for CV.

What it does

CheckMe.cv turns .cv domains into living, professional profiles you fully control. You register a .cv domain, pick a visual theme — Windows 98, Windows Aero, a terminal, a bulletin board, or a monochrome CRT — and build your CV through a web-based admin panel. Add content blocks, links, documents, and rich text. Set up shortlinks like /github or /resume. Configure email forwarding on your own domain. Everything publishes directly to your .cv URL, always up to date, always yours.

How we built it

The stack is Node.js, Express, and SQLite. Domain registration and DNS go through the Ola.CV API, we utilize Ola.CV api for DNS zones, generate A, CNAME, MX, SPF, DKIM, and DMARC records, and write custom NGINX configs per domain. SSL certificates are issued automatically via certbot through a background worker. Mail forwarding is handled via PHP scripts on an iRedMail server. Payments run through Stripe Checkout with webhook-driven provisioning. The frontend themes are standalone renderers that read a JSON config — swapping looks without touching content. Everything is 100% automatic.

Challenges we ran into

The Ola.CV API documentation suggested ns1.ola.cv / ns2.ola.cv as default nameservers — but those don't resolve. We discovered through testing that omitting the nameservers field entirely triggers OlaV managed nameservers which actually work. DNS record naming was another gotcha: the API requires full domain names (jacopodp.cv, www.jacopodp.cv) not shorthand (@, www), and returns a 422 if you get it wrong. We also hit a bug where our DNS reset endpoint deleted all records but failed to recreate them because the domain name wasn't passed to the recreation function — every record came back as "undefined". Also, we asked the OlaCV team to implement nameserver reset (back to managed) functionality and they accepted my proposal: else, if you changed the NS of a domain, you had to hardcode the nameservers to bring it back to managed.

Accomplishments that we're proud of

The entire domain lifecycle is automated end to end — from Stripe payment to DNS provisioning to SSL issuance — with zero terminal interaction required from the user. The provisioning pipeline is fully idempotent and resumable: if it fails at any step, it picks up where it left off. We also ship real email infrastructure out of the box — SPF, DKIM, and DMARC records are generated automatically so users can receive mail on their personal domain from day one.

What we learned

DNS is deceptively complex when you're automating it across a registrar API, a managed DNS provider, and a TLD with a 24-hour NS TTL. We learned that API documentation doesn't always match reality, and that the only way to discover certain behaviors (like Cloudflare zone auto-provisioning) is to test aggressively. We also learned how much UX friction disappears when you treat domain setup as a pipeline rather than a checklist of manual steps.

What's next for CheckMe.cv

Outbound email — right now we handle inbound forwarding, but sending mail from your .cv domain is the natural next step. More themes and a theme SDK so the community can contribute renderers. Analytics so users can see who's viewing their portfolio. And a public API so developers can programmatically manage their .cv profiles.

Built With

Share this project:

Updates