* feat: one recipient field in the sharing dialogs, with suggestions Both sharing dialogs asked twice: a text field for a person, and a separate select, label, note and button for a team. Which control to use was a fact about the API — a bare string is read as an email or a username, so a team could not be typed — not something a user should have to know. Now there is one field. Clicking it offers who this account shared with before, the teams it belongs to, and the people in them; typing narrows the list. Choosing an offer locks the field to that recipient, so a team picked by name still goes out by uid, and the note about a team grant reaching everyone in it appears at the moment it applies. Anyone already on the access list is left out of the offers, and a typed address still works untouched. Past recipients are kept in the account's key-value store, so they follow the user between browsers; a typed address that turned out to belong to an account is filed under the username the backend resolved. Colleagues are read one page per team, cached for five minutes, and only looked up once the field is actually used. The picker is one helper shared by both dialogs so the two can't drift, styled through `share-suggest-*` tokens each host restates in its own palette. It opens in the flow rather than floating, which a scrolling modal body and a mobile bottom sheet would otherwise clip. * fix: float the recipient suggestions instead of resizing the dialog The list opened in the flow, which pushed the Share button and everything under it down and back up as it opened and closed — a dialog that resizes under the cursor. It now hangs off the recipient row, out of the flow, and floats over what follows it. It goes inside the row rather than after it, so the row is its containing block; as a sibling it resolved against whatever was positioned further up and landed at the bottom of the scrolling body. Being out of flow it can be cut off by that scroll container rather than scrolling itself, so on open it measures the room between the row and the nearest clipping ancestor, caps the list to it, and opens upwards where below is too tight. * fix: keep the recipient field focused when the picker is wired onto it Both sharing dialogs focus the recipient field as they open, and the picker then moves that field into its wrapper. Moving an element takes it out of the document for an instant, which drops its focus, so every dialog opened with the caret in the field opened with the caret on <body> instead. * fix: keep the recipient suggestions inside the screen The list sized itself against the nearest clipping ancestor alone. That ancestor is the dialog's own scrolling body, which reaches past the bottom of a short screen — or of any screen once the dialog has been dragged low — so the list was placed below the fold and the user saw nothing at all. The viewport bounds it too. * fix: stop the suggestions flashing a loading box over the dialog Clicking the recipient field put up a panel saying it was loading before it knew there was anything to load. For the many accounts with no teams and nobody shared with before, that panel covered the Share button for as long as the round trip took and then vanished again. It now waits a beat before saying anything, and leaves whatever is already listed in place while a reload is in flight. A list still on its way also no longer swallows the Escape that closes the dialog. * fix: do not double-encode the recipient field's placeholder `i18n()` encodes what it returns, which is right for a string dropped into markup and wrong for one handed to `.attr()` — the entities show up as themselves. Nothing is lost today because only English carries the key, but the next translation with an apostrophe in it would read `l'équipe`. * chore: drop the styles for the team picker the field replaced The desktop dialog's separate team control went with the one recipient field; its rules stayed behind. The dashboard's equivalents were already removed with its own markup. * fix: let Enter share from the desktop dialog's recipient field Typing a name and pressing Enter did nothing there: the field is in no form, so the only way to send was to reach the button. The Dashboard's dialog has always submitted on Enter, and the field now takes Enter to choose a suggestion, which makes a second press that does nothing read as a dead key. The picker still gets the press first while it is choosing a row.
The Open-Source Internet Computer!
« LIVE DEMO »
Puter.com
·
App Store
·
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
🚀 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

