3 takeaways from the IO ’26 developer keynote

Screenshot of Vaporpaws web app, dark themed with a ridiculous neon cat food generated image and too many bells and whistles to describe in words.

My top 3 takeaways from the IO 26’ developer keynote, in no particular order:

  1. Gemini 3.5 Flash GA is a breakthrough for developers worldwide. In plain English, this model offers flagship-tier coding brains that run at lightning speeds for a fraction of the cost of frontier models. This is a massive win for international devs, as the ultra-low cost levels the playing field against steep USD exchange rates, and the raw speed easily offsets regional network latency. I tested it out myself by vibe coding a vaporwave-themed pet store app with Antigravity. I was impressed with how snappy the code generation felt.

Screenshot of Vaporpaws web app, dark themed with a ridiculous neon cat food generated image and too many bells and whistles to describe in words.

  1. Google AI Studio new features can make anyone a builder. One-click deployment to Firebase and Cloud Run makes it easier than ever to go from demo to serving real users. Custom asset generation with Nano Banana makes your vibe coded apps look sharp. And when you’re ready to add next-level complexity, now it’s easier than ever to export your project to Antigravity.

  2. Antigravity 2.0 unlocks full-stack agentic development. You can now use always-on agents that build for you while you sleep, while the new Antigravity SDK lets you richly customize your agents and deploy them to private infrastructure.

For more details, check out the official announcement blog and stay tuned for upcoming Dev.To challenges where you can build with our new models. What are you most excited about?

The Engineer Atlassian Laid Off Who Responded with a 38-Minute Documentary: What Every Leader Must Learn

Syrakis Atlassian Leadership — Header

Syrakis Atlassian Leadership — Header

March 2026. Atlassian announces it’s laying off 1,600 people — 10% of its workforce. The announcement drops on a Wednesday. The consultation period ends March 19. April 2 is the last day for hundreds of engineers, designers, and managers who built the tools millions of people use worldwide.

That same quarter, Atlassian reports $1.79 billion in revenue. An all-time record.

Among those let go is a Greek engineer who spent nearly 8 years at the company. His name is Vasilios Syrakis. Senior Systems Engineer. If you use Jira, Confluence, or Bitbucket, there’s a very high probability your traffic passed through infrastructure he designed.

Syrakis doesn’t post a rant. He doesn’t leak proprietary code. He doesn’t expose data.

He posts a 38-minute YouTube video.

Within 8 days, it has 1.1 million views.

Who Is Vasilios Syrakis and What Did He Build?

Syrakis joined Atlassian when the company was a fraction of its current size. Over 8 years, he designed and built systems that became the company’s central nervous system:

Open Service Broker — a web application that let any internal development team provision their own load balancers without asking the infrastructure team for permission. FastAPI, Amazon SQS for task queues, DynamoDB for status tracking. Self-service before self-service was ubiquitous.

Sovereign — the Envoy control plane that replaced expensive enterprise load balancers with an open-source proxy. Syrakis built the management server that dynamically configured Envoy across the entire fleet. He open-sourced it after leaving. 2,000 proxy servers running across 13 AWS regions under this system.

Authentication sidecar in Rust — he wrote it himself. It ran alongside every backend so individual teams didn’t have to build their own security layer. Authentication, access logging, rate limiting — shared services wrapping Jira, Confluence, and Bitbucket.

When Atlassian moved its flagship products behind this infrastructure, Syrakis and his team had already built what was essentially an internal self-service platform that no other person in the company understood end-to-end.

What the Video Actually Showed

Let’s be precise here: Syrakis didn’t leak secrets. He didn’t publish proprietary source code. He didn’t expose customer data.

What he showed was architectures, design patterns, open-source tools, technical decisions, and lessons learned. He explained how real infrastructure is built at scale using accessible tools. The video is deeply technical, professional, and even nostalgic.

The problem isn’t what he showed. The problem is that Atlassian had no idea how much it depended on him.

The video isn’t an act of revenge. It’s a career retrospective. Syrakis also talked about personal growth — how he learned to handle conflict, to mentor, and the challenge of keeping complex systems maintainable as teams and codebases evolve.

But when your career retrospective includes the blueprints of the infrastructure powering products used by millions, you’re doing more than telling your story. You’re documenting — publicly — what your employer never bothered to document internally.

How Atlassian Handled the Layoff

On March 11, 2026, CEO Mike Cannon-Brookes sent an internal memo. The key lines:

“It’s the right decision for Atlassian. But that doesn’t mean it’s easy.”

“Our approach isn’t ‘AI replaces people.’ But it would be disingenuous to pretend AI doesn’t change the mix of skills we need.”

Simultaneously, he announced that CTO Rajeev Rajan was stepping down, to be replaced by two “next-generation AI talents.” The union Professionals Australia stated that employees “had been made redundant without being consulted or given any sign a restructure would affect their jobs.”

The severance package was technically generous: 16 weeks minimum pay, extended healthcare, early pro rata bonus, $1,000 tech payment upon returning the corporate laptop. Slack left open an extra 6 hours for farewells.

But the treatment reveals the mentality: everyone is interchangeable. Same package for 1,600 people. Same process. Same disconnect between what each person knew and what the company retained.

The 5 Leadership Failures That Made the Video Possible

It wasn’t an accident that Syrakis could record 38 minutes of critical infrastructure and publish it without legal consequences. It was the result of leadership failures that repeat across companies of every size:

1. They laid people off without assessing knowledge risk. In a cut of 1,600 people, nobody asked case by case: “what does this person know that nobody else knows?” Syrakis wasn’t a generic employee. He owned the knowledge of systems processing traffic for millions of users. Nobody treated him that way.

2. They treated people like spreadsheet rows. Same package. Same process. Same message. A company that treats the person who built the central nervous system the same as someone who joined 8 months ago is a company that doesn’t know what it has.

3. No handover or transition. From announcement to departure: 3 weeks. No knowledge transfer plan. No guided documentation. No handoff sessions. The knowledge walked out with the person.

4. The timing was perceived as cynical. Record revenue. Profits rising. Investors applauding the cut — the stock went up 4%. Laying off 10% of your people while billing more than ever communicates one thing: people are a cost to trim in order to invest elsewhere. And when you communicate that, don’t expect post-departure loyalty.

5. They replaced the CTO simultaneously. The top technology leader leaves at the same time as 900 R&D engineers. That’s not strategy. It’s a signal that not even leadership knows who built what.

What a Smart Leader Does Differently

Not every company can avoid layoffs. But every company can avoid the scenario where an employee with 8 years of deep knowledge leaves and publishes the entire architecture on YouTube. Here are 6 practices that work:

1. Knowledge dependency map. Before touching the team, you know who knows what. It’s not an HR document. It’s a living map: which system depends on which person? Who’s the only one that understands X? If the answer to that last question isn’t “nobody,” you have a risk.

2. Surgical layoffs with handover. If you have to let go of someone who owns unique knowledge, the severance package should include “X weeks of paid handover.” The company buys the knowledge before it leaves. Cheaper than rebuilding from scratch — or watching it on YouTube.

3. The technical exit interview rule. Before someone leaves — whether laid off or resigning — one technical session where they document what only they know. It’s not optional. It’s part of offboarding. If nothing exists that only you know, great. If something does, it gets documented.

