A visual hardpoint editor for Endless Sky ship sprites. Place guns, turrets, engines, bays, and every sub-key on your sprite and export clean ES data format.
Try it now — runs in any browser, no install required.
While building Sci-Fi Flavours, the ES Ship Builder saved me a ton of time placing hardpoints. That tool inspired me to build something that goes further — full support for every hardpoint type and sub-key in modern ES, flare previews, swizzle color previews, mirror mode, import/export, and more. I hope it helps other modders create cool ships for Endless Sky.
- All 7 hardpoint types — guns, turrets, engines, steering engines, reverse engines, fighter bays, drone bays
- Every sub-key — angle, parallel, arc, blindspot, turret turn multiplier, zoom, gimbal, facing, launch effects
- Flare preview — see engine exhaust (atomic, ion, plasma) rendered on your hardpoints with adjustable intensity
- Swizzle preview — preview all 29 ES faction color remappings on your sprite
- Mirror mode — place symmetric pairs across the Y axis with one click, angles auto-mirrored
- Import & export — paste existing ship data (data file or save file format), edit visually, copy clean output
- Drag to reposition — click and drag hardpoints, mirror twins move together
- Arrow key nudge — fine-tune positions (0.5 / 0.1 / 5 ES unit increments)
- Sprite bounds check — detect if opaque pixels touch sprite edges (causes in-game clipping)
- Grid overlay — coordinate grid at 10/50 ES unit intervals with center crosshairs
- Undo — full undo stack for place, delete, move, and clear-all operations
- Zero dependencies — single HTML file, works offline, no build step
- Load a sprite — click the file input and select your ship PNG (both base and
@2xauto-detected) - Select a type — click a type button or press its keyboard shortcut (G/T/E/S/R/F/D)
- Click to place — click on the sprite to place a hardpoint
- Copy output — the right panel shows live ES data format output, click "Copy to Clipboard"
| Panel | Contents |
|---|---|
| Left | Sprite loader, type/layer selectors, sub-key controls, tools, flare preview, import, hardpoint list |
| Center | Canvas with the ship sprite, coordinate readout, status bar |
| Right | Live ES data format output, copy button |
| Button | Shortcut | Type | Marker |
|---|---|---|---|
| G | G |
Gun | Red circle |
| T | T |
Turret | Blue circle |
| E | E |
Engine | Green circle |
| SE | S |
Steering Engine | Yellow-green circle |
| RE | R |
Reverse Engine | Orange circle |
| FB | F |
Fighter Bay | Purple square |
| DB | D |
Drone Bay | Lavender square |
Each hardpoint has a rendering layer that controls whether it draws under or over the sprite:
- Default — uses the type's natural layer (guns: under, turrets: over, engines: under, bays: inside)
- Under — renders behind the sprite
- Over — renders on top of the sprite
- Inside — shown with dotted outline (bays)
Cycle layers with U. Layer changes apply to the selected hardpoint if one is selected.
Context-sensitive controls appear based on the selected type:
| Control | Types | Description |
|---|---|---|
| Angle | All | Rotation in degrees (0 = forward/up) |
| Parallel | Gun | Gun fires parallel to ship facing instead of converging |
| Arc | Turret | Firing arc limits (min, max degrees) |
| Blindspot | Turret | Dead zone where turret can't aim (min, max degrees) |
| Turn mult | Turret | Turret rotation speed multiplier |
| Zoom | Engines | Flare size multiplier (default 1.0) |
| Gimbal | Engines | How far flare can rotate to follow steering (degrees) |
| Facing | Steering Engine | Left or right side (affects flare direction) |
| Facing | Bays | Launch direction: forward, left, right, back |
| Launch FX | Bays | Effect name played when launching |
| FX count | Bays | Number of launch effect instances |
| Button | Shortcut | Description |
|---|---|---|
| Mirror | M |
Toggle mirror mode — places symmetric pair across the Y axis |
| Grid | Shift+G |
Toggle coordinate grid overlay |
| Bounds | B |
Toggle sprite bounds overlay (green = good padding, red = pixels touch edge) |
| Markers | H |
Toggle hardpoint markers — hide for clean in-game preview |
| Undo | Ctrl+Z |
Undo last action (place, delete, move, clear) |
| Delete | Del |
Delete selected hardpoint (and its mirror twin) |
| Clear All | — | Remove all hardpoints (undoable) |
| Key | Action |
|---|---|
G T E S R F D |
Switch hardpoint type |
M |
Toggle mirror mode |
B |
Toggle bounds overlay |
H |
Toggle hardpoint markers (hide for clean preview) |
U |
Cycle layer (default / under / over / inside) |
Shift+G |
Toggle grid |
Arrows |
Nudge selected hardpoint (0.5 ES units) |
Shift+Arrows |
Fine nudge (0.1 ES units) |
Ctrl+Arrows |
Coarse nudge (5 ES units) |
Ctrl+Z |
Undo |
Del / Backspace |
Delete selected |
Escape |
Deselect |
When active, placing a hardpoint also places a mirrored twin at the opposite X coordinate. The twin is shown at reduced opacity and marked with (m) in the list.
Mirror twins stay linked — moving one moves the other. Angle, steering facing, and bay facing are automatically mirrored (sign-flipped for angle, left/right swapped for facing).
Placing exactly on the center line (X = 0) creates a single hardpoint, not a pair.
The swizzle dropdown applies Endless Sky's faction color remapping to the sprite. This shows how the ship will look in-game for different governments (Republic, Pirate, Syndicate, etc.). All 29 ES swizzle values (0-28) are available.
Swizzle is preview-only — it doesn't affect the exported data.
Select a flare type (Atomic, Ion, Plasma) to preview engine exhaust effects on engine-type hardpoints. The intensity slider controls brightness. Flares respect the hardpoint's zoom, angle, and layer settings.
Flares require the flares/ folder with the PNG assets to be in the same directory as the HTML file.
Paste ES ship data into the import textarea and click Import. The parser accepts:
- Full ship definitions (
ship "Name" ...) - Standalone hardpoint blocks (just
gun,turret,enginelines) - Both data file format and save file format
- Quoted and unquoted multi-word keywords
All sub-keys (angle, zoom, gimbal, arc, layer, facing, etc.) are preserved on import.
Output uses standard ES data file indentation (single tab for hardpoints, double tab for sub-keys):
gun -15 -40
gun 15 -40
turret 0 10
over
engine -12 55
zoom 1.2
engine 12 55
zoom 1.2
Hardpoints are grouped by type in standard order: guns, turrets, engines, steering engines, reverse engines, fighter bays, drone bays.
- Use
@2xsprites when available — the editor auto-detects from the filename and adjusts coordinate scaling - The bounds overlay (
B) checks if opaque pixels touch the image edges, which can cause clipping artifacts in-game - ES coordinates: X is left-right (positive = right), Y is up-down (positive = down), origin is sprite center
- 1 ES unit = 2 pixels in a
@2xsprite, 1 pixel in a base sprite
The editor exposes functions on window for programmatic access:
window.getHardpoints() // JSON array of all hardpoint objects
window.getHardpointsES() // ES data format string
window.getShipName() // Current ship name
window.importHardpoints(text) // Import from ES data string, returns count
window.clearHardpoints() // Remove all hardpoints- Inspired by the ES Ship Builder from the Endless Sky project
- Flare preview sprites derived from Endless Sky by Michael Zahniser and contributors (CC-BY-SA-4.0)
- Built for the Endless Sky modding community
Code is licensed under GPL-3.0-or-later.
Flare images (flares/*.png) are derived from Endless Sky assets and licensed under CC-BY-SA-4.0.
