Personal Account — Shipped & Live
Personal
Public
Live ✓
Personal portfolio and landing page. "Sr. Data Editor at Cloudflare, Writer, Storyteller." SPA deployed as a CF Worker.
Interactive 3D globe (Three.js / globe.gl) showing live visitor dots
shadcn/ui, dark/light mode via next-themes
Visitors fed live by the visitor-radar Worker
Improvements in sessions
Rebuilt from Lovable scaffold into a fully custom site
Added live globe with real-time visitor tracking
Integrated visitor-radar backend Worker for the globe
Personal
Public
Live ✓
RAG-powered AI assistant answering questions about João Tomé's writing, grounded in 758 pieces across Cloudflare Blog, TWiN, DN Insider, Dinheiro Vivo, Substack, Medium, and more.
758 indexed pieces — CF blog posts, TWiN, DN Insider, Dinheiro Vivo, Substack, Medium
Embeds question → searches Vectorize → fetches chunks from D1 → generates answer via Workers AI
Returns source citations with URLs per answer
Word cloud + suggested questions sidebar, dark/light mode
Rate-limited, inspired by ricmac.org/ask
Personal
Public
Live ✓
Website for This Week in NET — João's weekly Cloudflare show covering Internet trends, AI, and security. 100+ episodes.
Episode list, search, topic chart, watch quiz, most-popular embed
CFTV RSS proxy — Worker bypasses CORS restriction on cloudflare.tv
Improvements in sessions
Added RFC 8288 Link headers for AI agent discovery on every response
Accept: text/markdown → returns markdown homepage for AI crawlers
Shipped llms.txt, llms-full.txt, agent-card.json, server-card.json, api-catalog
Added CFTV RSS proxy to the Worker (was blocked by CORS before)
Personal
Public
Live ✓
Personal blog and experiments site. Writing, Agents playground, VizLab, About page. Built with Hugo, deployed on Cloudflare Pages. Content is sourced by Ask Emot's RAG pipeline.
Blog posts: "jgc's teachings", "some (no) where to go", "why seremot.com"
Agents playground — experiments with AI agents
VizLab — data visualization experiments
RSS feed at seremot.com/index.xml
Personal
Public
Live ✓
"Who is João Tomé" — a Notion workspace (garden of ideas) served as a real website via the Fruition technique. CF Worker on a custom domain.
Proxies Notion content, rewrites all workspace domain references
Clean URL slugs: / (home) and /about
Injects SEO meta, dark mode toggle, redirect-blocking script, hides Notion toolbar
Improvements in sessions
Fixed Notion-to-custom-domain redirect loop — overrides window.location, fetch, and XHR
Added API response rewriting to prevent client-side leaks to seremot.notion.site
Uses 302 (not 301) redirects so Notion's client-side JS renders correctly
Personal
Public
Live ✓
"As Capas do Harry Potter" — interactive site to explore, compare, and vote on Harry Potter book cover designs across 12 international editions.
12 country editions: PT, UK, US, ES, FR, DE, BR, JP, KR, CN, IT, TR
Voting and session state persisted in Workers KV
Migrated from hp-covers.pages.dev → harrypottercapas.pages.dev
Personal
Local
Curated knowledge library synthesizing wisdom from 41 thinkers — 1,200+ articles and 497 quotes spanning technology, science, literature, philosophy, art, and music. With per-thinker deep dives and cross-cutting takeaways.
Deep dives: Paul Graham (225 essays), Sam Altman, Steve Jobs, Naval Ravikant, Charlie Munger, Derek Sivers, Marc Andreessen, Scott Galloway, Patrick Collison, George Orwell, Neil deGrasse Tyson
Takeaways document distilling 8 big shared ideas: focus as elimination, follow curiosity not prestige, compounding, writing is thinking
497 curated quotes with per-thinker JSON data
Paul Graham tweets archive, Bluesky posts collected
Personal
Local
Aggregated personal knowledge dashboard — combines quotes, Twitter/X bookmarks, LinkedIn bookmarks, Bluesky posts, and garden-of-ideas links into a single searchable, filterable interface. Built with a Python build script + HTML template.
46K-line single-file HTML — all data embedded, zero external dependencies
Sources: quotes collection, Twitter bookmarks, LinkedIn, Bluesky, garden of ideas
Color-coded by source, searchable, filterable by category
Python build.py + template.html generates the dashboard
Cloudflare Org — Shipped & Live
CF Org
Public
Live ✓
Interactive educational site explaining how Cloudflare generates cryptographic randomness. Users interact with real entropy sources in the browser. Deployed on CF Pages — randomness.cloudflare.com is the intended production domain but not yet pointed here.
Entropy sources: lava lamps, double pendulums, wave machines, camera, Pong, Doom
Connects to the League of Entropy's drand beacon for true random numbers
Time capsule: tlock-encrypted messages unlocked by a future drand round
CF Org
Internal
Live ✓
Internal GA4 analytics dashboard for the Cloudflare blog. All-time pageviews per post, author stats, tag analysis, CP ratios. Behind Cloudflare Access.
GA4 data embedded as JSON — v1 is the authoritative base, never rebuilt from CSV
Author leaderboard, post explorer, tag breakdown, CP ratio
Incremental CSV overlays keep data current without losing old counts
Improvements in sessions
Fixed critical undercount bug — CSV alone missed older posts by 200x (announcing-1111: 4K CSV vs 840K real)
Established v1 as the authoritative base; all updates are additive overlays
AUTHOR_MAP grown to 2,627+ entries, REAL_TITLE_MAP to 2,648+ entries
CF Org
Internal
Live ✓
Internal Cloudflare social media performance dashboard in two versions, behind Cloudflare Access. Data is embedded (no live API feed currently).
v1 (root) — baseline dashboard, static embedded dataset, no live data
v2 (/v2) — full 9-tab dashboard with This Week in NET perspectives: Overview · Post Types · Timing · Heatmap · Best Posts · Accounts · Trends · TWiN Social · TWiN YouTube
Platforms: Twitter/X, LinkedIn, Bluesky, YouTube, Instagram, Facebook, Mastodon
Ask the Dashboard — question presets per tab, comparison mode (rolling periods, year/quarter/month)
Quick Publish Playbook — best day/hour and strongest format per platform
CF Org
Internal
Live ✓
Internal tool tracking Cloudflare blog posts on Hacker News — live HN scores, comment counts, CP ratios, author leaderboards. Behind Cloudflare Access.
Pulls live data from HN Algolia API at runtime
Top posts all-time, trending, by author — sorted by CP ratio
CP ratio identifies posts that spark discussion, not just traffic
CF Org
Internal
Built ✓
Functional mockup for a new Radar feature: a lightweight publishing layer for short-form data insights — making Radar a permanent, searchable home for trend analysis that currently lives only on social media. Target Q2 2026.
Browsable, filterable archive of trend entries (country, ASN, category, metric)
Each entry: title, summary, tags, embedded charts, source links
Designed to feed Radar landing page, category pages, and Radar Display
Full PRD and roadmap written
CF Org
Internal
Built ✓
Functional HTML prototypes for a new Reports area on Radar. Demonstrate Tier 2 (standard embedded) report format with TOC, charts, sections, and Radar-consistent design. Full PRD written, target Q2 2026.
Storm Kristin — Portugal 2026 Internet impact report
Iran Internet shutdown — February 28, 2026
DDoS Report Q1 2025 — test mockup
MDX-preferred authoring format, HTML fallback
Three report tiers defined: external microsite, standard embedded, interactive full-scope
External / Not Cloudflare · Shipped & Live
Vercel
Public
Live ✓
Real-time world events monitor. Live map of news, military movements, cyber threats, weather, AIS shipping, and more. Multiple variants + Tauri desktop app.
Variants: full, tech, finance, happy
MapLibre GL + Deck.gl + Convex real-time backend + Sentry + i18n
Desktop app via Tauri (macOS + Windows), PWA-capable
Full Playwright e2e suite, visual regression tests — v2.5.23
Personal Creative / Writing Projects
Personal
Prototype
A digital time capsule and living archive where people record who they are — memories, values, fears, dreams — at different points in their lives. Not a social network. A deliberate, structured registry of a human life, designed to persist across generations.
Curated questionnaire — every few years, answer a set of questions; each session becomes a sealed "capsule"
Longitudinal portrait: answering at 25, 35, 50 shows evolution no single session can
After death, capsules can be shared with family or made public
Bilingual from the start: Portuguese + English
Full project brief, questionnaire (Proust/Lipton-style), web app spec, exhibit concept written
Working HTML prototype: "The Book of Lives — A Living Archive of Human Stories"
Vite app scaffolded with pages, styles, data, and lib structure
Personal
Research
A book about how Portugal, the smallest Western European maritime nation, pioneered the Age of Discoveries through systematic technological innovation, intelligence gathering, and state-sponsored secrecy — creating the world's first "innovation ecosystem."
20-chapter structure across 5 parts: Context, Technology, Knowledge, Impact, Legacy
2 sample chapters drafted: Ch. 10 (Arab/Muslim legacy) and Ch. 17 (Wreck of the São João)
Extensive bibliography: Crowley, Russell, Boxer, Diffie, Albuquerque, Cortesão
Research roadmap: Google Scholar queries, archives (Torre do Tombo, BN Digital), museums
Key thesis: Portugal treated navigation as state R&D — maps as state secrets, knowledge as weapon
Utilities, Scripts & Archives — Local tools built in sessions
Personal
Local
Pipeline to export X/Twitter bookmarks and import them into a Notion database. Includes a browser console script to scrape bookmarks, Python scripts to fetch full tweet data, and a Notion API manager for import/export. Plus a searchable HTML dashboard.
Browser console script (export_bookmarks_from_browser.js) to scrape bookmarks as JSON
Python pipeline: bookmarks.py → tweet_fetcher.py → notion_manager.py
Paul Graham tweet collector (pg_tweet_collector.js) — separate tool in same repo
Notion integration with full CRUD and categorization
HTML bookmarks dashboard (bookmarks.html) for local browsing
Personal
Local
Exported and organized version of the "garden of ideas" link collection from Notion (the same content that powers joaotome.org). Python script builds a browsable HTML page from the Notion block export.
build_html.py converts Notion export blocks into clean HTML
Organized, categorized link collection — "emot's garden of ideas"
Source data from Notion block export (Part-1)
Personal
Local
Python script to export all posts from a Bluesky account into JSON and Markdown. Used to archive @radar.cloudflare.com's 462 posts (July 2023 – March 2026). Data feeds into the Knowledge Dashboard.
fetch_bluesky_posts.py — exports any account's full post history
462 posts exported from @radar.cloudflare.com (2023-07 to 2026-03)
Outputs: JSON (raw) + Markdown (readable, with dates)
Personal
Demo
Portfolio design experiment — a Lewis Hamilton-themed template with animated canvas grid background, Playfair Display typography, and hero image layers. Built as a design prototype; not deployed.
Animated grid canvas background (script.js)
Playfair Display typography, hero image composition
Clean HTML/CSS/JS — no framework, no build step
WIP / Scaffolded — Not yet fully live
Personal
Not deployed
Real-time collaborative whiteboard — built with CF Durable Objects for persistent, consistent per-room state synced over WebSockets. Worker written, not deployed.
Durable Object (WhiteboardRoom) per room — single-writer consistent state
WebSocket-based real-time sync between all connected users
CF Org
Scaffold
Backend for the Randomness Playground's time capsule feature. Encrypts messages with tlock, stores in R2, polls via cron to unlock, sends email via Resend.
Timelock encryption via tlock-worker.crypto-team.workers.dev
Cron trigger every minute — checks if any capsule can be unlocked
Email notification via Resend API on unlock
Finding an audience — what to prioritize
thisweekinnet.com High potential
Already has 100+ episodes and a real, recurring audience via YouTube/podcasts. The site is agent-ready but lacks SEO fundamentals: no per-episode pages means Google and AI crawlers see one SPA blob. Individual episode URLs would instantly multiply indexable surface, give each episode a shareable link, and make llms-full.txt vastly richer. The content exists — it just needs routes.
Next move: Add /episodes/:slug pages. Biggest SEO win across all projects.
Ask Emot High potential
758 pieces, working RAG, live and fast. But zero discoverability — it's a standalone .workers.dev URL with no inbound links. Nobody will find it unless you send them the URL. Embedding it on joaotome.com (as /ask or a widget) and linking from seremot.com and thisweekinnet.com would give it three entry points. The product is done; distribution is the gap.
Next move: Embed on joaotome.com and link from all personal sites.
The Book of Lives (Memória) High potential
This is the most original and emotionally resonant project in the portfolio. The concept — a curated time capsule of a human life, designed to outlast the person — has no real competitor. The prototype exists, the questionnaire is designed, the app structure is scaffolded. The risk is it stays in prototype forever. A minimal launch (even just the questionnaire on a simple page) would test whether people actually fill it out.
Next move: Deploy the prototype publicly. Get 10 people to fill it out. Validate before building more.
seremot.com Medium — needs content
The Hugo site is live but has only 3 blog posts. The Agents playground and VizLab are interesting but underfilled. As a blog, it needs consistent publishing to build any audience. The infrastructure is fine — Hugo + CF Pages is fast and cheap. The gap is writing cadence. Even one post per month about Internet data, AI tooling, or Portuguese tech history would compound over time.
Next move: Commit to a publishing cadence. Cross-post from Substack or CF blog perspectives.
Harry Potter Covers Medium — niche but shareable
This is the kind of project that can go viral in the right context (Reddit's r/harrypotter, BookTok, Portuguese social media). The content is genuinely interesting — comparing cover art across 12 countries. The site is polished and live. The gap is distribution: it needs one well-placed share in a Harry Potter community.
Next move: Post to r/harrypotter, r/bookdesign, Harry Potter Facebook/Discord groups. Prepare a Portuguese version for PT media.
Randomness Playground Medium — waiting on domain
The product is finished and interactive. Once randomness.cloudflare.com is pointed to it, it becomes a canonical Cloudflare product page that will be linked from blog posts, docs, and talks about randomness/encryption. The audience is built-in (CF's existing traffic). The blocker is purely internal: get the domain pointed.
Next move: Internal request to point randomness.cloudflare.com custom domain.
Technology in the Age of Discoveries Low urgency — long-term
This is a book project, not a web product. The research is substantial (20 chapters planned, 2 drafted, extensive bibliography). There's no audience to "find" until it's published — but the research itself could be serialized as blog posts on seremot.com or Substack. Portuguese maritime technology is a niche but passionate audience (PT history buffs, maritime historians, Crowley readers).
Next move: Serialize 2-3 chapters as standalone essays on seremot.com. Test interest before committing to a full book.
Internal dashboards (Blog Analytics, HN Board, Socials) N/A — internal tools
These are internal tools behind Cloudflare Access. They don't need a public audience — they need internal adoption. The Blog Analytics and HN Board are already referenced by the blog team. The Socials Dashboard v2 is the most feature-complete but may need a champion on the social team to drive adoption. The value isn't traffic — it's whether the comms team uses them weekly.
Next move: Demo the Socials v2 dashboard to the social team. Get it into their weekly workflow.
What has been achieved
Personal presence & identity
Four personal sites — joaotome.com (portfolio), seremot.com (blog), joaotome.org (Notion garden), and ask-emot (AI assistant) — form a coherent web identity. Two creative projects — The Book of Lives (digital time capsule) and Technology in the Age of Discoveries (book research) — extend the identity into writing and ideas. Ask Emot is a full RAG system over 758 pieces of published writing, grounded and cited.
Show & content infrastructure (TWiN)
thisweekinnet.com went from a static page to an agent-ready web property: RFC 8288 Link headers, llms.txt, A2A agent card, MCP server card, and an Accept: text/markdown content negotiation layer — making it one of the first show sites built for AI crawler discoverability. Two companion Workers (episodes API + blog RSS proxy) serve as the data layer.
Internal analytics tooling (Cloudflare org)
Four internal dashboards on CF Pages: Blog Analytics (GA4, fixed 200x undercount bug), HN Board (live HN scores), Social Media Dashboard v2 (9 tabs, 7 platforms), plus two product mockups — Index of Trends (short-form data insights for Radar) and Radar Reports (HTML prototypes for Storm Kristin, Iran shutdown, DDoS). Full PRDs and roadmaps written for both.
Public educational & fun projects
Randomness Playground is a Cloudflare product page explaining cryptographic entropy through interactive lava lamps, Pong, Doom, and drand integration. Harry Potter Covers is a polished voting site across 12 international editions. Both are production-quality pages.
CF primitives used across projects
Workers (7), Pages (4), KV (2), D1 + Vectorize + Workers AI (ask-emot), Durable Objects (whiteboard — built, not deployed), R2 + cron (timecapsule — scaffolded). Plus 5 backend support Workers. Total: 17 projects across shipped sites, internal tools, product mockups, and creative writing.
Suggested next additions
Ask Emot — embed on joaotome.com
ask-emot is live as a standalone Worker URL but not linked from joaotome.com. An /ask route or a sidebar widget on the portfolio would close the loop and make it discoverable to real visitors.
Integration
Socials Dashboard — live data pipeline
The v2 dashboard is the most feature-complete internal tool but runs on static embedded data. A scheduled Worker (cron) pulling from the social analytics export and writing to KV or R2 would make it self-updating.
Data pipeline
TWiN — episode-level pages
thisweekinnet.com is a SPA with no indexable per-episode URLs. Individual episode pages would improve SEO, give AI crawlers direct access to episode content, and make the llms-full.txt much richer.
SEO / Agent
Deploy the Collaborative Whiteboard
The Worker + Durable Objects code is written and working locally. One wrangler deploy to go live — worth finishing as a real-time Durable Objects demo in the portfolio.
Easy win
Blog Analytics — scheduled CSV ingestion
Currently requires manually overlaying new CSVs. A Worker with a cron trigger could watch an R2 bucket for new exports and auto-merge them — preserving the v1 base rule automatically.
Automation
randomness.cloudflare.com — finish the deploy
The Pages site is live and complete. The only remaining step is pointing the randomness.cloudflare.com custom domain to it and wiring the timecapsule Worker (D1 database ID). Configuration tasks, not code.
Easy win