Fast original games, daily rankings, creator rooms and rewards
that make every second count. No pay-to-win—just skill and
bragging rights.
0 playing now14 original gamesREAL shared rankings
✦ DAILY FEATURED CHALLENGE
Five-Second Fever
Stop the hidden clock as close as possible to exactly five
seconds. Five rounds. Lowest average error wins.
TARGET 5.0005.000
N +80✦ +250 XP🏆 Ranked
⚡
LEVEL81,217 XP to next
♛
GLOBAL RANK#—Top 18% this month
🔥
DAILY STREAK1 dayPlay today to extend
◆
NEXBITS1,167Earned through skill
Trending right now
Fast games the community cannot stop replaying.
TRENDING⏱
Precision Stop
★ 5.0
Stop a hidden clock as close as possible to a target time across five tense rounds.
Practice · sign in to rank◆◆◇
FAST⚡
Reaction Rush
★ 4.9
Wait for the signal, then strike. Early taps are punished and every millisecond matters.
Practice · sign in to rank◆◇◇
RANKED∑
Math Blitz
★ 4.7
Solve adaptive equations before the timer expires. Difficulty rises with your streak.
Practice · sign in to rank◆◆◇
FOCUS▦
Memory Matrix
★ 4.7
Memorize a glowing pattern, then rebuild it after the lights disappear.
Practice · sign in to rank◆◆◇
Daily champions
Precision Stop · resets in 23h 49m
No ranked scores yet
Be the first real player to complete Precision Stop today.
Your missions
Complete goals to earn NexBits.
◈ Triple Loop◆ 90
⚡ Score Surge◆ 120
✦ Variety Spark◆ 100
THE ARCADE
Pick your challenge
Every game has five-round solo matches, personal bests and daily,
weekly and monthly rankings.
LIVE MULTIPLAYER
Enter the crowd
Join creator-hosted game shows and climb a cumulative scoreboard
across a playlist of mini-games.
Featured live rooms
Every room shown here is created by a real signed-in host and updates live for all connected players.
No public rooms are open
Create the first real room in Streamer Studio and share its six-character code.
HALL OF SKILL
Leaderboards
Daily, weekly and monthly rankings reward consistent skill.
⏱ Reset 23h 49m
Rank
Player
Score
Level
Country
Reward tier
No real scores in this period
Complete the selected game to create the first leaderboard entry.
Finish in the reward zone
Top 100 daily: 150 NexBits · Top 50 weekly: 500 · Top 10 monthly:
exclusive avatar + 2,000.
REWARD CENTER
Missions & progression
Earn currency and cosmetics by playing well—not by buying random
chances.
◈
Triple Loop
Complete 3 mini-game matches.
0 / 3
⚡
Score Surge
Earn 8,000 total score today.
0 / 8,000
✦
Variety Spark
Play 3 different games today.
0 / 3
♫
Listen Closely
Complete an audio-category game.
0 / 1
LOCKER & REWARDS
Build your identity
Unlock original 3D-style mascots, frames and themes with NexBits
earned through play.
N1,167 available
LIMITED SEASON MASCOT
Astro Puff
A cosmic explorer with a luminous visor and star freckles. Earn it
from the monthly top 10 or unlock it with 4,500 NexBits.
Common
Sprout
An original 3D-style NexLoop mascot.
N 350
Rare
Ember
An original 3D-style NexLoop mascot.
N 650
Rare
Aqua Byte
An original 3D-style NexLoop mascot.
N 700
Rare
Luna Pop
An original 3D-style NexLoop mascot.
N 850
Epic
Noir
An original 3D-style NexLoop mascot.
N 1,200
Epic
Spike Jr.
An original 3D-style NexLoop mascot.
N 1,300
Epic
Pixel Pal
An original 3D-style NexLoop mascot.
N 1,500
Epic
Frosty
An original 3D-style NexLoop mascot.
N 1,750
Legendary
Loop King
An original 3D-style NexLoop mascot.
N 2,600
Legendary
Glitch Kid
An original 3D-style NexLoop mascot.
N 3,000
Mythic
Astro Puff
An original 3D-style NexLoop mascot.
N 4,500
Monthly Top 10
Crowned Nova
Finish in the monthly top 10
Achievement only
Founder
First Looper
Complete 100 games
Achievement only
PLAYER PROFILE
Your Loop identity
Customize your mascot, public display name and achievement
showcase.
BROTHITHA
@HOHOOHO
✦ Level 8 ·
Rising Challenger
0Wins14Games#5662Best rank
Public information
Choose your mascot
Locked mascots can be earned or bought.
Achievement showcase
✦First SparkComplete your first game🏆First CrownWin a real live creator show🔥Heating UpReach a 3-day streak◈Arcade RegularComplete 10 games⏱Time BenderScore 4,500 in Precision Stop◆CollectorOwn 6 mascots⚡High VoltageReach level 10∞First LooperComplete 100 games💎Bit HoarderHold 5,000 NexBits
CREATOR TOOLS
Streamer Studio
Build a custom game show, choose the playlist and difficulty, then
run a cumulative competition.
Show builder
Configure a complete competition. Every selected mini-game awards
points toward the final podium.
1. Choose mini-games2. Match rules~11 min3. Room identity
Live preview
Share the code on stream. Every name and score comes from a real signed-in player.
JOIN AT NEXLOOP / ROOMCREATECreate a room to receive a live code
No generated players
Real accounts appear here after they join your room code.
Production note: internet-wide rooms require a Supabase
project. The included SQL and config files are ready for that
connection.
⏱
Precision StopSolo · 5 rounds
Round 1 of 50%
TOTAL SCORE0
The Ultimate Loop-OffGame 1 of 5 · Round 1
LIVE DEMO
Production Setup Wizard
One-file production workflow: create Supabase, run the included SQL once, paste the public values below, then download the configured HTML and upload it to Cloudflare Pages.
-- NEXLOOP REAL ONLINE DATABASE — run once in Supabase SQL Editor
create extension if not exists pgcrypto;
create table if not exists public.profiles (
id uuid primary key references auth.users(id) on delete cascade,
display_name text not null default 'New Looper' check (char_length(display_name) between 2 and 18),
handle text not null unique check (handle ~ '^[A-Za-z0-9_]{3,18}$'),
bio text not null default '' check (char_length(bio) <= 120),
avatar_id text not null default 'puff',
coins bigint not null default 750 check (coins >= 0),
xp bigint not null default 0 check (xp >= 0),
season_xp bigint not null default 0 check (season_xp >= 0),
streak integer not null default 1 check (streak >= 0),
last_played_date date,
games integer not null default 0,
wins integer not null default 0,
total_score bigint not null default 0,
last_seen_at timestamptz not null default now(),
created_at timestamptz not null default now(),
updated_at timestamptz not null default now()
);
create table if not exists public.inventory (
user_id uuid not null references public.profiles(id) on delete cascade,
item_id text not null,
item_type text not null check (item_type in ('avatar','frame','theme','emote')),
source text not null default 'earned',
obtained_at timestamptz not null default now(),
primary key (user_id,item_id)
);
create table if not exists public.game_sessions (
id uuid primary key default gen_random_uuid(),
user_id uuid not null references public.profiles(id) on delete cascade,
game_id text not null,
round_count integer not null check (round_count between 1 and 10),
mode text not null default 'solo' check (mode in ('solo','daily','live')),
room_id uuid,
seed bigint not null,
started_at timestamptz not null default now(),
expires_at timestamptz not null default (now()+interval '20 minutes'),
submitted_at timestamptz
);
create table if not exists public.game_scores (
id bigint generated by default as identity primary key,
user_id uuid not null references public.profiles(id) on delete cascade,
game_id text not null,
score integer not null check (score between 0 and 10000),
round_count integer not null check (round_count between 1 and 10),
mode text not null check (mode in ('solo','daily','live')),
room_id uuid,
created_at timestamptz not null default now()
);
create index if not exists game_scores_period_idx on public.game_scores(game_id,created_at desc,score desc);
create index if not exists game_scores_user_idx on public.game_scores(user_id,created_at desc);
create table if not exists public.rooms (
id uuid primary key default gen_random_uuid(),
code text not null unique check (code ~ '^[A-Z0-9]{6}$'),
host_id uuid not null references public.profiles(id) on delete cascade,
title text not null check (char_length(title) between 2 and 40),
status text not null default 'lobby' check (status in ('lobby','running','finished','closed')),
phase text not null default 'lobby' check (phase in ('lobby','playing','results','finished')),
max_players integer not null default 50 check (max_players between 2 and 500),
playlist jsonb not null default '[]'::jsonb,
settings jsonb not null default '{}'::jsonb,
current_game_index integer not null default 0,
current_round integer not null default 0,
winner_id uuid references public.profiles(id),
created_at timestamptz not null default now(),
updated_at timestamptz not null default now()
);
alter table public.game_sessions add constraint game_sessions_room_fk foreign key (room_id) references public.rooms(id) on delete set null;
alter table public.game_scores add constraint game_scores_room_fk foreign key (room_id) references public.rooms(id) on delete set null;
create table if not exists public.room_members (
room_id uuid not null references public.rooms(id) on delete cascade,
user_id uuid not null references public.profiles(id) on delete cascade,
cumulative_score integer not null default 0,
status text not null default 'active' check (status in ('active','disconnected','removed')),
joined_at timestamptz not null default now(),
primary key (room_id,user_id)
);
create table if not exists public.room_round_scores (
room_id uuid not null references public.rooms(id) on delete cascade,
user_id uuid not null references public.profiles(id) on delete cascade,
game_index integer not null,
round_index integer not null,
game_id text not null,
score integer not null check (score between 0 and 1000),
submitted_at timestamptz not null default now(),
primary key (room_id,user_id,game_index,round_index)
);
create table if not exists public.chat_messages (
id bigint generated by default as identity primary key,
room_id uuid not null references public.rooms(id) on delete cascade,
user_id uuid not null references public.profiles(id) on delete cascade,
body text not null check (char_length(body) between 1 and 80),
created_at timestamptz not null default now()
);
create table if not exists public.period_runs (
period_type text not null check (period_type in ('daily','weekly','monthly')),
period_key text not null,
starts_at timestamptz not null,
ends_at timestamptz not null,
settled_at timestamptz not null default now(),
primary key(period_type,period_key)
);
create table if not exists public.player_rewards (
id uuid primary key default gen_random_uuid(),
user_id uuid not null references public.profiles(id) on delete cascade,
period_type text not null check (period_type in ('daily','weekly','monthly')),
period_key text not null,
rank integer not null,
ranking_points bigint not null,
coins integer not null,
xp integer not null,
item_id text,
reason text not null,
claimed_at timestamptz,
created_at timestamptz not null default now(),
unique(user_id,period_type,period_key)
);
create table if not exists public.mission_claims (
user_id uuid not null references public.profiles(id) on delete cascade,
mission_id text not null,
period_key text not null,
reward_coins integer not null,
reward_xp integer not null,
claimed_at timestamptz not null default now(),
primary key(user_id,mission_id,period_key)
);
create or replace function public.nexloop_touch_updated_at() returns trigger language plpgsql as $$
begin new.updated_at=now(); return new; end $$;
drop trigger if exists profiles_touch on public.profiles;
create trigger profiles_touch before update on public.profiles for each row execute function public.nexloop_touch_updated_at();
drop trigger if exists rooms_touch on public.rooms;
create trigger rooms_touch before update on public.rooms for each row execute function public.nexloop_touch_updated_at();
create or replace function public.nexloop_new_user() returns trigger language plpgsql security definer set search_path=public as $$
declare h text;
begin
h := 'looper_' || substr(replace(new.id::text,'-',''),1,8);
insert into public.profiles(id,display_name,handle)
values(new.id,coalesce(nullif(new.raw_user_meta_data->>'display_name',''),'New Looper'),h);
insert into public.inventory(user_id,item_id,item_type,source) values
(new.id,'puff','avatar','starter'),(new.id,'bolt','avatar','starter'),(new.id,'momo','avatar','starter');
return new;
end $$;
drop trigger if exists on_auth_user_created on auth.users;
create trigger on_auth_user_created after insert on auth.users for each row execute function public.nexloop_new_user();
create or replace function public.begin_game_session(p_game_id text,p_round_count integer default 5,p_mode text default 'solo',p_room_id uuid default null)
returns table(session_id uuid,seed bigint,expires_at timestamptz) language plpgsql security definer set search_path=public as $$
declare sid uuid; sd bigint; exp timestamptz;
begin
if auth.uid() is null then raise exception 'Authentication required'; end if;
if p_round_count<1 or p_round_count>10 then raise exception 'Invalid round count'; end if;
sd := floor(random()*9000000000)::bigint+1000000000;
insert into public.game_sessions(user_id,game_id,round_count,mode,room_id,seed)
values(auth.uid(),p_game_id,p_round_count,p_mode,p_room_id,sd)
returning id,game_sessions.expires_at into sid,exp;
return query select sid,sd,exp;
end $$;
create or replace function public.submit_game_session(p_session_id uuid,p_score integer)
returns table(coins bigint,xp bigint,season_xp bigint,reward_coins integer,reward_xp integer,score_id bigint)
language plpgsql security definer set search_path=public as $$
declare s public.game_sessions%rowtype; rc integer; rx integer; sid bigint; today date:=timezone('utc',now())::date;
begin
select * into s from public.game_sessions where id=p_session_id and user_id=auth.uid() for update;
if not found then raise exception 'Game session not found'; end if;
if s.submitted_at is not null then raise exception 'Game session already submitted'; end if;
if now()>s.expires_at then raise exception 'Game session expired'; end if;
… Complete SQL remains embedded in this HTML file.