* feat(gui): open dashboard apps maximized in-page with minimize + single instance Apps launched from the dashboard's Apps tab now open as maximized Puter windows in the same page (via launch_app) instead of a new browser tab. External website shortcuts still open in a new tab since arbitrary sites can't reliably be iframed. Dashboard app windows keep their minimize button (fullpage mode normally hides it since there's no taskbar). With no taskbar item to animate toward, hideWindow now hides the window in place and flags it with data-minimized_in_place; showWindow un-hides it via that flag. An explicit flag is used because data-orig-* can't distinguish the two minimize paths - drag/maximize handlers set those attrs too. Tiles are single-instance: clicking a tile un-hides a minimized instance or focuses a visible one instead of launching a duplicate, and launches in flight swallow repeat clicks. Also fixes .window-body-app height in dashboard mode: fullpage mode sizes it to 100% assuming no titlebar, which clipped the bottom 29px of every app. * feat(gui): iOS-style minimize-to-icon morph in dashboard mode Minimizing a window in dashboard mode now zooms it into its app's tile on the Apps tab — but only when the user can see that tile (Apps section active AND the tile on the pager page currently in view); otherwise the existing hide-in-place fade is kept, as on phones and with prefers-reduced-motion. The animation is a two-layer morph on one 450ms cubic-bezier(0.32, 0.72, 0, 1) path: the live window scales onto the tile's icon box (transform + opacity only — no per-frame iframe reflow) while its corner radius grows toward the icon squircle, and an enlarged clone of the icon flies congruently with it, cross-fading in as the window fades out and landing exactly on the real icon's slot (hidden until the handoff), so the window reads as becoming the icon. Window geometry is never touched: only inline transform/opacity/radius are set and restored byte-identical when the animation ends, and showWindow()'s existing minimized-in-place path restores as before — including a reopen mid-animation. * fix(gui): keep the minimize-morph ghost icon square (contain-fit) The icon clone previously mapped rect-onto-rect over the window, which stretched the square icon anamorphically. A covering square was tried and jittered: it protruded past the card's short edge and the halo popped in mid-crossfade. Contain-fit resolves both: the ghost scales uniformly (always square), sized to the window's short edge and centered — its side tracks the card's short edge exactly for the whole flight (both interpolate linearly between the same endpoints on the same curve), so the card's rectangular flanks melt away around a steady, undistorted icon. * feat(gui): add 'Open in new tab' to app tile context menu Every tile's right-click menu now leads with Open in new tab, which opens the app the way tiles did before in-page windows: /app/<name> in a new browser tab (noopener), or the site link for external tiles. Non-uninstallable apps previously had no menu at all; they now get this single item, and uninstallable ones show it above a divider + Uninstall. * feat(gui): reverse morph — dashboard tile icons zoom into their opening window Opening an app in dashboard mode now runs the minimize morph backwards: the window grows out of its tile's icon box (transform + opacity only, radius relaxing from the 22% squircle to the resting value) while a clone of the icon enlarges IN PLACE on its slot — capped at 2.5x, fully dissolved by ~250% growth — as the window fades in underneath on the same 450ms cubic-bezier(0.32, 0.72, 0, 1) path with the crossfade handoff mirrored (window in at 80-240ms, ghost out at 120-320ms). Both open paths get the morph, with the same visibility conditions as minimize (Apps section active, tile on the pager page in view, not phone, no reduced motion), falling back to the existing fades otherwise: - fresh launch: TabApps passes window_options.morph_from_dashboard_tile, and UIWindow morphs instead of the 70ms opening fade. Since .window is display:none from the stylesheet until later in the pipeline, the hook shows it before measuring (nothing has painted yet, so neither the early show nor the hide-back on a declined morph can flash). - un-minimize: showWindow's minimized-in-place branch morphs instead of fadeIn(150), keeping the z-index bump and 80ms focus timing. A data-window_morphing flag guards against opposing morphs fighting over the window's inline styles: minimize clicked mid-open-zoom (or a tile click mid-minimize-zoom) falls back to the pre-morph fade behavior, and each animation still restores every inline property byte-identical when it ends. * Update dashboard.css * feat(gui): cap the open-morph ghost icon at 2x, dissolving in place The tile icon no longer flies toward the window center nor grows to full contain-fit (10x+ reads as a giant blurry sticker): it enlarges in place on its own slot and its growth is capped so the fade-out completes right around 200% of its size — the window alone carries the motion and the rest of the growth. * fix(gui): drop the tile :active press-shrink that stuttered the open morph Clicking a tile launches the app and the open morph grows the icon in place — the 0.95 press-shrink made every launch read as shrink-then-grow. The icon now holds its hover scale through the click and enlarges straight from there (the morph ghost is measured from the rendered rect, so it picks up the hovered size seamlessly).
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

