* fix(dashboard): close the Apps modals and folders only on a press that starts on the backdrop The uninstall and add-app modals and the open folder closed on any click whose target was their backdrop. Drag-selecting text in the app request box and releasing outside the card lands that click on the backdrop, so the modal and the typed request were thrown away. The backdrop logic the dashboard dialogs already use moves into bindBackdropDismiss, and the three Apps overlays use it too. * fix(dashboard): double-clicking "Add an app" no longer opens App Center The add-app modal opens under the pointer, so the second click of a double-click on the "+" tile landed on its first option and launched App Center (or the AI builder, depending on where the tile sat) without the user choosing anything. An option now ignores the second click of a double-click. * fix(dashboard): act on an app tile once per double-click A tile acted on every click, so a double-click opened an external app's site in two browser tabs. Double-clicking an option in the add-app modal also launched whichever tile sat under the pointer once the modal had closed (App Center and Recorder together, say). A tile now ignores the second click of a double-click; the first already launched, focused or opened what was asked for. * fix(gui): show app launch refusals in a Puter alert, translated launchApp reported "You don't have access to …" and "Couldn't open …" through window.UIAlert, which nothing defines, so both fell through to the browser's native alert(): a blocking, unstyled, English-only dialog over the dashboard or desktop. They now use UIAlert directly, with the text in en.js, and pass the app title unencoded since UIAlert encodes its message itself. * fix(dashboard): clicking a toast with nothing to open keeps apps on screen A toast click brings the dashboard forward before acting on the notification, hiding every app window. Only share notifications lead anywhere, so clicking an "events subscription ended" toast (or any other type) to dismiss it minimized the app the user was working in and showed a dashboard with nothing to look at. Those toasts now just mark the notification read. * fix(dashboard): show an emptied Trash as empty Emptying the Trash from the Files tab took its rows away but left the footer on "N items · X MB" and the pane blank, without the empty-folder notice; the selection bar kept offering actions on rows that were gone. Emptied from another tab, the listing was cleared with .empty(), which also dropped the loading overlay and likewise never updated the footer. Both paths now finish with the empty notice and a fresh footer. * fix(dashboard): say a folder is empty when its last item goes elsewhere When another tab, device or app deleted or moved away the last item in the folder Files was showing, its row faded out and left a blank pane: the item.removed and item.moved handlers updated the footer but never put the "folder is empty" notice up. They now do, for rows that were in the Files listing. * fix(dashboard): list failed drag-and-drop uploads one per line The upload-button path was fixed to put each failed item on its own line, but files dropped onto the listing still joined them with "\n", which UIAlert's HTML collapses into spaces: every failure ran together on one line. Both paths now build the message in failedUploadsMessage. * fix(dashboard): dropping items back into their own folder does nothing Dropping a selection on the sidebar entry for the folder it came from, or spring-loading into a folder and coming back to release in the listing, asked move_items to move every item where it already was, and each one stopped on a "Cannot move item to its current location" alert in turn. The breadcrumbs already ignore such a drop; moveDraggedRows now leaves those rows out too, and a drop with nothing left to move does nothing. * fix(dashboard): a Ctrl- or Alt-drop on the Trash trashes the items Ctrl-dragging a file onto the sidebar Trash (or a Trash breadcrumb) copied it into the Trash: the original stayed put, and the copy carried no original path, so it was offered Restore and Restore failed. Alt-drops made shortcuts there the same way. The four drop handlers' copy/shortcut/move choice moves into dropRowsInto, which only ever trashes what lands on the Trash. * fix(dashboard): the first row click after a marquee released outside Files counts A marquee sets a flag so the click that ends it doesn't clear the new selection; the listing's click handlers consume it. Released over the sidebar or outside the window, that click lands elsewhere, the flag stayed set, and it swallowed the user's next click on a row. The flag now lapses once the release's own click has had its turn. * fix(dashboard): Back and Forward follow a folder the user renamed Open a folder, go back, rename it, then press Forward: history still held the old path, so Files showed "This folder couldn't be opened", and the Back/Forward long-press menus listed the old name. A folder renamed in Files now rebases the history entries in and under it, using the same path rebase the username-change handler does. * fix(dashboard): a folder that can't be opened becomes the current folder When a folder failed to list (deleted elsewhere, share revoked, offline), Files said "This folder couldn't be opened" but stayed on the previous folder underneath: history had moved on while the breadcrumbs, sidebar highlight and New Folder/Upload/Paste still pointed at the old folder, so a new folder or upload landed somewhere other than where the user seemed to be. The tab now moves to the folder it was asked for before showing the message, and creates nothing in it until it lists again. * fix(dashboard): double-clicking Save in the photo crop uploads it once Save closes the crop dialog, but the dialog stays in the page for its 200ms fade-out with its handlers live, so the second click of a double-click ran Save again and sent the profile picture to the server twice. Save does nothing once the dialog has closed.
The Open-Source Internet Computer!
« LIVE DEMO »
Puter.com
·
App Store
·
AI Builder
·
Developers
·
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
To run this checkout with Docker, follow Building from source. Create a local docker-compose.override.yml to select the local build; keeping these settings out of docker-compose.yml avoids conflicts when pulling updates and keeps local configuration out of pull requests.
🚀 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.
- X (Twitter): x.com/HeyPuter
- 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 / മലയാളം
- Dutch / Nederlands
- Polish / Polski
- Odia / ଓଡ଼ିଆ
- 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