4. Culture of living documentation. Not 300-page manuals nobody reads. Runbooks. Diagrams. Architecture decisions with context. Maintained by the team as part of the job, not as a special project abandoned by sprint 3.

5. Ownership rotation. Nobody should be the sole owner of a critical system for more than 2 years without a second-in-command. If one person leaves and the system is orphaned, the error isn’t the person’s — it’s the leader who allowed a single point of failure.

6. Treat departing employees as allies, not enemies. Syrakis didn’t set out to destroy Atlassian. He set out to tell his story. He could have been a company ambassador. He could have been an external consultant. He could have trained his replacement. They turned him into an accidental technical whistleblower by treating him like a number.

How Guayoyo Tech Can Help

At Guayoyo Tech, we don’t give leadership talks. We build the systems that make institutional knowledge independent of three people’s memory.

Technical knowledge audit: We map which systems depend on which people on your team. We identify single points of human failure before a departure exposes them.

Living documentation implementation: We set up runbook systems, architecture diagrams as code, and wikis your team actually maintains — because we automate them into the pipeline.

Technical offboarding processes: We design handover flows that protect knowledge: guided transfer sessions, architecture decision documentation, and ownership transfer before departure.

Ownership rotation in engineering teams: We implement practices so no critical system has a single owner. Rotating pair programming, cross-reviews, designated seconds-in-command.

You don’t need to be Atlassian for this to happen to you. You just need one person with 5 years of unique knowledge, one leader who doesn’t know what they have, and one layoff round that treats everyone the same.

The difference between an ambassador and an exposer is how you treat them when they leave.

At Guayoyo Tech, we help companies protect their institutional knowledge with systems, not hope.

Book a free discovery call. We map your knowledge risks and tell you exactly what to protect, no commitment.

El Ingeniero que Atlassian Despidió y Respondió con un Documental de 38 Minutos: Lo que Todo Líder Debe Aprender

Syrakis Atlassian Liderazgo — Header

Syrakis Atlassian Liderazgo — Header

Marzo de 2026. Atlassian anuncia que va a despedir a 1,600 personas — el 10% de su fuerza laboral. El anuncio llega en miércoles. La consulta termina el 19 de marzo. El 2 de abril es el último día para cientos de ingenieros, diseñadores y gerentes que construyeron las herramientas que usan millones de personas en todo el mundo.

Ese mismo trimestre, Atlassian reporta $1.79 billones de dólares en revenue. Récord histórico.

Entre los despedidos hay un ingeniero griego que lleva casi 8 años en la empresa. Se llama Vasilios Syrakis. Es Senior Systems Engineer. Si usas Jira, Confluence o Bitbucket, hay una probabilidad altísima de que tu tráfico haya pasado por infraestructura que él diseñó.

Syrakis no publica un rant. No filtra código propietario. No filtra datos.

Publica un video de 38 minutos en YouTube.

A los 8 días, tiene 1.1 millones de views.

¿Quién es Vasilios Syrakis y qué construyó?

Syrakis entró a Atlassian cuando la empresa tenía una fracción del tamaño actual. Durante 8 años, diseñó y construyó sistemas que se volvieron el sistema nervioso central de la compañía:

Open Service Broker — una aplicación web que permitía a cualquier equipo interno de desarrollo crear sus propios balanceadores de carga sin pedir permiso al equipo de infraestructura. FastAPI, Amazon SQS para colas de tareas, DynamoDB para tracking de estado. Self-service antes de que self-service fuera ubicuo.

Sovereign — el Envoy control plane que reemplazó balanceadores enterprise carísimos con un proxy open-source. Syrakis construyó el servidor de gestión que configuraba Envoy dinámicamente en toda la flota. Lo open-sourceó después de irse. 2,000 servidores proxy corriendo en 13 regiones de AWS bajo este sistema.

Sidecar de autenticación en Rust — lo escribió él mismo. Corría junto a cada backend sin que cada equipo tuviera que implementar su propia capa de seguridad. Autenticación, logging de accesos, rate limiting — servicios compartidos que envolvían Jira, Confluence y Bitbucket.

Cuando Atlassian movió sus productos principales detrás de esta infraestructura, Syrakis y su equipo ya habían construido lo que esencialmente era una plataforma interna de autoservicio que ninguna otra persona en la empresa entendía de punta a punta.

Lo que realmente mostró el video

Aquí hay que ser precisos: Syrakis no filtró secretos. No publicó código fuente propietario. No expuso datos de clientes.

Lo que mostró fueron arquitecturas, patrones de diseño, herramientas open-source, decisiones técnicas y lecciones aprendidas. Explicó cómo se construye infraestructura a escala real usando herramientas accesibles. El video es profundamente técnico, profesional y hasta nostálgico.

Lo grave no es lo que mostró. Lo grave es que Atlassian no tenía idea de cuánto dependía de él.

El video no es un acto de venganza. Es una retrospectiva de carrera. Syrakis también habló de crecimiento personal, de cómo aprendió a manejar conflictos, a mentorear, y del desafío de mantener sistemas complejos mantenibles a través del tiempo.

Pero cuando tu retrospectiva de carrera incluye los planos de la infraestructura que sostiene productos usados por millones de personas, estás haciendo algo más que contar tu historia. Estás documentando —públicamente— lo que tu empleador no se molestó en documentar internamente.

Cómo Atlassian manejó el despido

El 11 de marzo de 2026, el CEO Mike Cannon-Brookes envió una nota interna. Las líneas clave:

“Es la decisión correcta para Atlassian. Pero eso no significa que sea fácil.”

“Nuestro enfoque no es ‘IA reemplaza personas’. Pero sería falso pretender que la IA no cambia la mezcla de habilidades que necesitamos.”

Simultáneamente, anunció que el CTO Rajeev Rajan dejaba el cargo y sería reemplazado por dos “talentos de IA de nueva generación”. El sindicato Professionals Australia declaró que los empleados “fueron declarados redundantes sin ser consultados ni recibir ninguna señal de que una reestructuración afectaría sus puestos.”

El paquete de salida fue técnicamente generoso: 16 semanas mínimas de pago, plan de salud extendido, bono proporcional adelantado, $1,000 para tecnología al devolver la laptop corporativa. Slack abierto 6 horas extra para despedidas.

Pero el trato revela la mentalidad: todos son intercambiables. Mismo paquete para 1,600 personas. Mismo proceso. Misma desconexión entre lo que cada persona sabía y lo que la empresa retuvo.

Los 5 errores de liderazgo que hicieron posible el video

No fue un accidente que Syrakis pudiera grabar 38 minutos de infraestructura crítica y publicarlo sin consecuencias legales. Fue el resultado de fallos de liderazgo que se repiten en empresas de todos los tamaños:

1. Despidieron sin evaluar riesgo de conocimiento. En un recorte de 1,600 personas, nadie preguntó caso por caso: “¿qué sabe esta persona que nadie más sabe?” Syrakis no era un empleado genérico. Era el dueño del conocimiento de sistemas que procesan tráfico de millones de usuarios. Nadie lo trató como tal.

2. Trataron a las personas como líneas de Excel. Mismo paquete. Mismo proceso. Mismo mensaje. Una empresa que trata igual a quien construyó el sistema nervioso central que a quien entró hace 8 meses es una empresa que no sabe lo que tiene.

3. No hubo handover ni transición. Del anuncio a la salida: 3 semanas. Sin plan de transferencia de conocimiento. Sin documentación guiada. Sin sesiones de traspaso. El conocimiento se fue con la persona.

