Offline-first creative and academic tools for the browser. No accounts, no cloud, no tracking. Your work stays on your device.
Three apps, one consistent design system, eight languages.
| App | What it is | For whom |
|---|---|---|
| Paint.web | Raster paint studio with layers, filters, adjustments, and shape tools | Illustrators, photo editors, sketchers |
| Inkling | SVG vector editor with pen, shapes, gradients, layers, boolean ops | Logo designers, icon makers, illustrators |
| Thesis | Academic word processor with ABNT/APA/MLA standards, reference generator, real PDF/DOCX/ODT export | Students, researchers, writers |
- Download the folder.
- Open
index.htmlin any modern browser (Chrome, Firefox, Edge, Safari). - Pick an app from the portal.
That's it. No server, no install, no build step. The suite works from a USB stick, an SD card, or your local disk.
Offline use: Once loaded, all three apps work without an internet connection. The first time you export to PDF / DOCX / ODT, the suite fetches small JavaScript libraries from a CDN; after that they're cached by the browser.
Every app has a global menu bar at the top with the standard menus (File, Edit, View, etc.). Click a menu to drop down its items, or use the keyboard.
Press Alt (or Ctrl+Space) anywhere to open the command palette — a search box that lets you find and run any command by name. Type "export", "layer", "undo", "save" — the palette filters instantly. Press Enter to run.
Press ? (or click the ? button on the menu bar) to see the full list of keyboard shortcuts for the current app.
Eight languages are built in. Switch from the language selector on the menu bar — your choice persists across sessions and apps:
- English (
en) - Português brasileiro (
pt-BR) - Português europeu (
pt-PT) - Italiano (
it) - Français (
fr) - 日本語 (
ja) - Deutsch (
de) - Українська (
uk)
- Auto — follows your operating system preference
- Light — forced light
- Dark — forced dark
Themes sync across all four pages (portal + three apps) automatically.
float-suite/
├── index.html ← Portal / launcher
├── paint.html ← Paint.web (raster)
├── inkling.html ← Inkling (vector)
├── thesis.html ← Thesis (academic word processor)
├── package.json ← Electron + electron-builder config
├── .gitignore
├── README.md ← This file
├── .github/
│ └── workflows/
│ └── build.yml ← GitHub Actions: deb/rpm/pacman/AppImage/dmg/exe
├── electron/ ← Electron wrapper for native packaging
│ ├── main.js ← Main process (window, menu, native dialogs)
│ ├── preload.js ← Minimal context bridge
│ └── build/
│ └── entitlements.mac.plist
├── shared/ ← Shared runtime (loaded by all 4 pages)
│ ├── float.css ← Design tokens, HUD, modals, toasts
│ ├── i18n.js ← 8-language dictionary
│ ├── float.js ← HUD engine, theme, shortcuts, modal manager
│ └── exporters.js ← PDF / DOCX / ODT exporters (lazy-loaded)
├── favicons/ ← Neo-brutalist icon set (SVG + PNG + ICO)
│ ├── float.svg/png/ico ← Portal
│ ├── paint.svg/png/ico ← Paint.web (yellow + paint brush)
│ ├── inkling.svg/png/ico ← Inkling (pink + Blooper squid)
│ └── thesis.svg/png/ico ← Thesis (blue + open book)
└── README.md ← This file
Each app HTML is self-contained — it only depends on shared/ and favicons/. You can host the folder anywhere, or open files directly from disk.
Press ? in any app to see its full shortcut list. The most common ones:
| Shortcut | Action |
|---|---|
Alt |
Open command palette (HUD search) |
Ctrl+Space |
Same — command palette |
? |
Show shortcuts help |
Ctrl+S |
Save / Export |
Ctrl+Z / Ctrl+Y |
Undo / Redo |
Ctrl+A, Ctrl+C, Ctrl+X, Ctrl+V |
Standard edit ops |
Esc |
Close modal / palette / overlay |
H move · B brush · P pencil · E eraser · G fill · I eyedropper · T text · M rect-select · L lasso · W magic wand · C crop · U rectangle · O ellipse · [ ] brush size · X swap colors · D reset colors
V select · A direct select · P pen · B freehand · T text · I eyedropper · R rectangle · E ellipse · L line · Y polygon · S star · H hand · Z zoom · F fit · Ctrl+G group · Ctrl+Shift+G ungroup
Ctrl+B bold · Ctrl+I italic · Ctrl+U underline · Ctrl+F find · Ctrl+L link · Ctrl+K reference · Ctrl+Enter page break · F11 zen mode
| App | Formats |
|---|---|
| Paint.web | PNG, JPEG, WebP, PDF, DOCX (image embedded), ODT |
| Inkling | SVG, PNG, PDF |
| Thesis | PDF, DOCX (true OOXML), ODT, HTML, TXT |
The suite uses jsPDF (lazy-loaded from CDN). The canvas / paper is rasterized at 2× resolution, then sliced into A4 pages with proper margins.
Thesis produces real OOXML .docx files via the docx library. Headings, paragraphs, lists, tables, images (as embedded base64), links, blockquotes, code blocks, and inline formatting (bold / italic / underline / strikethrough) are all preserved. Paint.web wraps the flattened canvas as an image inside a single-paragraph Word document.
The suite generates a valid ODF package (the mimetype file, META-INF/manifest.xml, content.xml, styles.xml) using JSZip. Basic paragraph, heading, list, table, and inline formatting are supported.
| What | Where |
|---|---|
| Theme preference | localStorage["float_theme_mode"] |
| Language preference | localStorage["float_lang"] |
| Paint.web autosave | localStorage["paint_autosave"] |
| Paint.web swatches | localStorage["paint_swatches"] |
| Inkling autosave | localStorage["inkling_autosave"] |
| Thesis documents | localStorage["thesis_docs"] (array of {name, content, standard, modified, wordCount, footnoteCount, cover}) |
| Thesis settings | localStorage["thesis_settings"] |
| Thesis daily word count | localStorage["thesis_words_<YYYY-MM-DD>") |
Nothing else. No cookies, no analytics, no network requests during normal use (except the one-time CDN load for export libraries).
To back up your work, copy the relevant localStorage keys via the browser console:
JSON.stringify({
docs: localStorage.getItem('thesis_docs'),
settings: localStorage.getItem('thesis_settings'),
paint: localStorage.getItem('paint_autosave'),
inkling: localStorage.getItem('inkling_autosave'),
theme: localStorage.getItem('float_theme_mode'),
lang: localStorage.getItem('float_lang')
}, null, 2)Paste the JSON back into localStorage with the same keys.
Tested on the latest stable versions of:
- Chrome / Edge (Chromium)
- Firefox
- Safari
The suite uses modern JavaScript (ES2017+), CSS custom properties, SVG, Canvas 2D, and localStorage. Internet Explorer is not supported.
The suite is intentionally framework-free. Every file is hand-written HTML, CSS, and vanilla JavaScript. The shared layer is three files:
shared/float.css— design tokens (colors, shadows, typography, layout vars), light and dark theme overrides, plus shared components (buttons, modals, toasts, HUD menubar, HUD search overlay, shortcuts overlay, loading screen).shared/i18n.js— a small translation dictionary with 8 locales. ExposesFloatI18n.t(key, vars),FloatI18n.setLang(code),FloatI18n.apply()(walks[data-i18n]elements and updates them), andFloatI18n.on(fn)for change subscriptions.shared/float.js— DOM helpers ($,$$,el), theme manager, modal manager, toast, shortcuts registry, and the HUD engine (Unity-style menu bar + command palette + shortcuts overlay). The HUD is built declaratively from aspecobject that lists menus, items, commands, and shortcuts.shared/exporters.js—canvasToPDF,svgToPDF,htmlToDocx,htmlToODT. LoadsjsPDF,docx, andJSZiplazily on first use.
- Open
shared/i18n.js. - Add the locale code to the
SUPPORTEDarray. - Add a new entry to the
Ddictionary with the same keys asen. - The language automatically appears in the language selector on every app.
Float.registerCommand({
id: 'myapp.doThing',
label: 'Do the thing',
group: 'tools',
run: () => { /* … */ },
shortcut: { mod: ['Ctrl', 'Shift'], key: 'T' } // optional
});The command will appear in the HUD search and (if it has a shortcut) in the shortcuts overlay.
- Include
shared/float.css,shared/i18n.js,shared/float.js,shared/exporters.jsin that order. - Add
<div id="hud-mount"></div>where you want the menu bar to appear. - Call
Float.mountHUD(spec)with your menu spec. - Register commands and shortcuts via
Float.registerCommand(...)andFloat.addShortcut(...).
The suite ships as static HTML/CSS/JS — but it can be wrapped in Electron for native installation on Linux, macOS, and Windows. The repo includes:
electron/main.js— Electron main process. Creates a 1440×900 window, loads the portal, sets a native menu, exposeswindow.floatDesktop.isDesktopto pages.electron/preload.js— minimal context-isolated bridge.package.json— fullelectron-builderconfig for all 6 targets..github/workflows/build.yml— CI that builds everything on push tomain, on PRs, and onv*tags. Tag pushes publish a GitHub Release.
| Format | Platform | Runner | Notes |
|---|---|---|---|
.deb |
Debian / Ubuntu | ubuntu-22.04 | x64 + arm64 |
.rpm |
Fedora / RHEL / SUSE | ubuntu-22.04 | x64 + arm64 |
.pacman |
Arch Linux | ubuntu-22.04 | x64 |
.AppImage |
Universal Linux | ubuntu-22.04 | x64 + arm64 |
.dmg |
macOS | macos-13 | x64 + arm64 (Universal) |
.exe |
Windows | windows-2022 | NSIS installer + portable |
# Install Electron + electron-builder
npm install
# Run as desktop app (dev mode)
npm start
# Build for your current OS
npm run dist:linux # or :mac / :win
# Or build all platforms (cross-compile from any OS, requires extra tooling)
npm run dist:allArtifacts land in electron/dist/.
- Pull request → builds all three platforms but does not publish.
- Push to
main→ builds everything, uploads artifacts to the workflow run (30-day retention). - Tag push
v5.1.0→ builds + publishes a GitHub Release with all 6 formats +SHA256SUMS.txt.
git tag v5.1.0
git push origin v5.1.0The workflow reads these secrets when present and skips signing when absent (so PRs from forks still build):
| Secret | Purpose |
|---|---|
MAC_CERTIFICATE + MAC_CERTIFICATE_PASSWORD |
macOS Developer ID certificate (base64 P12) |
APPLE_ID + APPLE_APP_SPECIFIC_PASSWORD + APPLE_TEAM_ID |
notarization credentials |
WIN_CERTIFICATE + WIN_CERTIFICATE_PASSWORD |
Windows Authenticode cert (base64 PFX) |
Without signing, macOS users will need to right-click → Open the first time, and Windows will show a SmartScreen warning.
Each app has a neo-brutalist icon in 4 formats (SVG + 5 PNG sizes + multi-res ICO). Source SVGs live in favicons/. Re-render all sizes with:
python3 scripts/render_favicons.pyThe set:
- Float Suite (portal) — composite of the three app glyphs in a 2×2 grid
- Paint.web — yellow background with a black/red paint brush
- Inkling — pink background with a black Blooper-style squid (two big eyes, wavy tentacles)
- Thesis — blue background with an open book (yellow bookmark ribbon)
Each app HTML references all icon variants (SVG → PNG sizes → ICO fallback → Apple touch icon).
Float Suite is built by Arik Closs Novais and released for academic and creative use.
The suite bundles the following third-party libraries via CDN (only loaded on first use):
- jsPDF (MIT)
- docx (MIT)
- JSZip (MIT)
- html2canvas (MIT)
- Font Awesome (icons, Free license)
- Google Fonts: Archivo Black, Space Mono, Merriweather
All app code is original.
- Eight-language interface (en, pt-BR, pt-PT, it, fr, ja, de, uk)
- Unity-style HUD with command palette (
Altto open) - Real
.docxexport via thedocxlibrary (was fake.docHTML before) - Real
.odtexport via JSZip (ODF package assembly) - Fixed Paint.web: magic wand, smudge, blur tools now work; invert selection implemented
- Fixed Inkling: boolean ops (via clip-path / mask), align to artboard, snap-to-objects
- Fixed Thesis: PDF export zoom bug fixed, page-break visual artifacts removed, autosave restored
- Cross-app theme sync
- Shortcuts help overlay
- Autosave in Paint.web, Inkling, and Thesis
- Removed dead code, AI-generated boilerplate comments, and unused variables across all four files
- Initial release of the shared design system and i18n layer
- Three apps unified under a single portal
Built for people who finish things — students writing a thesis at 2 a.m., illustrators sketching on a train, designers mocking up a logo between meetings. May your work be yours.