Jace Games: quick browser games with Sign in with Jace and scores synced to your Jace account. Snake, Memory Match, 2048, Minesweeper and more.
Quick browser games from Jace. Sign in with your Jace account to keep your scores, including the Snake and Memory Match scores from the old Jace site, and compete on leaderboards shared across Jace.
Next.js 16 (App Router), TypeScript and Tailwind 4, deployed on Vercel.
| id | Game | Score | Better |
|---|---|---|---|
snake | Snake | Food eaten | Higher |
memory | Memory Match | Moves to clear | Lower |
2048 | 2048 | Points | Higher |
tetris | Block Stacker | Points | Higher |
minesweeper | Minesweeper | Seconds (9×9, 10 mines) | Lower |
flappy | Flappy Jace | Pipes passed | Higher |
breakout | Breakout | Points | Higher |
wordle | Word Guess | Guesses used (wins only) | Lower |
reaction | Reaction Time | Average of 5, in ms | Lower |
typing | Typing Speed | WPM over 30 s | Higher |
snake and memory keep the ids the original Jace site used, so old scores carry over. Never change an existing id.
Every game works with a keyboard (arrow keys/WASD, Enter to restart) and on a touchscreen (swipes, taps, on-screen pads).
GAMES in lib/games.ts: id, name, description, icon, better ("higher" or "lower"), how to format the score, addedAt (shows a "New" badge for a month), and limits for server-side validation.components/games/. It receives { onFinish(score, durationMs), best } and calls onFinish once when a game ends.components/games/index.ts.You need Node.js 20.9 or newer.
npm install
cp .env.example .env.local
Fill in .env.local, then run npm run dev and open http://localhost:3000.
| Name | Required | What it is |
|---|---|---|
JACE_CLIENT_ID | yes | The OAuth client id from Jace. |
JACE_CLIENT_SECRET | yes | The OAuth client secret from Jace. Server only, never sent to the browser. |
SESSION_SECRET | yes | 32+ random characters used to encrypt the session cookie. Generate with openssl rand -base64 32. Changing it signs everyone out. |
APP_URL | no | This app's public URL, used to build the redirect URI <APP_URL>/api/auth/callback. Defaults to the URL of the incoming request. Set it in production if you use more than one domain. |
JACE_URL | no | The Jace base URL. Defaults to https://jaceo.vercel.app. |
Put the same variables in Vercel → Project → Settings → Environment Variables. None of them use the NEXT_PUBLIC_ prefix, so none reach the client bundle. .env* files are gitignored (except .env.example).
scores scope).https://<your-vercel-domain>/api/auth/callbackhttp://localhost:3000/api/auth/callback (for local development)JACE_CLIENT_ID and JACE_CLIENT_SECRET.Plain OAuth 2.0 authorization code flow (no OIDC):
/api/auth/signin stores a random state in a short-lived encrypted cookie and redirects to GET /oauth/authorize?scope=profile scores./api/auth/callback checks state, exchanges the code at POST /api/oauth/token with the client secret (on the server), and calls GET /api/oauth/userinfo.jg_session). See lib/session.ts.Every page load re-checks userinfo through /api/session. If Jace says banned, the person is signed out and sees "This Jace account is banned." A 401 from any Jace call also signs them out.
localStorage first, with a UUID as its external_id (lib/localScores.ts).POST /api/scores. The server validates each score against the game's limits (whole number, in range, and a plausible game length) before forwarding it to Jace's import endpoint. Because external_id makes the import idempotent, retries never create duplicates.components/ScoresProvider.tsx)./api/leaderboard → GET /api/oauth/leaderboard, order=asc for lower-is-better games). Jace's API needs a user token, so signed-out players see their own device's best instead.The scores scope and the /api/oauth/scores and /api/oauth/leaderboard endpoints are a contract Jace hasn't shipped yet. Until it does, those calls return 404, the app shows "Sync with Jace is coming soon", and scores stay on the device as pending. They upload on their own once the endpoints are live. If someone signed in before Jace accepted the scores scope (Jace answers 403 insufficient_scope), the app asks them to sign in again.
scripts/mock-jace.mjs implements the whole contract locally, with an account ("oldplayer") that already has old Snake and Memory Match scores:
node scripts/mock-jace.mjs
JACE_URL=http://localhost:4000 npm run dev
The mock's authorize endpoint signs you in straight away. Start it with MOCK_SCORES=off to behave like Jace today (scores endpoints return 404), or MOCK_BANNED=1 to test the banned path.
npm run dev: development servernpm run build: production buildnpm run lint: ESLintnpm run typecheck: TypeScriptNo versions published yet.
Please read this before using Jace.
Effective date: Sep 26 2026 at 8:00 AM Last updated: Oct 19 2026
Welcome to Jace ("Jace", "the site", "we", "us"). Jace is a hobby project run by an individual Jace (or ququoqu). By creating an account or using the site, you agree to these Terms. If you don't agree, please don't use Jace.
Jace is the home of the Jace apps (Jace Social, Jace Launcher, Jace Store, BlidOS, Profile Maker, VLC Redesign, and more). One Jace account signs you in to them, and the site lists the projects and publishes their source code.
Jace used to also have videos, games, live chat, direct messages, group chats, Cloud, organizations, and open forums. Those are no longer shown on the site, but what you posted there is kept, not deleted, and you can still delete it from "Your data" in your account settings.
You agree not to:
Site administrators may review reported content and take action to keep the community safe, including:
Jace's own apps (marked Official, such as Jace Social) can also ban or unban a Jace account, for example when someone breaks the rules in that app. A ban applies to your whole Jace account, signs you out of every app you signed in to with Jace, and can be appealed the same way. Staff accounts can't be banned by apps, and every ban an app makes is logged.
Admins decide moderation actions at their own discretion. If you think an action was a mistake, you can appeal by messaging the Jace Official organization. Appeals are considered, but the decision is final.
You can report content or accounts that break these rules using the Report links on the site. Reports may be made without an account. Please don't file false or abusive reports.
If you believe something on Jace infringes your copyright, contact us at jaceofficialbrand@hotmail.com with: what the work is, where it appears on the site (a link), your contact details, and a statement that you're the owner or authorized to act for them. We'll review it and may remove the content.
Jace is provided "AS IS" and "AS AVAILABLE", with no warranties of any kind, express or implied, including any implied warranties of merchantability, fitness for a particular purpose, non-infringement, security, accuracy, or uninterrupted or error-free operation. We don't promise that the site will be available, that your content will be kept safe or stay online, or that it's free of bugs or harmful components. You use Jace at your own risk.
To the fullest extent permitted by law:
You agree to defend, indemnify, and hold harmless Jace and its operator from any claims, damages, losses, and expenses (including reasonable legal fees) that arise from your content, your use of the site, your breach of these Terms, or your violation of any law or anyone else's rights (including copyright and privacy rights).
Jace relies on other services to run (see the Privacy Policy) and on services users may link to. Their availability, terms, and privacy practices are outside our control, and we're not responsible for them. Signing in with GitHub is subject to GitHub's terms.
We may change, suspend, or discontinue any part of Jace, or the whole site, at any time, with or without notice, and we won't be liable to you or anyone else for doing so. Please keep your own copies of anything important.
We may update these Terms. If we make a significant change, we'll post a notice in the READ ME or News forum on the site. Continuing to use Jace after a change means you accept the new Terms.
Questions about these Terms: jaceofficialbrand@hotmail.com
Effective date: Sep 26 2026 at 8:00 AM Last updated: Oct 19 2026
This explains what information Jace ("we", "us") collects, why, who it's shared with, and what control you have. Jace is a hobby project run by an individual (Jace (or ququoqu). Contact: jaceofficialbrand@hotmail.com.
Account information
Profile information (public unless noted)
Content you create
Moderation and safety information
Technical information
We do not use advertising trackers or third-party analytics on the site.
We don't sell your personal information, and we don't use it for advertising.
Jace uses only cookies needed for the site to work:
We don't use advertising or analytics cookies. You can clear cookies in your browser at any time; you'll just be signed out.
We rely on these providers to run Jace, and your information passes through them:
| Provider | What for |
|---|---|
| Vercel | Hosting the website (and its server logs). |
| Neon | The database that stores accounts, profiles, posts, messages, and other data. |
| Supabase | Storage for uploaded files (videos, images, project files, Cloud files). |
| Mailjet | Sending emails. Your email address and the email's contents are shared with them to deliver it. |
| GitHub | Only if you choose to sign in with GitHub. |
These providers have their own privacy policies and may process data in countries other than yours.
Passwords are hashed, sessions use signed and encrypted tokens, and traffic to the site uses HTTPS. But no system is perfectly secure, and Jace is a small hobby project. Direct messages are not end-to-end encrypted. Please don't share sensitive information (passwords, financial details, government IDs) through the site.
Jace has no minimum age, so people of any age may have an account. We collect the same limited information from everyone (see Section 1) and don't use it for advertising. A parent or guardian who wants to see, correct, or delete a child's information or account can contact us at jaceofficialbrand@hotmail.com, and we'll help.
We may update this policy. For significant changes, we'll post a notice in the READ ME or News forum. The "Last updated" date above shows when it last changed.
Questions or requests: jaceofficialbrand@hotmail.com
JACE MAY NOT BE ALLWAYS ONLINE!
THIS IS A FUN PROJECT I MADE THIS IS HOSTED WITH VERCEL IF YOU DO NOT TRUST THIS APP DO NOT USE IT THIS PROJECT IS VIBE CODED WITH CLAUDE JACE IS NOT A REAL BRAND THANK YOU FOR READING THIS HAVE A GOOD DAY