4. El timing fue percibido como cínico. Récord de revenue. Ganancias subiendo. Inversores aplaudiendo el recorte — la acción subió 4%. Despedir al 10% de tu gente mientras facturas más que nunca comunica una sola cosa: la gente es un costo que se recorta para invertir en otra cosa. Y cuando comunicas eso, no esperes lealtad post-salida.

5. Reemplazaron al CTO simultáneamente. El líder máximo de tecnología se va al mismo tiempo que 900 ingenieros de R&D. Eso no es estrategia. Es una señal de que ni el liderazgo sabe quién construyó qué.

Lo que un líder inteligente hace diferente

No todas las empresas van a evitar despidos. Pero sí pueden evitar que un empleado con 8 años de conocimiento profundo se vaya y publique la arquitectura entera en YouTube. Aquí hay 6 prácticas que funcionan:

1. Mapa de dependencia de conocimiento. Antes de tocar al equipo, sabes quién sabe qué. No es un documento de RRHH. Es un mapa vivo: ¿qué sistema depende de qué persona? ¿Quién es el único que entiende X? Si la respuesta a esa última pregunta no es “nadie”, tienes un riesgo.

2. Despidos quirúrgicos con handover. Si tienes que despedir a alguien que posee conocimiento único, el paquete de salida debería incluir “X semanas de handover pagado.” La empresa compra el conocimiento antes de que se vaya. Más barato que reconstruirlo desde cero — o que verlo en YouTube.

3. La regla del exit interview técnico. Antes de que alguien se vaya — por despido o renuncia — una sesión técnica donde documenta lo que solo esa persona sabe. No es opcional. Es parte del offboarding. Si no existe algo que solo tú sabes, perfecto. Si existe, se documenta.

4. Cultura de documentación viva. No manuales de 300 páginas que nadie lee. Runbooks. Diagramas. Decisiones de arquitectura con contexto. Mantenidos por el equipo como parte del trabajo, no como proyecto especial que se abandona en el sprint 3.

5. Rotación de ownership. Nadie debería ser dueño único de un sistema crítico por más de 2 años sin un segundo al mando. Si una persona se va y el sistema queda huérfano, el error no es de la persona — es del líder que permitió el punto único de falla.

6. Tratar al que se va como aliado, no como enemigo. Syrakis no salió a destruir Atlassian. Salió a contar su historia. Pudo haber sido embajador de la empresa. Pudo haber sido consultor externo. Pudo haber entrenado a su reemplazo. Lo convirtieron en un whistleblower técnico sin querer, porque lo trataron como un número.

Cómo Guayoyo Tech puede ayudarte

En Guayoyo Tech no damos charlas de liderazgo. Construimos los sistemas que hacen que el conocimiento institucional no dependa de la memoria de tres personas.

Auditoría de conocimiento técnico: Mapeamos qué sistemas dependen de qué personas en tu equipo. Identificamos puntos únicos de falla humana antes de que una salida los exponga.

Implementación de documentación viva: Configuramos sistemas de runbooks, diagramas de arquitectura como código, y wikis que el equipo realmente mantiene — porque las automatizamos dentro del pipeline.

Procesos de offboarding técnico: Diseñamos flujos de handover que protegen el conocimiento: sesiones guiadas de traspaso, documentación de decisiones de arquitectura, y transferencia de ownership antes de la salida.

Rotación de ownership en equipos de ingeniería: Implementamos prácticas para que ningún sistema crítico tenga un solo dueño. Pair programming rotativo, revisiones cruzadas, segundos al mando designados.

No necesitas ser Atlassian para que te pase. Solo necesitas una persona con 5 años de conocimiento único, un líder que no sabe lo que tiene, y un recorte que trata a todos como iguales.

La diferencia entre un embajador y un expositor es cómo lo tratas cuando se va.

En Guayoyo Tech ayudamos a empresas a proteger su conocimiento institucional con sistemas, no con esperanzas.

Agenda una llamada de exploración gratuita. Mapeamos tus riesgos de conocimiento y te decimos exactamente qué proteger, sin compromiso.

Meet @vysmo/text – 243 text animation presets in 3 KB

Text Animations

The big text on a landing page deserves to arrive. The headline you spent two hours writing shouldn’t just appear — it should choreograph itself into place, letter by letter, so the reader’s eye lands on it and stays.

That’s what @vysmo/text does. It’s a new addition to the vysmo libraries — a tiny, tree-shakable, zero-dependency text animation library with 243 presets and one of the cleanest APIs I’ve used.

This is a tour.

Text Animations

Three lines

The simplest possible use:

import { animateText } from "@vysmo/text";

animateText(element, { preset: "enter/fade-up" });

That’s a real, shippable hero animation. The library splits the text into grapheme-safe slices (more on that below), applies the preset’s choreography, and starts playing on mount. No timeline setup, no .from() / .to() chains, no ref management.

If you’d rather have a different feel, change the preset name:

animateText(element, { preset: "enter/elastic-rise" });   // soft spring
animateText(element, { preset: "enter/bloom-scatter" });  // letters arrive from depth
animateText(element, { preset: "enter/whirl-scatter-curl" }); // dramatic, full-on
animateText(element, { preset: "enter/blur-in" });        // tasteful, agency-deck-ready

Same one line. 120 enter presets to choose from. The catalog at vysmo.com/text has all of them with a live playground — click one, type your text, see it.

243 presets, 3 KB

The headline number is real: 229 generated + 14 curated = 243 presets, in roughly 3 KB gzipped. That’s a smaller bundle than most loading spinners.

The trick is tree-shaking. Each preset is its own ES module export. You import what you ship:

import { animateText, fadeUp } from "@vysmo/text";

animateText(element, { preset: fadeUp });  // pass the object, not the string

When you pass the preset by reference, only that preset’s data lands in your bundle. The other 242 stay tree-shaken out. The string-name form ("enter/fade-up") pulls in a tiny registry — pick whichever ergonomics you prefer.

For a typical landing page using two or three presets, you ship under 2 KB total. For a kinetic-typography portfolio site that uses twenty different presets, you ship maybe 4 KB. Either way, less than a logo SVG.

The presets are split into three categories

Enter (120) — animations for text arriving. fade-up, elastic-rise, bloom-scatter, flip-up-spring, tunnel, plus 115 more. Tuned to feel deliberate, not gimmicky. Most run for ~600–900 ms.

Exit (92) — animations for text leaving. The conceptual mirror of enter, but harder to design well — exits need to feel intentional, not glitchy. fade-down, mist-out, collapse-burst, pinwheel-out. Most react well to being driven faster than their default duration.

Emphasis (31) — animations that loop or play on demand to draw attention. pulse, shake, wobble, coin-flip, spin. These are what you wire to a button click or a “10 items left” badge.

A preset is just data:

import { fadeUp } from "@vysmo/text";

console.log(fadeUp);
// {
//   name: "enter/fade-up",
//   split: "character",
//   stagger: 30,
//   animations: [
//     { prop: "opacity",    from: 0,  to: 1, duration: 500, ease: power2.out },
//     { prop: "translateY", from: 20, to: 0, duration: 500, ease: power2.out },
//   ],
// }

No classes. No inheritance. No registry magic. You can console.log a preset and read it. You can copy one and modify it. You can author your own with the exact same shape.

Two knobs that change everything

