The working copy, powered on.

edit the file below — the actual Pyxle parser and real CPython re-run it in this tab

CPython via Pyodide · ~12 MB once⌘/Ctrl + Enter — run nowyour first edit boots the runtime
@action + state
counter.pyxledit me — your first edit boots CPython
resultplain JS until you edit
state lives in Python
0

Edit the code → real Python boots.

sandbox log · boots, runs, errorsidle

— opens on your first edit

sandboxed iframe · opaque origin · no cookies, no page DOM — in a real app the Python half runs server-side on Starlette; here CPython stands in for the server

This board hits this page’s real @action.

every tap is an HTTP POST to the handler printed alongside — counts persist in SQLite on this server · 97,545 page loads so far, same database

react to this page129 total
request logreal HTTP · this server

— opens on your first tap

pages/playground.pyxlruns on this server
@action
async def react_emoji(request):
    from db import check_rate_limit, get_client_ip, increment_reaction
 
    client_ip = get_client_ip(request)
    # 5 reactions per hour per IP, scoped to the playground reactions board.
    if not await check_rate_limit(client_ip, scope="react_emoji"):
        raise ActionError(
            "Rate limit reached. Please try again after 1 hour.",
            status_code=429,
        )
 
    body = await request.json()
    emoji = body.get("emoji", "")
    if emoji not in VALID_EMOJIS:
        raise ActionError("Invalid reaction", status_code=400)
 
    new_count = await increment_reaction(emoji)
    return {"ok": True, "emoji": emoji, "count": new_count}

Run it for real.

the same anatomy on your machine — the homepage terminal replays a real session