We updated our Terms of Service on 14 October 2026.See what changes
For web tools · ff-kit 1.1
Make it look like it belongs here
Our colors, font, buttons, fields and 85 icons, ready for your web tool. One line, nothing to download, and it follows every visitor’s FileFortress theme.
Everything starts with ff- and does nothing until you use it, so your own CSS keeps working. ff-kit/ isn’t in your zip and doesn’t count toward its size.
1
Add the kit
At the top of your index.html.
2
Use the classes
Our background and font on the whole page, then any piece below.
3
Follow the theme
Optional: your tool turns Glow, Glass or Glass 2 with the visitor’s site theme, our background included.
Built to last
We only ever add to the kit. A tool you make with it today keeps looking right, whatever we change on our site.
Works on your computer
ff-dev.js from your web tool project loads the kit from FileFortress while you test. Put its line first.
One file with everything it needs to build a web tool for FileFortress: what web tools can do, the rules, the limits, ff-media/, testing with ff-dev.js and every piece of this kit with its code. Attach it to your chat with ChatGPT, Claude, Gemini or any other AI, then describe your tool.
A text file (Markdown), always up to date with this page.
Made it with an AI? Tick “Made with AI” when you upload (step 3, More details). It adds a small badge to your tool’s page, so people know how it was made. Our rules apply all the same: you’re responsible for what your tool does, so read through what your AI wrote.
Colors
Our palette, yours to use
CSS variables that change with the theme: color: var(--ff-brand). Click one to copy it.
Make it yours
Change any part, keep the rest
Every piece reads its own variables. Turn the knobs: everything on this page changes with you, and the CSS to put in your tool writes itself.
your CSS
/* change something on the left */
Put it in a <style> block or your own CSS file, after the kit. For one element only, set the variables on that element: style="--ff-btn-radius: 999px".
The pieces
Everything from our style guide
Each piece live, next to its code. The code is yours to edit: type in it and the piece changes. Switch the theme at the bottom of the screen to see it the way your visitors might.
Versioned cards
Cards carry a version in their name: ff-res-v1, ff-res-v2. A version never changes. When our cards get a new look, it becomes the next number, and your tool keeps the one you picked.
Buttons
ff-btn
Accent for the main action, secondary for the rest.
<aclass="ff-res-v1"href="#"style="max-width: 300px">
<divclass="ff-res-thumb">
<imgsrc="ff-media/cover.png"alt="">
<divclass="ff-res-badges"><spanclass="ff-badge ff-badge-info">New</span><spanclass="ff-badge">Free</span></div>
</div>
<divclass="ff-res-body">
<pclass="ff-res-kicker">Maps · 2 days ago</p>
<h3class="ff-res-title">Island Loot Map with every chest</h3>
<divclass="ff-res-by"><spanclass="ff-avatar ff-avatar-sm">IS</span>IslandStudio</div>
<divclass="ff-res-foot">
<divclass="ff-res-stats"><span><spanclass="ff-icon ff-i-download"></span>1.2k</span><span><spanclass="ff-icon ff-i-heart"></span>87</span></div>
<span>UEFN</span>
</div>
</div>
</a>
Good to know
An <a> makes the whole card a link; a <div> makes a card that isn’t one.
ff-res (without a number) is the same card, so older tools keep working.
Pictures come from your ff-media/ folder. Any size works; the frame is 16:9.
Change it
Cards and glass
ff-card
ff-card is a panel, ff-card-body gives it room. ff-glass blurs what’s behind it.
Card
Island Loot Map
A panel for anything: settings, results, a list.
Glass
See-through panel
Looks best over a picture or the Glow background.
ff-card.html · editable
<divclass="ff-grid">
<divclass="ff-card ff-card-body ff-stack">
<pclass="ff-eyebrow">Card</p>
<h3class="ff-h3">Island Loot Map</h3>
<pclass="ff-muted ff-small">A panel for anything: settings, results, a list.</p>
</div>
<divclass="ff-glass ff-card-body ff-stack">
<pclass="ff-eyebrow">Glass</p>
<h3class="ff-h3">See-through panel</h3>
<pclass="ff-muted ff-small">Looks best over a picture or the Glow background.</p>
</div>
</div>
Good to know
Cards follow the theme: solid normally, see-through in Glow and Glass.
Glass only shows its blur when something colorful is behind it.
Change it
Our background
ff-backdrop
The Fortress Glow background from our site: drifting pink and purple glows, a slowly moving grid and light bars.
Our background
Looks like the site around it
Glass panels show it best.
ff-backdrop.html · editable
<divstyle="position: relative; height: 280px; overflow: hidden; border-radius: 16px">
<divclass="ff-backdrop ff-backdrop-box"></div>
<divclass="ff-glass ff-card-body ff-stack"style="position: relative; max-width: 300px; margin: 48px auto">
<pclass="ff-eyebrow">Our background</p>
<h3class="ff-h3">Looks like the site around it</h3>
<pclass="ff-muted ff-small">Glass panels show it best.</p>
</div>
</div>
Good to know
The easy way: add kit.js. When a visitor uses Fortress Glow, Glass or Glass 2, our background appears behind your page by itself, so your tool matches the site around it.
In one box only, like here: <div class="ff-backdrop ff-backdrop-box"> inside an element with position: relative.
Added with your own code later? Call ffKit.fillBackdrops() after adding it.
It stands still for visitors who ask their system for less motion.
Sidebar
ff-sidebar
The sidebar from our desktop app, with the page next to it. Click the items: each one shows its own part, no code needed.
Normal map
Turn a height map into a normal map.
Height map
Paint or import heights.
Pack
3 masks waiting to be packed.
Guide
How each map works.
ff-sidebar.html · editable
<divclass="ff-shell"style="--ff-shell-height: 360px; border-radius: 16px; overflow: hidden; border: 1px solid var(--ff-line)">
<asideclass="ff-sidebar">
<divclass="ff-side-brand"><spanclass="ff-icon ff-i-layers"></span>Texture tools</div>
<pclass="ff-side-group">Maps</p>
<aclass="ff-side-item is-on"href="#"data-ff-show="#p-normal"><spanclass="ff-icon ff-i-mountain"></span>Normal map</a>
<aclass="ff-side-item"href="#"data-ff-show="#p-height"><spanclass="ff-icon ff-i-sliders"></span>Height map</a>
<aclass="ff-side-item"href="#"data-ff-show="#p-pack"><spanclass="ff-icon ff-i-box"></span>Pack<spanclass="ff-side-count">3</span></a>
<pclass="ff-side-group">Help</p>
<aclass="ff-side-item"href="#"data-ff-show="#p-guide"><spanclass="ff-icon ff-i-info"></span>Guide</a>
<divclass="ff-side-spacer"></div>
<divclass="ff-side-foot"><ahref="#">About</a><span>v1.2</span></div>
</aside>
<main>
<sectionid="p-normal"class="ff-stack"><h2class="ff-h2">Normal map</h2><pclass="ff-muted">Turn a height map into a normal map.</p></section>
<sectionid="p-height"class="ff-stack" hidden><h2class="ff-h2">Height map</h2><pclass="ff-muted">Paint or import heights.</p></section>
<sectionid="p-pack"class="ff-stack" hidden><h2class="ff-h2">Pack</h2><pclass="ff-muted">3 masks waiting to be packed.</p></section>
<sectionid="p-guide"class="ff-stack" hidden><h2class="ff-h2">Guide</h2><pclass="ff-muted">How each map works.</p></section>
</main>
</div>
Good to know
For a whole tool: put ff-shell right on <body class="ff-page ff-shell">, without the height and border used here.
data-ff-show="#id" on an item shows that panel and hides the others (needs kit.js). Give every other panel hidden at the start.
The same works on tabs (.ff-tab) and chips.
is-on (or aria-current="page") marks the open item: pink marker on the left, pink icon.
Narrow screens: the sidebar turns into a row along the top; group labels and the footer step aside.
Change it
Top bar
ff-topbar
A bar like ours at the top of the site: your tool’s name, a divider, its own links and buttons on the right. Click the links: each one shows its own part.
Texture tools
v1.0
Turn a height map into a normal map.Paint or import heights.Pack masks into one texture.
ff-topbar.html · editable
<headerclass="ff-topbar ff-safe-corner">
<spanclass="ff-topbar-brand"><spanclass="ff-icon ff-i-layers"></span>Texture tools</span>
<spanclass="ff-topbar-sep"></span>
<navclass="ff-topbar-links">
<aclass="ff-topbar-link is-on"href="#"data-ff-show="#t-normal"><spanclass="ff-icon ff-i-mountain"></span>Normal map</a>
<aclass="ff-topbar-link"href="#"data-ff-show="#t-height"><spanclass="ff-icon ff-i-sliders"></span>Height map</a>
<aclass="ff-topbar-link"href="#"data-ff-show="#t-pack"><spanclass="ff-icon ff-i-box"></span>Pack</a>
</nav>
<divclass="ff-topbar-end">
<spanclass="ff-badge">v1.0</span>
<buttonclass="ff-btn ff-btn-secondary ff-btn-sm"><spanclass="ff-icon ff-i-info"></span>Help</button>
</div>
</header>
<sectionid="t-normal"class="ff-card ff-card-body"style="margin-top: 12px">Turn a height map into a normal map.</section>
<sectionid="t-height"class="ff-card ff-card-body"style="margin-top: 12px" hidden>Paint or import heights.</section>
<sectionid="t-pack"class="ff-card ff-card-body"style="margin-top: 12px" hidden>Pack masks into one texture.</section>
Good to know
On FileFortress our own bar is already above your tool (its name, Like, Share, Fullscreen), so keep yours for your tool’s own parts. Don’t copy our links (Home, Explore...): a tool can’t open pages of the site.
data-ff-show="#id" on a link shows that part and hides the others (needs kit.js), like tabs and the sidebar. Give the other parts hidden at the start.
is-on (or aria-current="page") marks the open link; in Fortress Glow it gets our pink-purple glow.
ff-safe-corner keeps the right end free of our Exit button while your tool is fullscreen.
Narrow screens: the links scroll sideways, the name and the right end stay.
Change it
The smaller bar: right under ours on the asset page it doesn’t compete with it.
Sizes come from the same variables: set --ff-topbar-height yourself for any size in between.
Change it
Fullscreen
ff-safe-corner
Visitors can show any web tool fullscreen. Our round Exit button then stays in the top-right corner, so keep that corner free.
Normal map maker
The top bar keeps its buttons out of the corner.
ff-safe-corner.html · editable
<!-- ff-fullscreen here only pretends to be fullscreen for this preview: kit.js puts it on <html> by itself -->
<divclass="ff-fullscreen"style="position: relative; height: 230px; overflow: hidden; border-radius: 16px; border: 1px solid var(--ff-line)">
<headerclass="ff-row ff-safe-corner"style="padding: 12px 16px; border-bottom: 1px solid var(--ff-line)">
<b>Normal map maker</b><spanclass="ff-spacer"></span>
<buttonclass="ff-btn ff-btn-secondary ff-btn-sm"><spanclass="ff-icon ff-i-sliders"></span>Settings</button>
</header>
<divclass="ff-card-body ff-muted">The top bar keeps its buttons out of the corner.</div>
<!-- only for this preview: the corner our Exit button uses in fullscreen -->
<spanstyle="position: absolute; top: 0; right: 0; width: 64px; height: 64px; display: grid; place-items: center; border: 2px dashed rgba(255,255,255,.35); border-radius: 0 16px 0 12px; color: rgba(255,255,255,.7)"><spanclass="ff-icon ff-i-minimize"></span></span>
</div>
Good to know
The Fullscreen button is on every web tool’s page. In fullscreen, our Exit button (40 px, round) sits 12 px from the top and right edges: keep the top-right 64 × 64 px free of buttons and important text. Esc works too.
With kit.js your page gets html.ff-fullscreen while it’s fullscreen, and --ff-safe-corner is 64px then (0px otherwise).
Put ff-safe-corner on a top bar that reaches the right edge: while fullscreen it moves the bar’s content out of the corner (at least 64 px right padding); the rest of the time the bar keeps its own padding.
Your own code can listen too: document.addEventListener('ff-fullscreen', e => e.detail.on).
Change it
Roadmap
ff-road
Done, now, next: where a project stands. On wide screens one line runs through all steps, green to yellow to gray.
Done
Height map in
Drop a picture, see it right away.
Now
Normal maps
Strength, flip green, preview.
Next
Packing
Put masks in one texture.
Later
Presets
Save your settings.
ff-road.html · editable
<olclass="ff-road">
<liclass="ff-road-step is-done"><spanclass="ff-road-dot"><spanclass="ff-icon ff-i-check"></span></span>
<pclass="ff-road-when">Done</p><h3>Height map in</h3><p>Drop a picture, see it right away.</p></li>
<liclass="ff-road-step is-now"><spanclass="ff-road-dot"><spanclass="ff-icon ff-i-construction"></span></span>
<pclass="ff-road-when">Now</p><h3>Normal maps</h3><p>Strength, flip green, preview.</p></li>
<liclass="ff-road-step"><spanclass="ff-road-dot"><spanclass="ff-icon ff-i-clock"></span></span>
<pclass="ff-road-when">Next</p><h3>Packing</h3><p>Put masks in one texture.</p></li>
<liclass="ff-road-step"><spanclass="ff-road-dot"><spanclass="ff-icon ff-i-clock"></span></span>
<pclass="ff-road-when">Later</p><h3>Presets</h3><p>Save your settings.</p></li>
</ol>
Good to know
is-done steps are green, the is-now step yellow, the rest gray.
The line under the steps follows by itself with kit.js. Without it, set style="--ff-road-steps: 4; --ff-road-now: 2" on the list.
Any number of steps works; on narrow screens they wrap into rows.
Change it
Our promise
ff-promises
A few short promises, each with an icon and a line. Good for rules, features or what people can count on.
Nothing leaves
Your pictures stay on your computer.
Fast
Everything happens right here, no waiting.
Yours to keep
Download every result as PNG.
ff-promises.html · editable
<ulclass="ff-promises">
<li><spanclass="ff-promise-icon"><spanclass="ff-icon ff-i-shieldCheck"></span></span>
<b>Nothing leaves</b><p>Your pictures stay on your computer.</p></li>
<li><spanclass="ff-promise-icon"><spanclass="ff-icon ff-i-zap"></span></span>
<b>Fast</b><p>Everything happens right here, no waiting.</p></li>
<li><spanclass="ff-promise-icon"><spanclass="ff-icon ff-i-download"></span></span>
<b>Yours to keep</b><p>Download every result as PNG.</p></li>
</ul>
Good to know
Green by default. Another color: style="--ff-promise: var(--ff-brand)" on the list.
Keep each line short: one idea per promise.
Change it
Code window
ff-win
A window with the three dots and a name, for code, numbers or a preview.
settings.json
// your settings
{ "strength": 2.5, "flipGreen": true }