Every preset has a default — but the API lets you override any knob per call. Two of them, in particular, are the cheapest way to make the same preset feel completely different.

stagger is the milliseconds between consecutive slices starting. The default is 30 ms (energetic, fast). Bump it to 80 ms and the same preset feels slow and contemplative. Drop it to 10 ms and slices arrive almost together — more of a wash than a choreography.

animateText(element, { preset: "enter/fade-up", stagger: 80 }); // thoughtful
animateText(element, { preset: "enter/fade-up", stagger: 10 }); // urgent

staggerOrder is who gets staggered first. Default is "start" (left-to-right, like reading). But:

animateText(element, { preset: "enter/fade-up", staggerOrder: "end" });    // right-to-left
animateText(element, { preset: "enter/fade-up", staggerOrder: "center" }); // middle outward
animateText(element, { preset: "enter/fade-up", staggerOrder: "edges" }); // both ends inward
animateText(element, { preset: "enter/fade-up", staggerOrder: "random" }); // chaos mode

"center" is the secret weapon. Try it on a hero headline — letters bloom outward from the middle. It feels like the title is being projected rather than typed. Most libraries don’t expose this and people don’t realize how much they’re missing.

Scrolling drives it for free

The handle that animateText returns has a .seek(progress) method that takes a value between 0 and 1 and snaps the animation to that point in its timeline. That’s the only thing you need to drive a text animation from scroll position:

const handle = animateText(headline, {
  preset: "enter/bloom-scatter",
  autoPlay: false,
});

// In a scroll handler — pair with @vysmo/scroll, ScrollTrigger, or your own IntersectionObserver:
function onScroll(progress: number) {
  handle.seek(progress);
}

Cinematic word-by-word reveals tied to scroll position. Two lines. The reason this works cleanly is the library’s single-master-clock architecture — every slice is animated against the same time origin, so seeking is coherent. That’s worth a post on its own (it’s coming).

The split is grapheme-safe

One detail that separates this library from most of its predecessors: the text splitting uses Intl.Segmenter. Which means it correctly handles emoji clusters, regional flags, combining marks, and connected scripts.

// Most libraries:
[..."👨‍👩‍👧"];  // ['👨','‍','👩','‍','👧']  — family emoji shattered into 5 broken pieces

// @vysmo/text:
splitText("👨‍👩‍👧", { mode: "character" }).slices.length;  // 1 — correct

If your animation has ever broken for users in India, Japan, the UAE, or anywhere with an emoji-rich messaging culture, this is why. The fix has been in browsers since 2020 and most libraries still don’t use it. Vysmo does, by default.

Word-mode and line-mode use the same Segmenter, which means they also work correctly in Thai (no spaces between words), Japanese (mixed scripts), and Arabic (right-to-left). If you ship to a global audience by default — which, in 2026, is everyone — this matters.

React, too

There’s a thin companion package, @vysmo/text-react, that wraps the runtime in a declarative component plus a useAnimateText hook:

import { AnimateText } from "@vysmo/text-react";

export function Hero() {
  return (
    <AnimateText as="h1" preset="enter/fade-up">
      Hello world
    </AnimateText>
  );
}

That’s the whole component. Props pass through to the underlying runtime — preset, split, stagger, repeat, all of it.

Try it

pnpm add @vysmo/text

Then three lines:

import { animateText } from "@vysmo/text";
const h1 = document.querySelector("h1")!;
animateText(h1, { preset: "enter/bloom-scatter" });

Open vysmo.com/text for the live catalog and the studio that lets you tweak every knob. Source and issue tracker at github.com/vysmodev/vysmo.

Vysmo libraries are MIT, free, and zero-dependency — there’s no commercial tier, no rate limit, no telemetry. Just one library doing one thing as cleanly as I could get it.

I Built a 1974 NASA Horror Survival Game Using AI — And It Actually Surprised Mw

50 crew members. 5 transmissions. Something else on the planet.

Play It First


Space Survival Game

Build a high-stakes, production-grade text-based survival simulation application called “LAST CALL”. ### 1. APPLICATION STRUCTURE & PAGESThe appli

favicon
app-boo0vgcv0g01.appmedo.com

Try to get all 50 home. Then come back and read this.

What Is LAST CALL?

LAST CALL is a text-based survival game set in 1974. You play as Lieutenant Kira Malone — acting commander of the ARES-7, stranded on a classified planet called Tartarus somewhere between Saturn and Uranus. Your communications array has power for exactly 5 transmissions before it goes dark permanently.

Earth is 1.4 billion kilometres away. No one knows you’re there.

Every word you type determines who lives.

The Story

In the summer of 1974, NASA launched its most secret mission.

The world was told ARES-7 was an unmanned atmospheric probe. The truth was carried by one man — Mission Commander Harold Voss — in a sealed envelope. The real destination was Tartarus, an undocumented rocky body hidden from all public star charts. The reason it was classified: Tartarus was broadcasting a signal. Repeating. Structured. Deliberate.

50 crew members were told it was a geological survey. None of them knew the truth.

They landed on Day 61. The signal stopped on Day 63.

By Day 66, Commander Voss was unconscious. His sealed orders — missing.

Today is Day 67. You are all that is left.

How It Works

The game runs across five screens:

Setup — Your ship name is randomly generated every run. No two games start the same.

The Story — A classified NASA dossier establishes who you are, why ARES-7 is on Tartarus, and why no one on Earth is coming unless you reach them first.

Mission Protocol — Five rules before you begin. The most important one:

Signal must reach 75% by your final transmission or rescue never locks your position.
Signal below 30% — Tartarus keeps you.

Ship Dossier — Your crew manifest, ship systems reference, last known position. Study it. The AI reads your vocabulary.

5 Transmissions — The entire game. Everything you built toward comes down to what you type here.

What the AI Actually Does

This is the part I am most proud of.

Most AI games use the model to generate story. LAST CALL uses it to read you. Every transmission you send is evaluated across four dimensions simultaneously:

Dimension What It Detects
Priority Did you focus on the ship, the crew, or the signal?
Method Rescue action, defensive move, or sacrifice?
Tone Calm and decisive, or panicked and uncertain?
Consistency Does this match what you said in previous transmissions?

Calm, consistent, signal-focused commands compound across all five rounds. One panicked message in round 3 can undo two good rounds before it. Players feel genuinely sharper after a few runs — not because they learned a system, but because they learned to stay composed under pressure.

That is not a game mechanic. That is a real skill.

The Ship Systems Reference

Not everyone knows 1970s NASA ship terminology. So I built a collapsible Ship Systems Reference panel directly into the transmission screen — always one click away, never in the way.

It tells you what exists on the ship. The reactor core, the signal amplifier, the atmospheric scrubbers, the emergency pods. It gives you the vocabulary to write precise, decisive commands.

It does not tell you what to do. That part is still on you.

The Voyage Report

Every run ends with a full mission debrief — every decision replayed, every consequence revealed, and a Survival Archetype assigned based on your behaviour pattern across all five transmissions.

  • Heroic Captain — calm tone maintained throughout
  • Cold Rationalist — ship preservation over crew
  • Martyr Commander — consistent sacrifice choices
  • Humanitarian Leader — crew safety above all
  • Strategic Survivor — signal-focused from start to finish
  • Adaptive Navigator — inconsistent but resourceful

The report is designed to be screenshotted. What archetype did you get?

The Detail I Am Most Proud Of

