* Dashboard: headless full-tab apps with a floating control pill Maximized app windows in dashboard mode no longer render a titlebar — the app covers the full tab. The head's controls move to lighter-weight affordances: - A floating pill overlaid top-center of the app (parent DOM, above the iframe): expanded it shows the app icon, title, minimize, and close; it opens expanded so first-time and deep-link users see it, then collapses to a subtle capsule that re-expands on hover, tap, or keyboard focus. Minimize routes through the same URL-entry consumption as the Back button; close tears the window down normally. Dark translucent glass so it reads over any app content; safe-area aware; bigger targets on coarse pointers; title hidden under 500px; respects prefers-reduced-motion. - Apps-tab tiles double as the app switcher: a macOS-dock-style running dot marks tiles with a live (visible or minimized) window, and the tile context menu gains a Quit item for running apps. UIWindow broadcasts window open/close so the dots stay current. - puter.ui.setWindowTitle also updates the pill title. Only maximized, URL-owning app windows in dashboard mode go headless: dialogs, explorer, non-maximized child windows, and everything on the desktop keep their titlebars. dashboard.css's 29px head-height compensation is scoped to windows that still have heads, so headless app bodies fill the window exactly. * Fix pill buttons swallowed by their own hover halo The pill's invisible hover halo (an absolutely-positioned ::after with negative inset) painted above the pill's static children, so real pointer clicks hit-tested to the halo and never reached the minimize/ close buttons — while element.click() (which skips hit-testing) worked, hiding the bug from programmatic checks. Stack the halo at z-index -1 (the pill is its own stacking context, so the outside ring still sits above the app's iframe) and raise the interactive children explicitly. * Review round: pill/dashboard edge-case fixes - Latch pop_dashboard_app_url while its history.back() is in flight: a double-click on minimize (or a close racing a minimize) issued two back()s, and the second popped the dashboard's own entry — navigating clean out of the page. Any popstate or push settles the latch. - Close a running app's windows when it is uninstalled: the tile is a headless app's only switcher, so a minimized instance would otherwise be stranded — impossible to restore or quit. - puter.ui.setWindowTitle in dashboard mode now also updates the browser-tab title (while that app owns the URL) and the window's data-name, so a later restore re-applies the app's current title instead of its launch-time one. Desktop behavior unchanged. - Nudge collapsed-pill contrast (opacity 0.55 → 0.65, border alpha 0.16 → 0.22) so the capsule stays findable over dark app content. * Adjust dashboard tile spacing and label sizing Tweaks My Apps tile layout constants to match the real icon/label geometry: tile height is increased, label top margin is widened, and the running-status dot is moved slightly lower to avoid overlap during icon hover scaling. It also raises dashboard app pill title line-height to prevent descenders from being clipped when ellipsis overflow is active. * Pill and running-dot visual polish - Fixed-width pill: the title gets a fixed 150px centered box instead of a cap, so every app's pill is identical and the minimize/close buttons sit at the same screen position in every app — they're operated by muscle memory, like any titlebar's controls. - Give the pill title line-height 1.35: overflow:hidden (needed for the ellipsis) also clips vertically, and at line-height 1 it cut the descenders off g/p/y. - More air around the tile running dot: label margin 6px → 10px and the dot 2px lower (tile row height 78px → 82px to keep the label line in budget — the pager layout reads the CSS var, so it follows). The icon's 1.08x hover growth no longer touches the dot. * Size the pill icon to balance the capsule 16px read as undersized next to the 26px buttons in the 36px capsule — bump the expanded icon to 20px with a proportional (25%) radius, and object-fit: cover in case an app icon isn't square. Collapsed size is unchanged.
The Open-Source Internet Computer!
« LIVE DEMO »
Puter.com
·
App Store
·
Developers
·
Discord
·
Reddit
·
X
Puter
Puter is an advanced, open-source, self-hostable internet computer designed to be feature-rich, fast, and highly extensible.
For Users
Puter's goal is to provide you with every app and feature you need to work, create, and play under one roof. From a simple Notepad and Voice Recorder to Spreadsheet and Camera, Puter wants to be the all-in-one solution for your digital life.
For Developers
Puter provides everything you need to build and publish web apps and games. From AI to Cloud Storage and Database to Serverless Workers, Puter has you covered. Puter also helps you get users! Once you build your app, you can publish it on our App Store to reach and monetize users.
Getting Started
💻 Local Development
git clone https://github.com/HeyPuter/puter
cd puter
npm install
npm start
→ This should launch Puter at http://puter.localhost:4100
🚀 Self-Hosting
Linux/macOS
curl -fsSL https://puter.com/selfhost | sh
Windows
irm https://puter.com/selfhost?os=windows | iex
→ For more details, see Self-Hosting Puter.
☁️ Puter.com
Puter is available as a hosted service at puter.com.
Support
Connect with the maintainers and community through these channels:
- Bug report or feature request? Please open an issue.
- Discord: discord.com/invite/PQcx7Teh8u
- X (Twitter): x.com/HeyPuter
- Reddit: reddit.com/r/puter/
- Mastodon: mastodon.social/@puter
- Security issues or abuse reports? security@puter.com
- Email maintainers at hi@puter.com
We are always happy to help you with any questions you may have. Don't hesitate to ask!
License
This repository, including all its contents, sub-projects, modules, and components, is licensed under AGPL-3.0 unless explicitly stated otherwise. Third-party libraries included in this repository may be subject to their own licenses.
Translations
- Arabic / العربية
- Armenian / Հայերեն
- Bengali / বাংলা
- Chinese / 中文
- Danish / Dansk
- English
- Farsi / فارسی
- Finnish / Suomi
- French / Français
- German / Deutsch
- Hebrew/ עברית
- Hindi / हिंदी
- Hungarian / Magyar
- Indonesian / Bahasa Indonesia
- Italian / Italiano
- Japanese / 日本語
- Korean / 한국어
- Malay / Bahasa Malaysia
- Malayalam / മലയാളം
- Polish / Polski
- Portuguese / Português
- Punjabi / ਪੰਜਾਬੀ
- Romanian / Română
- Russian / Русский
- Spanish / Español
- Swedish / Svenska
- Tamil / தமிழ்
- Telugu / తెలుగు
- Thai / ไทย
- Turkish / Türkçe
- Ukrainian / Українська
- Urdu / اردو
- Vietnamese / Tiếng Việt

