Compatibility
Minecraft: Java Edition
Platforms
Supported environments
Links
Tags
Creators
Details
Tupenter turns the Minecraft chat bar into something closer to a console. It started as a resender where you can press a key and send that message again and grew into a scripting layer on top: chaining, expressions, variables, loops, conditionals, custom commands, and scripts that run every tick.
It runs entirely on your client. Everything it produces is an ordinary vanilla command, so no server-side mod is needed and nothing you couldn't have typed yourself gets sent.
Resending
Press a key (default R) to send your last message again.
- Press & hold for rapid fire, or toggle for hands-free
- Replay the last N messages as a batch, in either order
- Per-message and per-batch delays, preset message lists, and command-feedback suppression
- Everything configurable in Mod Menu, including a keybind to open the config
Scripting
Three pieces of syntax carry the whole language:
| Syntax | Meaning |
|---|---|
$...$ |
an expression — evaluated, and its value substituted |
#word |
a directive — an instruction to Tupenter itself |
(...) |
grouping, after a directive |
Chain commands
/time set day && /weather clear && say ready
Compute inline
/give @s stick $32 + 5$
/give @s diamond $3s$ (s = stacks of 64)
/summon $pick("zombie" | "skeleton")$
/tp @s ~ ~$client.pos.y > 60 ? 10 : 0$ ~
Math is exact - 1/3 stays a third, with no floating-point drift.
Read the world
Over ninety live variables - position, health, biome, light level, held item, what your crosshair is on, weather, the entity you're looking at, its NBT.
/echo standing on $block(client.blockpos.x, client.blockpos.y - 1, client.blockpos.z)$
#if (client.target.hit == "block") (/tp @s $client.target.blockpos$)
Variables, loops, conditionals
#set spawn = "100 64 -200"
#local roll = rand(1, 10) && /give @s stick $roll$ && /say I got $roll$!
#repeat 5 (/say tick $i$)
#foreach $b$ in blockset(#minecraft:wool) (/give @s $b$)
#if (client.health < 6) (/effect give @s regeneration 5 1)
Registry tags resolve through the live connection, and typing # inside
blockset(...) tab-completes the tags available on that server.
Wait, without freezing anything
/attribute @s minecraft:jump_strength base set 30 && #wait 2t && /tp @s $client.target.blockpos$
Scripts evaluate lazily - a value read after a #wait sees the world as it is
then, not as it was when you pressed Enter.
Make your own commands
/customcommand add blink <maxdistance:int=100> "teleport to where you're looking" = #silent #local hit = raycast(maxdistance) && #if (hit == "miss") (/tp @s ^ ^ ^$maxdistance$) #else (/tp @s $hit$)
/blink is now a real command with real autocomplete, typed parameters, and
optional arguments. There are custom functions too, for values you want to
reuse in expressions.
Scripts that run every tick
Armed per world, so a script you wrote for creative never fires on your survival server. Since a script is a loop, events are one-tick flags you test:
#if (client.just_died) (/echo died at $client.blockpos$)
#if (client.keypress.g) (/togglenightvision)
Batteries included
A fresh install ships with working examples, so nothing starts empty.
Commands, ready to use:
| Command | What it does |
|---|---|
/blink [maxdistance] |
teleport to where you're looking, stopping at walls |
/ironkit |
a full set of iron gear |
/portalcalc [pos] [dim] |
convert coordinates between Nether and Overworld |
/tickfreeze |
toggle /tick freeze |
/launch <entity> [speed] |
hurl an entity where you're looking |
Scripts, all disabled until you turn them on:
| Script | What it does |
|---|---|
rainbowTunnel |
press ] and fly — a spiralling wool tunnel follows your motion, lit by glowstone |
itemDespawnTimer |
marks where you died and counts down your items' five minutes, pausing whenever that chunk isn't being simulated |
creeperAlert |
warns once, with the distance, when a creeper gets within 8 blocks |
elytraWarning |
a durability heads-up before your elytra gives out |
restockReminder |
villagers restock at dawn |
They double as documentation — read them to see vectors, events and timers in practice.
Quality of life
- Chat-bar highlighting — each
&&segment is coloured by what it is; commands get per-argument colouring from their own parse - Chain-aware autocomplete —
/time set day && /weather cl⇥completes the second command - Selectable chat — click and drag across messages, Ctrl+C to copy
/unroll— dry-run any line and see exactly what it would send, without sending it- Every feature has an on/off switch in Mod Menu
It's still vanilla underneath
Tupenter never invents capabilities. It expands what you type and sends real
commands, so your permissions still apply — the /setblock examples need cheats
or op, exactly as if you had typed them. On a server without cheats the
scripting still works; you're just limited to commands you could already run.
Tick scripts fire twenty times a second, so guard anything that sends. The docs
say so repeatedly, and /tupenter abort is always the panic switch.
Documentation
/tupenter help— every command, directive, function and variable documents itself in game, with runnable examples/tupenter reference— copies the entire reference to your clipboard- SCRIPTING.md — the same reference on GitHub: the model, every directive, every function, every parameter type, every variable, and the gotchas
The documentation is generated from the same registries the code uses, so it cannot drift out of date.
Requirements
- Minecraft 1.21.10
- Fabric Loader 0.18.2+
- Fabric API
- Java 21+
Mod Menu and Cloth Config are optional but recommended — the config screen and the script editors live there.
Links
- Source on GitHub
- Report an issue
- MIT licensed


