Odyc Play

Odyc Play

Create and share pixel games with your friends, colleagues, and community.

Odyc Play Thumbnail

Made with agents, built on experience

Put together with agentic automation, but the story is human. Every decision, struggle, and lesson here comes from my own answers and experience. Agents made sure no detail was forgotten and every screenshot is fresh.

Read the questions and my answers

Vision

I was looking for an engine to build games, but every option expected me to know music, graphics, 3D, shaders or models. I wanted something much simpler: a way to capture a game idea, have fun building it, and then play it for maybe five minutes. That’s when I found Odyc.js, a tiny JavaScript library for pixel games by @achtaitaipai. A whole game is a single createGame call, with sprites drawn as text.

I liked it so much that within ten days in June 2025 I made 53 commits and got 12 pull requests merged into the library, from 62-colour support to a visual test suite and new input and render hooks. Working with Charles went great. He was very active, and together we improved both the library and Odyc Play, which at the time was just a website editor. He built the generated avatars, the sound editor, and the French translation, and the editor’s paint and sound tools come from the official Odyc playground.

In 2026, I moved Odyc Play into its own repository. I wanted to make bigger changes without involving Charles too much, mostly around Appwrite. Odyc Play became the first project where I tested the OAuth2 server I had built in Appwrite, so on top of making games, it also became an identity provider: “Sign in with Odyc.js”.

Odyc Play is for people learning to make games: game jams, teachers and students, and even kids. Until it’s fully finished and released to the Odyc community, it lives on an Appwrite domain as an early access preview.

Technologies

  • SvelteKit with Svelte 5
  • Tailwind CSS and shadcn-svelte
  • CodeMirror 6 with TypeScript autocompletion
  • Appwrite Auth and the OAuth2 server
  • Appwrite Databases
  • Appwrite Storage
  • Appwrite Functions
  • Appwrite Sites
  • React for Odyc Avatars
  • Go for Odyc CLI

Screens

Players sign in with an email code or GitHub, or continue as a guest and connect an account later.

Sign in

After signing in, the home page lists your games, games you collaborate on, and featured games from the community. Every new game gets a random name like “Fantastic Ferret”, so starting one never begins with a form.

Home after signing in

The editor is where most of the time goes. Code is on the left with autocompletion for the whole Odyc.js API and an optional Vim mode, and the game runs on the right. The menu bar has a sprite paint tool, a sound effect tool, 17 examples to start from, and a version picker with every Odyc.js release ever published, so old games keep working.

Editor

I built three games with Odyc myself. Forest Hike was the first, Quick Arrows the second, and Color Thief the third. Color Thief started as an unfinished demo, and an agent finished it through Odyc Play’s MCP server.

Forest Hike, Quick Arrows and Color Thief

Every creator has a public profile with a pixel avatar, a short bio, and their games.

Profile

Shared games get their own preview image, generated by an Appwrite Function with the game’s title, author and a screenshot, so links look good on social media and in chat apps.

Generated preview image

Sign in with Odyc.js

Building Odyc Play’s OAuth2 capabilities was the main driver of manual QA for Appwrite’s OAuth2 server before its release. It shaped the product in the most fundamental way, and without Odyc as a playground, the OAuth2 server wouldn’t be as good as it is today.

Odyc Play uses Rich Authorization Requests (RFC 9396) instead of plain scopes, for two reasons. First, they give more granular control: you can give the CLI or an MCP server access to a single game instead of all of them, which limits what an agent or a CI/CD pipeline can touch. Second, when you do pick “all games”, Odyc Play remembers which authorization created a new game. A game created by the CLI or MCP server automatically gives that same token owner permissions, without asking you to authorize again.

Appwrite announced the OAuth2 server in a livestream, and the part about Odyc starts at 5:50:

Odyc Avatars

Odyc Avatars plays the role of a third-party app, built by a developer who uses Odyc but has no idea about the Appwrite SDK. That’s why it uses plain OAuth2 flows without any SDK. It shows an endless gallery of 8×8 pixel avatars, and you can apply any of them to your Odyc Play profile. The avatars come from a small generator library that an agent wrote, combining 131 templates made for the project with 156 free sprites from OpenGameArt.

It was the first app idea that fit Odyc nicely: something that makes sense, but would never be part of the main product.

Odyc Avatars asking to sign in

Odyc CLI

I first built the CLI in 2025 as an opportunity to learn Go, which also makes it fast. Back then it only turned a folder of PNG sprites into Odyc code. In 2026, it became the reference command-line client for “Sign in with Odyc.js”: you log in through the device flow, create a game, and deploy it to Odyc Play from your terminal.

Odyc CLI commands

Retrospective

The hardest parts were all about authentication edge cases:

  • Redirect loops. Some OAuth flows ended up in infinite redirect loops, which led to a fallback cookie system.
  • Signing up in the middle of an OAuth flow. A new user arriving from a third-party app has to create an account and still land back on the consent screen.
  • CSRF and a cross-origin token endpoint. AI clients like Claude register themselves and exchange tokens from other origins, which SvelteKit’s CSRF protection blocks by default.

Most of the code was written with AI, but for a long time I committed everything manually. Only in 2026 did I become confident enough to let agents commit directly.

The Odyc.js maintainer loved the project, and I really like it too, as a showcase. The biggest lesson for me was that building a side project alongside full-time work is more than possible with the right automation and tooling.

If I started again, I would keep some flows simpler. Collaboration, for example, goes through proxy functions today, and I am confident it can be simplified to get rid of them.

Future plans

I want to use the platform at live and in-person events, and slowly build it into the official platform on the Odyc domain.