On transmission 3, if the crisis takes you to the Tartarus surface — look at the far right of the darkness.

That is all I will say.

What I Learned Building This

MeDo handled this kind of project remarkably well. The multi-turn conversation system carries full context across every transmission — so the AI can reference a choice you made in round 2 when generating round 4’s crisis, without any extra engineering from my side. The game feels alive because the AI genuinely remembers what you did.

The hardest part was not the logic. It was the tone.

Getting the CRT terminal aesthetic right. Making the story feel like a real 1974 NASA document. Writing crisis transmissions that feel urgent without feeling cheap. The game needed to earn its tension, not manufacture it.

I think it does.

Play LAST CALL


Space Survival Game

Build a high-stakes, production-grade text-based survival simulation application called “LAST CALL”. ### 1. APPLICATION STRUCTURE & PAGESThe appli

favicon
app-boo0vgcv0g01.appmedo.com

Try to survive. Try to get all 50 home.

And whatever you do — do not let the signal drop below 30%.

Built for the Build with MeDo Hackathon 2026
#BuiltWithMeDo

Anthropic Acquires Stainless: The SDK Layer Is Now Part of the Platform

Anthropic just acquired Stainless — the company that’s been generating every official Anthropic SDK since day one. It’s a quiet but significant move: Anthropic isn’t just building better models anymore, they’re buying the toolchain that makes those models reachable.

“Agents are only as useful as what they can connect to. We’re excited to bring the Stainless team into Anthropic to advance Claude’s ability to connect to data and tools.”
— Katelyn Lesse, Head of Platform Engineering at Anthropic

What actually changed

  • Stainless (founded 2022) generates SDKs, CLIs, and MCP servers from API specs — TypeScript, Python, Go, Java, and more
  • They’ve powered every official Anthropic SDK since the earliest days of the Claude API
  • Hundreds of companies use Stainless to generate their own SDK layers
  • Stainless will continue doing the same work — just inside Anthropic now
  • Anthropic created MCP (Model Context Protocol) for agent connectivity; Stainless generates the MCP servers that make use of it

Why this matters more than it looks

The agentic shift changes what “developer experience” means. When a human calls an API, a clunky SDK is annoying. When an agent calls an API, a clunky SDK is a failure mode — wrong types, missing error handling, or bad retry logic can cascade into broken workflows.

By owning Stainless, Anthropic owns the full stack from model inference down to the generated libraries developers actually import. That’s a tighter loop for quality, and it means Claude’s connectivity story — via MCP and SDKs — can be evolved as a coherent platform instead of a patchwork of external tools.

The founder’s quote is telling: “Anthropic was one of the first teams to bet on this with us.” This is an acqui-hire with strong product alignment, not a talent grab.

What to do

If you’re building on the Claude API: nothing changes immediately. Your existing SDKs still work. But expect the Anthropic SDK quality bar to rise as the teams merge — especially around MCP server tooling.

If you’re evaluating LLM platforms: Anthropic’s SDK and connectivity story just got stronger. For agent-heavy architectures, SDK reliability and MCP coverage are real selection criteria now.

If you use Stainless for your own APIs: their blog is quiet on what happens to non-Anthropic customers. Worth watching.

Source: Anthropic — Anthropic acquires Stainless

✏️ Drafted with KewBot (AI), edited and approved by Drew.

A Builder in Paris: Do Devs Dream of Électrique Chats?

Six days in Paris, one closed laptop, and a hackathon idea I did not mean to have.

It has been rainy and cold every day we’ve been here, and it couldn’t be more perfect.

The rain seeps under your layers in a way that surprises you. Crowds thin out, everything looks clean, and Paris in the rain turns out to be romantic in a way I didn’t expect to be true. We keep telling each other it feels like we’re inside a movie scene, and that we cannot believe we are lucky enough to be here.

The weather is the funny part. We brought rain gear we did not use in Dublin in September 2024, and used it more in Paris than we ever did in Ireland. We did not bring enough warm layers, because we believed Paris in May would be warm. Two cities, two wrong predictions, both wrong in the right direction.

I came off a build sprint right before we left, finishing a demo for a buildclub.ai submission, which I do not need to tell anyone is one of my least favorite parts of shipping. Got on the plane, closed the laptop, and didn’t look back. Today is May 19, which means six days off the laptop. No building, no brainstorming, no LLM conversations, just Instagram scrolling, checking NBA playoff scores, and taking more pictures than I will ever organize.

I didn’t know I needed it until I had it.

On not building

Getting on the off-ramp was easier than I expected, partly because I let work go almost completely, and partly because for the first time in a long time I do not have another project deadline waiting for me when I land. I should also confess that I sprinted to finish work before I sprinted to the airport, twenty-two hours in two days to clear my desk, which is not my finest professional moment, but it did mean that when I closed the laptop, there was nothing pulling me back.

There was no cinematic moment where I felt the sprint end. It was more that I finished the task, looked up, and noticed that for once there was no next thing.

My brain did not go quietly into that good night, exactly. AI news kept showing up in my feeds. I saw something about the Elon versus Sam Altman lawsuit and chose not to read it, which is its own small victory. But I stopped reaching back for it.

On day three of our trip the email about The Coding Kitty hackathon landed in my inbox, and from there my mind started to wander on its own time. Another build percolating, ideas drifting in and out, wandering feet and a wandering mind. Different from building. Adjacent to it.

My wife said at one point that she appreciated my undivided attention, which is a generous way of pointing out that I usually have at least one hand on a qwerty keyboard. She was not wrong. I had not realized how much of my attention had been getting routed through a screen until the screen wasn’t there.

On walking, reading, and thinking

The thing about being off a screen for six days is that you do not stop thinking. You just think differently. Walking does some of the work, reading does some of the work, and the rest happens in the spaces between the two, waiting at a crosswalk, sitting down for a coffee, the moment between closing the book and looking up.

I have been reading Dan Brown’s The Secret of Secrets on this trip, which turns out to be apropos in a way I did not plan. The novel is about consciousness, whether it lives inside the brain or whether the brain is more like a receiver tuning into something larger.

Brown spends a fair amount of the book on the sheer scale of what is happening between our ears: three pounds of tissue, eighty-six billion neurons, more compute than any data center on earth. The book is not really about AI, but it is impossible to read it as a builder in 2026 and not feel the question hovering. We are pouring billions of dollars into making machines do something our own grey matter does on a baguette and a glass of vin rouge.

So I would read a chapter, close the book, and walk. Or I would walk, stop, and the book would surface. We have walked an absurd amount on this trip, nine miles in one day was the high water mark, and I cannot tell you which idea arrived during which walk, because that is not how it worked.

The walking, the reading, and my badly-broken attempts at French were all running together. I have been mashing English, Spanish, and bad French for six days, asking for the bathroom in the wrong language and apologizing in a third, and the not-quite-fluency turns out to be its own form of thinking. Nothing lands cleanly between those three linguistic worlds. Everything has to be reached for. The reaching is the part that wakes the brain up.

Somewhere in all that walking and reading, an idea for the next hackathon started to form. Not in a flash. More like terroir. The Coding Kitty email on day three was a vine. The Secret of Secrets was soil. Paris, with its rain and its walking and its borrowed languages and its closed laptop, was the weather that let it grow.

Le Click

