Beat Jev
A penalty shootout against Jev, on Render Workflows and Postgres.
# Beat Jev A penalty shootout against TypeSafe Jev. Take turns shooting and keeping goal. One **Render Workflows** task owns the match, with scores saved in **Render Postgres**. | Example | Code and deploy | Play | | ---------- | ---------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------- | | TypeScript | <a href="typescript/README.md" target="_blank" rel="noopener noreferrer">TypeScript README</a> | <a href="https://beat-jev-typescript-web.onrender.com" target="_blank" rel="noopener noreferrer">Live game</a> | | Python | <a href="python/README.md" target="_blank" rel="noopener noreferrer">Python README</a> | <a href="https://beat-jev-python-web.onrender.com" target="_blank" rel="noopener noreferrer">Live game</a> | Each example deploys its own web service, workflow, and paid Postgres database. They share the 3D frontend and game rules. <a href="docs/architecture.md" target="_blank" rel="noopener noreferrer">How it works</a> · <a href="https://github.com/ojusave/route-lab" target="_blank" rel="noopener noreferrer">Related demo: Route Lab</a> ## Retrying a game start The web service saves one Workflow run per match. If Render accepts the start but the reply is lost, both language examples reuse a key derived from that match to recover the original run. A new match gets a different key even when the player name is unchanged. The database lock and stored run ID remain in place. Render deduplicates a key for 24 hours with