Warning
This is the legacy version of Starfish, deprecated in favor of the rewritten premium Starfish v2 (still in development).
This version will not receive further updates. This project is considered unfinished. Only the proxy loaded with official plugins can be guaranteed functional; parts of the legacy plugin API are untested and/or locked. The new plugin API of Starfish v2 has been overhauled with full unlocked support for world data, inventories, and even an injectable overlay module for rendering over your game.
A Minecraft proxy server for Hypixel with an advanced plugin system, packet modification capabilities, and built-in security features. Designed to provide an alternative to Forge mods or Raven's scripting API, but for legit players and on any client.
- Download the latest release from the Releases tab
- Extract the ZIP file and run
starfish-proxy.exe - Connect with Minecraft 1.8.9:
- Add server:
localhost - Complete Microsoft authentication on first connect
- Reconnect after authentication
- Add server:
- Clone the repository
- Install dependencies:
npm install- Start the proxy:
npm start- Connect with Minecraft 1.8.9 to
localhost
All commands use the format /module command [args]. Use /proxy help to get started.
/proxy help- Show all proxy commands/proxy server- List available servers/proxy server <name|host:port>- Switch server target/proxy addserver <name> <host:port>- Save a server/proxy removeserver <name>- Remove saved server/proxy reauth- Force re-authentication/proxy plugins- List loaded plugins
Each plugin includes these commands by default:
/<plugin> help- Show plugin-provided commands/<plugin> config- Open configuration UI
Configuration files are stored in:
config/starfish-config.json- Main proxy settingsconfig/plugins/*.config.json- Plugin configurationsdata/*.data.json- Plugin persistent data
{
"proxyPort": 25565,
"targetHost": "mc.hypixel.net",
"targetPort": 25565,
"servers": {
"hypixel": { "host": "mc.hypixel.net", "port": 25565 }
}
}Plugins are JavaScript files placed in the plugins/ directory. I would suggest looking at the existing plugins in this project for more advanced usage, but here's a minimal example:
module.exports = (api) => {
// Plugin metadata
api.metadata({
name: "example",
displayName: "Example Plugin",
prefix: "§cEX", // [Starfish-EX]
version: "1.0.0",
author: "Your Name",
description: "A simple example plugin",
});
// Configuration schema
api.configSchema([
{
label: "Settings",
settings: [
{
key: "enabled",
type: "toggle",
description: "Enable the plugin",
},
],
defaults: { enabled: true },
},
]);
// Register commands
api.commands((registry) => {
registry
.command("test")
.description("Test command")
.handler((ctx) => {
ctx.send("§aHello");
});
});
// Listen to events
api.on("chat", (event) => {
if (event.message.includes("Hello")) {
api.chat("§eHi");
}
});
};api.metadata(config)- Define plugin metadataapi.configSchema(schema)- Define configuration optionsapi.commands(callback)- Register commandsapi.on(event, handler)- Listen to eventsapi.intercept(event, handler)- Intercept and modify packets
api.chat(message)- Send chat messageapi.sound(name, x?, y?, z?)- Play soundapi.sendTitle(title, subtitle?)- Display titleapi.sendActionBar(text)- Show action bar text
api.getPlayers()- Get all playersapi.getPlayerByName(name)- Find player by nameapi.getCurrentPlayer()- Get the proxy userapi.getPlayerTeam(name)- Get player's team
// haven't reviewed yet
api.getPartyInfo(callback, timeout?)- Get current party informationapi.getPartyInfoAsync(timeout?)- Get party info with Promise supportapi.isInParty(callback, timeout?)- Check if player is in a partyapi.getPlayerRole(callback, timeout?)- Get player's party role (LEADER, MOD, MEMBER)api.getPing(callback, timeout?)- Test Hypixel API ping with latency measurementapi.getPingAsync(timeout?)- Get ping info with Promise support
api.setDisplayNamePrefix(uuid, prefix)- Set a prefix before player nameapi.appendDisplayNamePrefix(uuid, prefix)- Add to existing prefixapi.prependDisplayNamePrefix(uuid, prefix)- Add before existing prefixapi.setDisplayNameSuffix(uuid, suffix)- Set a suffix after player nameapi.appendDisplayNameSuffix(uuid, suffix)- Add to existing suffixapi.prependDisplayNameSuffix(uuid, suffix)- Add before existing suffixapi.clearDisplayNamePrefix(uuid)- Remove prefix for playerapi.clearDisplayNameSuffix(uuid)- Remove suffix for playerapi.clearAllDisplayNames()- Clear all custom prefixes/suffixesapi.getDisplayNamePrefix(uuid)- Get current prefix for playerapi.getDisplayNameSuffix(uuid)- Get current suffix for player
chat- Chat messages receivedplayer_join- Player joins the gameplayer_leave- Player leaves the gamerespawn- Player respawns or changes serversplayer_move- Player movemententity_spawn- Entity spawnsplugin_restored- Plugin re-enabled
For advanced usage, you can intercept packets:
api.intercept("packet:server:chat", (event) => {
// read packet data
console.log(event.data);
// cancel packet (safe packets only)
event.cancel();
// modify packet (safe packets only)
event.modify({ ...event.data, message: "Modified!" });
});The proxy includes built-in support for Hypixel's custom packet APIs:
// get party information
api.getPartyInfo((result) => {
if (result.success) {
console.log(`In party: ${result.inParty}`);
console.log(`Members: ${result.members.length}`);
result.members.forEach((member) => {
console.log(`${member.uuid}: ${member.role}`);
});
}
});
// check if someone is party leader
api.getPlayerRole((role) => {
if (role === "LEADER") {
console.log("You are the party leader!");
}
});// get hypixel ping
api.getPing((result) => {
if (result.success) {
console.log(`Latency: ${result.latency}ms`);
}
});The proxy enforces packet safety to maintain compatibility with Hypixel:
Safe to Modify:
- Chat messages, sounds, titles, particles
- Tab list display names
- Scoreboard data
Read-Only:
- Player movement and rotation
- Combat actions
- Block interactions
- Inventory actions
- Fork the repository
- Create a feature branch
- Make your changes
- Submit a pull request
- Created by Hexze assisted by Claude Code
- Special thanks to J0nahG for starting the project and assisting me, and to Desiyn and nilsraccoon for contributing to development.
For issues, questions, or suggestions:
- Open an issue on GitHub
- Join the Discord server