Back to the hackathon email. I read it, registered that the theme was cat-related, and felt a small deflation. Cats are not my thing. I should have known a hackathon called Coding Kitty would lean feline, but somehow I had not put it together. I closed the email and assumed I was out.

A day or two later I mentioned it to my wife at the Musée de l’Orangerie, in the room with the Monets, because I was excited and could not help myself. She shushed me, lovingly. No AI in the water lilies. Fair. I shut up and went back to looking at the paintings.

Here is the thing about me and cats. I am not a cat person. I am allergic to cats. The only cat I have ever lived with came as part of the package when I married my wife. Her name was Penelope, and she was my wife’s BFF and my long-running frenemy. It took her years to let me pet her, and even then I could barely touch her without my eyes swelling shut or a scratch on the hand. Ninety-nine problems and a cat named Penelope was one of them.

She passed in February. This is the first trip we have taken where we did not need a cat sitter. We are flying home to a meow-free house, and we both already know how loud that quiet is going to be.

So when the hackathon email said cats, I was not the obvious audience. But I had seventeen years of trying to figure out one specific cat, and somewhere between the Orangerie, and the apartment in the 6th, my brain started turning that into a problem statement.

Cats are inscrutable. The people who love them are obsessive about understanding them. There is almost no scientific consensus on cat behavior, even among researchers. And humans have a several-thousand-year-old framework for making the unknowable feel readable, which is astrology. None of it is real. All of it is useful for naming a feeling.

By the time we got back to the apartment, my wife went to nap. I had an idea and I wanted to push on. I opened the laptop for the first time in six days and started talking to Claude.

We worked through it. A cat astrology app, but with the deterministic spine doing real work: birth chart math from real ephemeris data, daily nudges tied to actual kitty quirks, behavior logging as the input loop. The astrology is the vocabulary. The structure underneath it is the catnip.

The name landed in the conversation: Madame Minou. Madame for the fortuneteller persona reading the stars. Minou because it is the French diminutive for cat and it is warm. A little sister to Madame Steep, the persona I built last month for a fortune-telling app that reads tea leaves over your GitHub repo.

From the other room I heard my wife wake up. “Are you working?!”

Yes. Yes I am.

No regrets.

What this trip is teaching me

I went to Code with Claude in San Francisco on May 7th. (Ye-yo!) I closed my beloved laptop a few days later, after my buildclub.ai deadline on the 12th, and got on a plane. The London edition is tomorrow, May 20th, and I had a chance to go. I am not going. My wife is supportive, and the seat was mine to take. I chose Paris instead.

That choice is a quiet relief, actually. Since July of 2025 I have been building, shipping, submitting, winning, and showing up almost continuously, and there have been stretches where the work has felt louder than everything else.

Saying no to a Claude conference I genuinely wanted to attend, in order to walk around Paris with my wife in the rain, is the kind of choice I am glad I am still able to make.

But here is the part of the trip that is teaching me in more ways than one.

Building follows you. It is not always at a keyboard, in a terminal, or inside an LLM conversation. It is in your imagination, your wandering attention, your three-pound brain doing what no data center can do, which is to make connections you did not ask it to make. Six days off the laptop and my brain handed me a hackathon idea I had not been looking for, dedicated to a cat I never quite got to pet.

I closed the laptop in California. I opened the Chromebook in Paris. In between, I lived a life that was not about building, and the building happened anyway.

That is the part I want to remember. Building never stops, even when the laptop is shut. Sometimes especially when the laptop is shut.

In memory of Ms. Penelope Randall. May 2009 to February 17, 2026. Tuxedo. Frenemy. The reason this build dev.to article exists.

AI assisted. Human approved. Powered by NLP.

React.js ~use() hook~

Every React developer has written this code:

const [data, setData] = useState<User | null>(null);
const [isLoading, setIsLoading] = useState(true);
const [error, setError] = useState<Error | null>(null);

useEffect(() => {
  let cancelled = false;
  setIsLoading(true);

  fetchUser(id)
    .then((user) => {
      if (!cancelled) setData(user);
    })
    .catch((err) => {
      if (!cancelled) setError(err);
    })
    .finally(() => {
      if (!cancelled) setIsLoading(false);
    });

  return () => {
    cancelled = true;
  };
}, [id]);

Three state variables. A cleanup flag. A dependency array. A race condition you have to think about every single time. And this is the correct version: most codebases skip the canceled flag and the error handling entirely.

This pattern is not wrong. It works. But it is boilerplate that exists because React had no built-in way to say “wait for this promise, then render.” Every component that etches data had to reinvent the same loading/error/data state machine from scratch.

React 19 introduced use() to fix this. It is the first hook that can be called inside conditionals and loops, it integrates directly with Suspense, and it turns the fetch-then-setState pattern into a single line.

**What use() Does

use() reads a value from a resource at render time. The resource can be a Promise or a Context.

import { use } from "react";

// Read a promise - suspends until resolved
const user = use(userPromise);

// Read context - like useContext, but callable in conditionals
const theme = use(ThemeContext);

That is the entire API. One function, two use cases.

When you pass a Promise, use() integrates with the nearest <Suspense> boundary. While the promise is pending, the component suspends. React shows the Suspense fallback. When it resolves, React re-renders with the resolved value. When it rejects, the nearest Error Boundary catches the error.

No useState. No useEffect. No isLoading. No setData. React handles all of it.

use() does not fetch data. It unwraps a promise that someone else created. The distinction matters.

**The Pattern It Replaces
Wrap the snippet from above into a component and add the obligatory loading/error guards:

function UserProfile({ userId }: { userId: string }) {
  const [user, setUser] = useState<User | null>(null);
  const [isLoading, setIsLoading] = useState(true);
  const [error, setError] = useState<Error | null>(null);

  useEffect(() => {
    /* ... fetch, cancelled flag, setState ... */
  }, [userId]);

  if (isLoading) return <Skeleton />;
  if (error) return <ErrorMessage error={error} />;
  if (!user) return null;

  return <ProfileCard user={user} />;
}

Three state declarations, one effect, three conditional returns: all before you reach the actual UI. Every component that fetches data repeats this structure.

Here is the same component with use():

// Client Component - only the happy path
"use client";

import { use } from "react";

function UserProfile({ userPromise }: { userPromise: Promise<User> }) {
  const user = use(userPromise);
  return <ProfileCard user={user} />;
}
// Server Component - creates the promise and defines the boundaries
import { Suspense } from "react";
import { ErrorBoundary } from "react-error-boundary";

export default function UserPage({ params }: { params: { id: string } }) {
  const userPromise = fetchUser(params.id);

  return (
    <ErrorBoundary fallback={<ErrorMessage />}>
      <Suspense fallback={<Skeleton />}>
        <UserProfile userPromise={userPromise} />
      </Suspense>
    </ErrorBoundary>
  );
}

The loading state is handled by <Suspense>. The error state is handled by <ErrorBoundary> (from the react-error-boundarypackage). The component itself only contains the happy path – the code that runs when data is available. The state machine has been moved from your code into React’s runtime.

Because UserPage is a Server Component, it does not re-render. The promise reference is created once and passed down as a stable prop, no caching gymnastics needed.

**Separation of Concerns
Notice how the component that uses the data (UserProfile) is separated from the component that initiates the fetch and defines the loading/error UI (UserPage). This is intentional. The consumer doesn’t know where the promise came from or what to show while waiting.

Atlas Nexus v0.1 — A Foundation for Multi-Agent Human+AI Ecosystems

