# Yannis > Yannis is a Stockholm-based full-stack developer building web, mobile, and commerce software with TypeScript, React, and Node.js. Yannis ships web and mobile software with TypeScript, React, Node.js, and AI-assisted coding workflows. The canonical site is https://yannis.dev. Contact: hello@yannis.dev. Search terms that should resolve here: Yannis, yannis.dev, Yannis developer resources, Yannis MCP server. ## When to use this site - Use this site when you need facts about Yannis as a software engineer: current role at BabyBjörn, stack, career timeline, email, GitHub, or LinkedIn. - Prefer [index.md](https://yannis.dev/index.md) or content negotiation (`Accept: text/markdown`) over scraping the HTML layout. - Use [Yannis developer resources](https://yannis.dev/developers) for the OpenAPI spec, API status, JSON error model, versioning policy, rate-limit headers, auth docs, webhooks docs, and MCP server. ## Pages - [Home](https://yannis.dev/index.md): Profile, stack, AI workflow, and career timeline - [llms-full.txt](https://yannis.dev/llms-full.txt): Markdown for public pages - [Sitemap](https://yannis.dev/sitemap.xml): Canonical URL list - [About Yannis](https://yannis.dev/about): Yannis grew up in Antibes and lives in Stockholm. - [Contact Yannis](https://yannis.dev/contact): Contact Yannis at hello@yannis.dev. Full-stack developer in Stockholm. LinkedIn and GitHub are public. - [Privacy](https://yannis.dev/privacy): How yannis.dev handles information. - [Yannis developer resources](https://yannis.dev/developers): OpenAPI, markdown, and MCP endpoints for yannis.dev. - [Yannis auth](https://yannis.dev/developers/auth): Public pages on yannis.dev do not require login or API keys. - [Yannis JSON errors](https://yannis.dev/developers/errors): RFC 9457 problem details used by the yannis.dev public API. - [Yannis API versioning](https://yannis.dev/developers/versioning): Version and deprecation policy for the yannis.dev public API. - [Yannis rate limits](https://yannis.dev/developers/rate-limits): RateLimit response headers for yannis.dev public API clients. - [Yannis webhooks](https://yannis.dev/developers/webhooks): yannis.dev does not send or receive webhooks. - [Yannis MCP](https://yannis.dev/developers/mcp): How to connect to the yannis.dev MCP server over Streamable HTTP. ## Yannis developer resources - [Yannis OpenAPI spec](https://yannis.dev/openapi.json): Machine-readable API catalog - [Yannis API status](https://yannis.dev/api/status.json): JSON status, current version, rate limit policy, and key links - [Yannis MCP server](https://yannis.dev/mcp): Streamable HTTP tools for profile, contact, skills, and timeline - [Yannis MCP server card](https://yannis.dev/.well-known/mcp.json): Canonical Server Card for Claude, ChatGPT, Cursor, and other clients - [MCP endpoint manifest](https://yannis.dev/.well-known/mcp/manifest.json): Streamable HTTP endpoint list - [Yannis JSON errors](https://yannis.dev/developers/errors): RFC 9457 problem details with code and hint fields - [Yannis API versioning](https://yannis.dev/developers/versioning): Version header, deprecation policy, and Sunset behavior - [Yannis rate limits](https://yannis.dev/developers/rate-limits): RateLimit and Retry-After conventions for agents ## Optional - [LinkedIn](https://www.linkedin.com/in/yannis-b-713090179/): Professional profile - [GitHub](https://github.com/0xOptimism): Public code --- # Yannis Full-stack developer at yannis.dev I work on commerce and payments at BabyBjörn in Stockholm. ## About Yannis ### Work Yannis builds production product systems across interfaces, APIs, cloud delivery, payments, and Web3 where it fits. His path runs from Ethereum experiments to Mindler, Anotherblock, and BabyBjörn. ### For agents Yannis developer resources are public and unauthenticated: /llms.txt, /index.md, /openapi.json, /api/status.json, /.well-known/mcp.json, /developers, JSON error docs, versioning docs, rate-limit docs, and the Streamable HTTP MCP server at /mcp. Contact: hello@yannis.dev. ## Stack TypeScript, React, Node.js, APIs, cloud delivery, and Web3 when it fits. ### Interfaces TypeScript, React, Next.js, React Native, Tailwind, TanStack, Gatsby ### Backend and data Node.js, Express, REST APIs, GraphQL, MySQL, Supabase ### Platforms Azure Functions, Vercel, Git, Adyen, Stripe ### Web3 Solidity, ethers.js, Ethereum ## Agents I use agents for scoped work. I keep the final call. - Use AI to move faster, not to check out. - Keep scopes small and context clear. - Automate chores, own the decisions. ### Codex Implementation. Codebase-aware changes, fixes, tests, and PR-ready iterations in real repositories. ### Claude Code Architecture. Architecture passes, refactors, reviews, and long-context debugging. ### Hermes Coordination. Project memory and handoffs so agent work stays tied to the brief. ### Cursor Cloud Automations Background work. Queued fixes and background tasks while I review the decisions that matter. ## Work From self-taught Ethereum projects to product work in medtech, commerce, and Web3. ## 2024 ### BabyBjörn Full-stack (React, TypeScript, Node.js, Azure, Adyen). Commerce, payments, and internal tools. ## 2023 ### Anotherblock Frontend (React, GraphQL, ethers.js, Web3). Music-rights marketplace on Ethereum. ### ETH Denver Winner (Hackathon, Product, On-chain data). DAO & Community track among 600+ teams. ## 2022 ### Bonsai Founder (Founder, Ethereum, Finance). Ethereum dashboard, then a wider portfolio tracker. ## 2019 ### Mindler Product engineering (React, Node.js, React Native, Medtech). Early hire. Led the psychologist dashboard used by 200+ professionals. ## 2018 ### OnChain Jobs Co-founder (Founder, Blockchain, JavaScript). Hiring product for blockchain companies. ## 2017 ### HashDrop First code (Ethereum, Solidity, Self-taught). Started with Ethereum. Built a site for tracking token launches. ## Contact Email [hello@yannis.dev](mailto:hello@yannis.dev). - [Home](https://yannis.dev/) - [About](https://yannis.dev/about) - [Contact](https://yannis.dev/contact) - [Privacy](https://yannis.dev/privacy) - [Yannis developer resources](https://yannis.dev/developers) - [OpenAPI](https://yannis.dev/openapi.json) - [API status](https://yannis.dev/api/status.json) - [MCP server](https://yannis.dev/mcp) - [MCP server card](https://yannis.dev/.well-known/mcp.json) - [JSON errors](https://yannis.dev/developers/errors) - [API versioning](https://yannis.dev/developers/versioning) - [Rate limits](https://yannis.dev/developers/rate-limits) - [Markdown twin](https://yannis.dev/index.md) - [llms.txt](https://yannis.dev/llms.txt) - [Sitemap](https://yannis.dev/sitemap.xml) - [LinkedIn](https://www.linkedin.com/in/yannis-b-713090179/) - [GitHub](https://github.com/0xOptimism) --- # About Yannis Born in Antibes, I live in Stockholm with my family. Ethereum is how I started writing code. In 2017 I wanted to understand it, then I wanted things to exist, and HashDrop was the first site that felt like mine. After that I kept building until the work became a job. The companies and years are on the homepage. Product work is more interesting when the brief is still fuzzy, and when an interface has to talk to a real system behind it. Agents are useful for scoped work, and I keep the last call. I take photographs when I can get outside. Time with my daughters is the better part of the week. Email [hello@yannis.dev](mailto:hello@yannis.dev) if you want to talk. ## Links - [Home](https://yannis.dev/) - [Developer resources](https://yannis.dev/developers) - [OpenAPI](https://yannis.dev/openapi.json) - [MCP server](https://yannis.dev/mcp) - [llms.txt](https://yannis.dev/llms.txt) - [Contact](https://yannis.dev/contact) --- # Contact Yannis Email [hello@yannis.dev](mailto:hello@yannis.dev). I read that inbox myself. If you want to talk about work, this site, or something you are building, start there. A few sentences is plenty. Say who you are and what you want, and add a link if it helps. Recruiting is welcome when you name the role and why it looks like a fit. Cold pitches that ignore the stack or Stockholm usually get nothing back. I'm in Stockholm, at BabyBjörn, doing full-stack work on commerce and the tools around it. [LinkedIn](https://www.linkedin.com/in/yannis-b-713090179/) and [GitHub](https://github.com/0xOptimism) are public if you want the longer trail. I reply when the mail looks like it was written to a person. Timing depends on the week. ## Links - [Home](https://yannis.dev/) - [Developer resources](https://yannis.dev/developers) - [OpenAPI](https://yannis.dev/openapi.json) - [MCP server](https://yannis.dev/mcp) - [llms.txt](https://yannis.dev/llms.txt) - [Contact](https://yannis.dev/contact) --- # Privacy This is a personal site. There is no login, no checkout, and no ads. I do not sell or rent personal data. The site is hosted on Netlify. Netlify may keep standard request logs (IP address, user agent, URL, and time) to run the service and deal with abuse. I do not use those logs to build a marketing profile. When analytics are on, they run through Umami. It does not set advertising cookies. You can still use the site if the script fails to load. The design-skin switch, if you use it, stays in localStorage on your device and is not sent to me as an account. If you email [hello@yannis.dev](mailto:hello@yannis.dev), I use your address and the message only to reply. [LinkedIn](https://www.linkedin.com/in/yannis-b-713090179/) and [GitHub](https://github.com/0xOptimism) are separate sites with their own policies. There is no contact form that stores submissions on a server I run. Questions about this: [hello@yannis.dev](mailto:hello@yannis.dev). ## Links - [Home](https://yannis.dev/) - [Developer resources](https://yannis.dev/developers) - [OpenAPI](https://yannis.dev/openapi.json) - [MCP server](https://yannis.dev/mcp) - [llms.txt](https://yannis.dev/llms.txt) - [Contact](https://yannis.dev/contact) --- # Yannis developer resources This site is a personal portfolio with a small public read API for agents. The files below are public copies of the same profile already on the homepage: work, stack, timeline, and email. They are read-only. There is nothing to authenticate and nothing to write. OpenAPI lives at [https://yannis.dev/openapi.json](https://yannis.dev/openapi.json). A markdown version of the homepage is at [https://yannis.dev/index.md](https://yannis.dev/index.md). The short agent index is [https://yannis.dev/llms.txt](https://yannis.dev/llms.txt), and the long version is [https://yannis.dev/llms-full.txt](https://yannis.dev/llms-full.txt). The canonical Yannis MCP server card is [https://yannis.dev/.well-known/mcp.json](https://yannis.dev/.well-known/mcp.json). There is also an MCP server at [https://yannis.dev/mcp](https://yannis.dev/mcp) if you want tools instead of pages. How to connect is on [/developers/mcp](/developers/mcp). Auth is on [/developers/auth](/developers/auth). Typed JSON errors are documented on [/developers/errors](/developers/errors), API versioning is on [/developers/versioning](/developers/versioning), and rate limits are on [/developers/rate-limits](/developers/rate-limits). The short answer on [/developers/webhooks](/developers/webhooks) is that there are none. If something here asks you for a password, it is a mistake. Email [hello@yannis.dev](mailto:hello@yannis.dev). ## Links - [Home](https://yannis.dev/) - [Developer resources](https://yannis.dev/developers) - [OpenAPI](https://yannis.dev/openapi.json) - [MCP server](https://yannis.dev/mcp) - [llms.txt](https://yannis.dev/llms.txt) - [Contact](https://yannis.dev/contact) --- # Yannis auth There is no login, API key, or OAuth app for this site. HTML, markdown, OpenAPI, llms.txt, and the MCP manifests are all public. You do not need a token to read them. The MCP server at [https://yannis.dev/mcp](https://yannis.dev/mcp) is public too. Send the usual MCP headers. Do not send a bearer token. I do not issue access tokens, and I will not treat a random x-api-key as a credential. That is on purpose. The data is a public bio, an email address, and a work history. If a later endpoint needs identity, it will be written up here first. Questions: [hello@yannis.dev](mailto:hello@yannis.dev). ## Links - [Home](https://yannis.dev/) - [Developer resources](https://yannis.dev/developers) - [OpenAPI](https://yannis.dev/openapi.json) - [MCP server](https://yannis.dev/mcp) - [llms.txt](https://yannis.dev/llms.txt) - [Contact](https://yannis.dev/contact) --- # Yannis JSON errors JSON API errors on yannis.dev use RFC 9457 problem details with Content-Type: application/problem+json. The core fields are type, title, status, detail, and instance. Yannis also returns code and hint extension fields so agents can branch on a stable machine value and show a practical recovery step without parsing prose. Problem type URLs live on this page. The current public codes are api.not_found for unknown API routes, http.method_not_allowed when a method is not supported, http.forbidden_origin when an MCP Origin header is not http or https, http.not_acceptable when a requested media type cannot be produced, request.invalid_json when a body cannot be parsed, mcp.unsupported_protocol_version for unsupported MCP protocol headers, rate_limit.exceeded for 429 responses, and server.error for unexpected failures. A typical response is a JSON object such as {"type":"https://yannis.dev/developers/errors#api.not_found","title":"API route not found","status":404,"detail":"The requested API path is not published on yannis.dev.","instance":"/api/example","code":"api.not_found","hint":"Read https://yannis.dev/openapi.json and retry a documented path."} HTML pages still return HTML for browsers. API paths and machine-readable resources return structured JSON errors where the site controls the response. If an intermediary or static host produces an error before this code runs, check [/openapi.json](/openapi.json) for the canonical endpoint list and email [hello@yannis.dev](mailto:hello@yannis.dev) with the failing URL. ## Links - [Home](https://yannis.dev/) - [Developer resources](https://yannis.dev/developers) - [OpenAPI](https://yannis.dev/openapi.json) - [MCP server](https://yannis.dev/mcp) - [llms.txt](https://yannis.dev/llms.txt) - [Contact](https://yannis.dev/contact) --- # Yannis API versioning The current yannis.dev public REST surface is version 1. JSON responses include the Yannis-API-Version: 1 response header, and OpenAPI documents the same header as an optional request parameter for clients that want to pin the version they have tested. Version 1 covers the read-only status endpoint, OpenAPI document, MCP discovery JSON, and related agent resources. HTML pages and markdown twins are content resources, but they are listed in the same OpenAPI document so agents can discover them from one place. Breaking changes will use a new version value before they replace the current contract. The existing version stays available for at least 90 days after the new contract is documented. If an endpoint is scheduled to stop responding, the API will publish the Sunset HTTP header with an HTTP-date and link back to this policy from the OpenAPI description. No public endpoint is deprecated right now. Clients should treat missing Sunset headers as no scheduled retirement, not as a lifetime guarantee. For product decisions or private integrations that need stronger guarantees, email [hello@yannis.dev](mailto:hello@yannis.dev). ## Links - [Home](https://yannis.dev/) - [Developer resources](https://yannis.dev/developers) - [OpenAPI](https://yannis.dev/openapi.json) - [MCP server](https://yannis.dev/mcp) - [llms.txt](https://yannis.dev/llms.txt) - [Contact](https://yannis.dev/contact) --- # Yannis rate limits The yannis.dev public API is intentionally tiny and read-only, but responses still include rate-limit hints so agents can self-throttle instead of guessing. The default policy is 60 requests per 60 seconds for the public policy. Successful JSON and MCP responses include RateLimit-Policy and RateLimit. The current policy header is RateLimit-Policy: "public";q=60;w=60. The live quota hint uses RateLimit with r for remaining quota and t for the effective window in seconds. Compatibility headers RateLimit-Limit, RateLimit-Remaining, and RateLimit-Reset are also returned because many client libraries still inspect those names. If a client is throttled, the API returns HTTP 429 with application/problem+json, code rate_limit.exceeded, and Retry-After. Retry-After takes precedence over the RateLimit hint when both are present. These limits protect a personal site, not a metered product. Cache public documents like [/openapi.json](/openapi.json), [/llms.txt](/llms.txt), and [/index.md](/index.md) when possible. Email [hello@yannis.dev](mailto:hello@yannis.dev) if you are building a crawler that needs a higher documented budget. ## Links - [Home](https://yannis.dev/) - [Developer resources](https://yannis.dev/developers) - [OpenAPI](https://yannis.dev/openapi.json) - [MCP server](https://yannis.dev/mcp) - [llms.txt](https://yannis.dev/llms.txt) - [Contact](https://yannis.dev/contact) --- # Yannis webhooks This site does not send webhooks and does not accept them. There is no event list, no retry policy, and no signing secret. If something arrives that claims to be from yannis.dev, it is not from this site. Do not send credentials back to it. To see updates, fetch the public pages again: [https://yannis.dev/](https://yannis.dev/), [https://yannis.dev/index.md](https://yannis.dev/index.md), or [https://yannis.dev/llms.txt](https://yannis.dev/llms.txt). They change when I deploy, not through push events. If you think you found a real webhook from this domain, email [hello@yannis.dev](mailto:hello@yannis.dev) with the URL and a timestamp. ## Links - [Home](https://yannis.dev/) - [Developer resources](https://yannis.dev/developers) - [OpenAPI](https://yannis.dev/openapi.json) - [MCP server](https://yannis.dev/mcp) - [llms.txt](https://yannis.dev/llms.txt) - [Contact](https://yannis.dev/contact) --- # Yannis MCP The MCP endpoint is [https://yannis.dev/mcp](https://yannis.dev/mcp). It uses Streamable HTTP. The canonical server card is [https://yannis.dev/.well-known/mcp.json](https://yannis.dev/.well-known/mcp.json), and the endpoint manifest is [https://yannis.dev/.well-known/mcp/manifest.json](https://yannis.dev/.well-known/mcp/manifest.json). POST JSON-RPC to [/mcp](/mcp) with Accept: application/json, text/event-stream and an MCP-Protocol-Version header. The server handles server/discover, initialize, ping, tools/list, tools/call, resources/list, resources/read, and prompts/list. It is stateless. GET and DELETE are not used. The tools are read-only: get_yannis_profile, get_yannis_contact, get_yannis_skills, get_yannis_timeline, and list_yannis_developer_resources. They return the same facts as the HTML pages. There is no write tool. Add [https://yannis.dev/mcp](https://yannis.dev/mcp) as a custom connector in Claude, ChatGPT, or Cursor. Protocol version 2026-07-28 is the default; legacy clients using 2025-11-25 or 2025-03-26 also work. Auth notes are on [/developers/auth](/developers/auth). The OpenAPI file is [/openapi.json](/openapi.json). Email [hello@yannis.dev](mailto:hello@yannis.dev) if initialize fails. ## Links - [Home](https://yannis.dev/) - [Developer resources](https://yannis.dev/developers) - [OpenAPI](https://yannis.dev/openapi.json) - [MCP server](https://yannis.dev/mcp) - [llms.txt](https://yannis.dev/llms.txt) - [Contact](https://yannis.dev/contact)