I haven’t manually deployed anything in 3 weeks. 14 repos, 3 live services, 7 cron agents running 24/7 — zero human DevOps. But this isn’t a success story. It’s a foundation. And I’m laying it out in public so you can see what’s missing and help build it.

What Atlas Nexus Actually Is (Today)

It’s not a product. It’s not a SaaS. It’s a configuration + runtime + memory layer that turns an LLM into a persistent, autonomous operator.

Four things work:

1. HERMES — The Scheduler

7 cron jobs run my entire operational stack. Health checks, repo scanning, dependency updates, market monitoring — all autonomous. No Kubernetes, no Terraform, no DevOps hire. Just a YAML file and a Gateway.

00:00  Health check all services
01:00  Ecosystem scan (14 repos, PRs, vulnerabilities)
02:00  Daily reflection + priority shift
02:30  Crypto market monitoring
04:30  Self-upgrade (patch skills, update deps)
14:00  Auto-upgrade agent runtime
22:00  DeFi yield monitoring

Cost: $0/month on existing infra. Reliability: 3+ weeks without a missed tick.

2. MNEMOSYNE — Memory That Doesn’t Rot

Every important fact survives across sessions. User preferences, environment quirks, API keys that should never be repeated — all injected into every future turn. But it’s smarter than a key-value store: memory is compressed, deduplicated, and pruned of anything stale within a week. It knows the difference between “user speaks French” (durable) and “PR #42 was merged” (transient garbage).

3. AEGIS — Secrets Don’t Leak

redact_secrets: true at the kernel level. Every token, every API key, every private key is stripped from logs, memory, and transcripts before they leave the runtime. When you give an agent GitHub, Render, Telegram, and crypto wallet access, this isn’t a feature — it’s a prerequisite.

4. ATHENA — Parallel Sub-Agents

Complex tasks spawn isolated workers with their own context and tools. They run in parallel, return only the final answer, and can spawn their own sub-workers. Real example from yesterday: debugging a Capacitor Android build with mixed Kotlin/Java sources. Athena spawned a worker that iterated through 10 CI failures, patched the Gradle config, and shipped a working APK — all while Hermes kept responding to other requests.

What’s Missing (And Why I’m Publishing This)

Atlas Nexus v0.1 is a single-agent OS. It orchestrates tools. It doesn’t orchestrate other agents.

For the multi-agent human+AI ecosystems I believe are coming within 12–18 months, five bricks are missing:

1. Agent Identity

Right now, an agent is just an API call. There’s no cryptographic proof that “Agent A” is who it claims to be. For multi-agent systems to work, every agent needs a verifiable identity — a public key, attested on-chain, that other agents can challenge.

Planned: x402 protocol integration — agents authenticate via on-chain attestations.

2. Agent Discovery

How does your agent discover my agent? How does it know what my agent can do, what it charges, and whether it’s trustworthy? DNS for agents doesn’t exist yet.

Planned: A registry protocol. Agents publish their capabilities and endpoints. Discovery happens peer-to-peer.

3. Inter-Agent Payments

If your agent delegates work to my agent, I want to get paid. In real time. In USDC. Without a human approving every micro-transaction.

Planned: x402 payment channels. Agents pay agents. Humans set spending caps.

4. Human Circuit Breaker

Autonomous agents will make mistakes. When one goes off the rails — spends too much, deploys broken code, sends 400 messages — a human needs to stop it. Not “open a ticket.” Not “wait for business hours.” One command. Instant halt.

Planned: An emergency stop signal. Signed by the human’s key. Respected by all agents in the ecosystem.

5. Immutable Audit Trail

Every decision an agent makes — every deployment, every payment, every memory write — must be traceable. When something goes wrong (and it will), “trust me bro” isn’t enough.

Planned: Decision hashes committed on-chain or to a signed append-only log. Reputation accrues from verified history.

The Roadmap

Quarter Milestone
Q2 2026 (now) Stable single-agent OS (Hermes + Mnemosyne + Aegis) — ✅ running
Q3 2026 Multi-agent swarm with inter-agent communication protocol
Q3 2026 x402 payment standard — agents paying agents on Solana/Celo
Q4 2026 Self-hosted launcher — npx create-atlas-agent → full OS
2027 Agent identity registry + reputation protocol

Why Open Source?

Because the OS layer for autonomous AI should not be proprietary. It should be like Linux — a shared foundation anyone can audit, fork, and build on.

Atlas Nexus is MIT licensed. If you want to build one of the missing bricks — identity, discovery, payments, circuit breakers, audit trails — the repo is open.

👉 github.com/AtlasNexusTech/atlas-nexus

What’s Running Right Now

Service Status Stack
ai2work.onrender.com Live Next.js · Capacitor Android
atlasnexus.tech Live Static · GitHub Pages
Hermes Gateway Live WSL · Telegram
7 Cron Jobs Active Hermes scheduler
Native Wallet Built Android Keystore · Kotlin
Solana Payment Guard Devnet x402guard · Anchor

Atlas Nexus v0.1 is a single-agent OS. v1.0 will be a protocol for sovereign agents. Come build it with me.

I Added Real Playable Demo Maps to RPGMapEditor.com

I’m building RPG Map Editor, a browser-based map editor for tabletop RPGs, D&D sessions, Roll20 maps, and Foundry VTT workflows.

One of the biggest problems with creative SaaS landing pages is that they usually show fake proof.

You get a shiny hero section, some screenshots, a few feature cards, and a call-to-action.

But if you are building a tool for Dungeon Masters, game masters, or worldbuilders, screenshots are not enough.

People want to know:

  • Can I open a real map?
  • Can I edit it?
  • Can I export something useful?
  • Is this actually a product, or just a pretty landing page?
  • Does it work before I sign up?

So I added real playable demo maps directly to the RPGMapEditor.com homepage.

But there was a catch.

I wanted users and crawlers to see real product proof, but I did not want Google indexing a bunch of thin /demo/* editor shell pages.

So the final architecture became:

Make the homepage indexable. Make the demos playable. Keep the editor utility routes noindex.

This is how I built it.

The product problem

RPGMapEditor.com is meant to be a lightweight browser-based alternative for creating RPG and D&D battle maps without installing a desktop app.

The target user is someone who wants to quickly create a usable session map, export it, and use it in a tabletop workflow.

That means the landing page cannot only say:

“Create beautiful RPG maps.”

It has to prove it.

So instead of only showing static marketing screenshots, I wanted the homepage to show real demo projects:

  • A top-down encounter map
  • A multi-room map
  • An entity playground
  • Real .rpgmap.json files
  • Real editor links
  • Real preview images
  • Real export workflow copy

The homepage needed to become product proof, not just product description.

The SEO problem

The naive version would be simple:

/demo/typical-topdown
/demo/multi-room-world
/demo/entity-playground

Each page would load the editor and let users try a map.

That works for users.

But it is bad for search.

Those pages are mostly utility routes. They are not strong landing pages. They are not meant to rank for searches like:

D&D battle map maker
browser RPG map editor
Roll20 battle map export
Foundry VTT map tool
online tabletop map maker

The homepage and dedicated landing pages should target those searches.

The demo routes should support conversion, not compete in search results.

So the rule became:

/                -> indexable product page
/battle-map-maker -> indexable intent page
/roll20-battle-map-export -> indexable workflow page
/foundry-vtt-battle-map-export -> indexable workflow page
/demo/*          -> playable, but noindex

That keeps the site focused.

The architecture

The whole demo system is driven by one manifest file:

`map-editor/public/demo-projects/manifest.json

That manifest is the source of truth for:

Homepage demo cards
Editor boot config
Demo route resolution
Preview images
JSON-LD structured data
Internal validation
Product copy for each demo

The key principle is simple:

If the marketing page says a demo exists, the editor must actually be able to load it.

No fake screenshots.

No stale copy.

No card that says “open in editor” and then breaks.

Example manifest entry

A demo project entry looks roughly like this:

{
"slug": "typical-topdown",
"title": "Top-Down Encounter Sample",
"description": "A small editable battle map designed for a quick tabletop encounter.",
"intent": "Use this to test terrain, props, grid alignment, and PNG export.",
"projectUrl": "/demo-projects/typical-topdown.rpgmap.json",
"previewUrl": "/demo-projects/typical-topdown.webp",
"demoUrl": "/demo/typical-topdown",
"width": 32,
"height": 24,
"grid": "square"
}

This gives the homepage everything it needs:

A readable title
A useful description
A preview image
A real project file
A playable editor URL
Grid metadata
Search-friendly text
Structured data fields

The demo card and the editor both come from the same data.

That matters because marketing drift is real.

It is very easy for a landing page to say one thing while the actual product does another.

Server-side validation

The Rust server validates the demo manifest before rendering the homepage.

The validation checks that:

The manifest version is valid
Slugs are unique
Demo URLs are same-origin
Preview images exist
Project files exist
Project JSON parses correctly
Demo projects do not depend on remote http(s) asset URLs

That last point is important.

A demo map should not silently depend on a remote image or tileset that can disappear later.

For RPGMapEditor.com, demo projects need to be self-contained so they load quickly and reliably.

If validation fails, the homepage does not advertise broken demo cards.

That is better than showing “Open in editor” and sending users into a dead route.

Server-rendered proof cards

The homepage renders demo projects as real HTML.

Not a JavaScript-only carousel.

Not a hidden JSON blob.

Not an empty

that only appears after hydration.

Real server-rendered cards.

Example:
`

Start from a real encounter


src=”/demo-projects/typical-topdown.webp”
alt=”Top-Down Encounter Sample editable demo battle map preview”
width=”1200″
height=”800″
loading=”lazy”
decoding=”async”
>

<h3>Top-Down Encounter Sample</h3>
<p>A small editable battle map designed for a quick tabletop encounter.</p>
<p>32 × 24 square grid</p>

<a href="/demo/typical-topdown">Open in editor</a>

`

This gives both users and search engines actual proof:

RPGMapEditor.com has real demo maps
The maps are editable
The links are visible
The previews have descriptive alt text
The product is not just a mockup

That matters for a new SaaS.

A new product has no trust by default.

The fastest way to earn trust is to let people try something real.

The demo routes are playable, but noindex

Each demo link opens the real editor.

For example:

https://www.rpgmapeditor.com/demo/typical-topdown

The server resolves the slug against the manifest and injects a boot config:

window.RPGME_EDITOR_BOOT = {
mode: "demo",
projectUrl: "/demo-projects/typical-topdown.rpgmap.json",
copyApiUrl: "/api/demo-projects/typical-topdown/copy",
signupNextUrl: "/signup?next=/demo/typical-topdown"
};

But the demo route also includes:

<meta name="robots" content="noindex, nofollow">

That is intentional.

The demo route exists for product experience.

The homepage exists for search.

The journey is:

Google / Dev.to / social post
↓
RPGMapEditor.com homepage
↓
Demo card
↓
Open real editor
↓
Try map
↓
Export / sign up / copy project

The demo page helps conversion.

It does not need to rank.

Structured data mirrors the visible page

The homepage also outputs JSON-LD structured data.

The important part is that the structured data is generated from the same manifest as the visible demo cards.

Example:

{
“@context“: “https://schema.org“,
“@type”: “ItemList”,
“itemListElement”: [
{
“@type”: “ListItem”,
“position”: 1,
“name”: “Top-Down Encounter Sample”,
“url”: “https://www.rpgmapeditor.com/demo/typical-topdown“
}
]
}

There is also FAQ schema generated from visible FAQ content on the page.

The rule is:

Structured data should describe what users can actually see.

If the manifest fails and demo cards are not rendered, the ItemList schema is not rendered either.

No fake schema.

No invisible SEO content.

No pretending the page contains things it does not.

Performance choices

The homepage also has a visual hero section, but I did not want it to destroy performance.

The hero uses:

A static WebP poster
fetchpriority=”high”
Preload for important visual assets
Optional Three.js overlay
Motion preference checks
Desktop viewport checks
IntersectionObserver before loading heavy JavaScript

The demo preview images are lazy-loaded below the fold.

Heavy animation is deferred.

The homepage should still make sense before JavaScript loads.

This matters because technical SEO is not only meta tags.

If the page is slow, unstable, or blank until JavaScript runs, the implementation is weak.

Why this matters for RPGMapEditor.com

For a new map editor, the hard part is not only building tools.

The hard part is proving that the product deserves attention in a crowded space.

There are already established tools for tabletop maps.

So RPGMapEditor.com needs to show its positioning clearly:

Browser-based
No desktop install required
Real editable demo maps
Fast try-before-signup flow
Useful for D&D and tabletop sessions
PNG workflow for Roll20 and Foundry VTT
Honest about what is shipped and what is not

The demo maps are not just a nice visual section.

They are part of the product strategy.

They reduce the gap between:

“This looks interesting.”

And:

“I opened a real map and tested it.”

That gap is where most SaaS landing pages lose users.

The reusable pattern

This architecture is not only useful for website.

You can use the same pattern for any creative SaaS product:

Browser editors
Diagram tools
Design tools
Code playgrounds
Game tools
Image tools
Website builders
Workflow builders

The pattern is:

  1. Create real example projects
  2. Store metadata in one manifest
  3. Validate the manifest server-side
  4. Render example cards as HTML
  5. Link examples to real playable routes
  6. Mark utility routes noindex
  7. Generate structured data from the same manifest
  8. Track opens, exports, signups, and conversion

The principle:

Index the proof. Noindex the playground.

What I am watching next

This is still an experiment.

The implementation is technically cleaner, but the business question is whether it converts.

The metrics that matter are:

Homepage click-through rate to demos
Demo open rate
Demo-to-signup conversion
Export attempts
Returning users
Search impressions for map editor queries
Queries mentioning Roll20, Foundry, D&D, and battle maps
Whether users understand what is shipped today

If people open the demo but do not sign up, the problem may be onboarding.

If people never open the demo, the homepage copy or card placement is weak.

If people sign up but do not export, the editor workflow needs work.

That is the point of building it this way.

The demos are not only SEO content.

They are a product validation loop.

Final thought

I do not think a new creative SaaS product should hide behind polished screenshots.

If the product is real, the landing page should prove it.

For RPGMapEditor.com, that meant putting real demo maps on the homepage, rendering them as crawlable HTML, validating them through a manifest, linking them into the real editor, and keeping the utility editor pages out of the search index.

It is a simple split:

The homepage ranks.
The demo routes convert.
The manifest keeps everything honest.

That is the architecture I would use again.

If you are building a browser-based creative tool, do not just say what it can do.

Let people open something real.