* Show share notifications in the dashboard The dashboard opens its own socket but never listened for notif.* events, so a file shared with a user on the dashboard was announced to nobody. Add a notification center to the dashboard: a bell in the sidebar with the unread count (a dot when collapsed, and on the mobile hamburger), a panel anchored to it — a bottom sheet on phones — listing what the server still holds as unacknowledged, and toasts for what arrives live. Clicking a share lands on Files › Shared with the item selected; dismissing, and "Mark all as read", acknowledge on the server so other tabs clear too. A toast timing out is not a dismissal: the entry stays unread in the panel. Arrivals fold in by uid (a regrouped share rewrites its row and toast in place), the panel refreshes on open, reconnect and tab focus so shares the backend folds in silently past the sender's budget still surface, and a burst on connect is capped at three toasts plus a summary. Backend: notif.unreads carries created_at so delivered-on-connect items can be dated, and listings break same-second ties by id so order is stable. The desktop's mark-ack calls move to a shared helper; UINotification gains an optional auto-hide timeout that pauses on hover/focus. * fix: look up notification glyphs and icons by own key only A notification whose `source` or `icon` was a prototype key such as `constructor` made the glyph lookup return a function, and the toast icon builder then threw inside the socket handler — which dropped the whole burst of toasts it was part of. The list rendered the same entry as "[object Object]". * fix: show dashboard toasts above open app windows App windows opened from the dashboard are stay-on-top and stack in the 99999999+ band, so the toast container at 10000000 sat underneath them: any notification arriving while an app was open — the usual state of a dashboard session — was drawn behind the app and never seen. * fix: reveal the dashboard when a toast is clicked over an open app Clicking a share toast switches the dashboard to Shared, and the "N new notifications" toast opens the panel — both inside the dashboard window. With an app maximized over it, all of that happened out of sight and the click appeared to do nothing. Minimize the covering app windows first, the way the minimize controls do, landing the URL on the dashboard's own route, and act once the history pop has settled so the tab switch is not traversed over. * fix: keep keyboard focus in the notifications panel across re-renders Every change to the list rebuilds its rows, which dropped focus to the document body: dismissing an entry with Enter threw the keyboard out of the dialog (the row it had just been moved to was replaced), and so did any arrival while an entry was focused. Put focus back on the same entry after a render, or on the one that took a dismissed entry's place, and let Shift+Tab from the panel itself wrap to the last control instead of leaving the dialog. * fix: keep the notifications panel inside short viewports The anchored panel is bottom-aligned with the bell and grows upward, but its height was capped only by the viewport (560px or 100vh - 24px), not by the room above the bell — on a short window the header ran off the top of the page. Cap it to that room, so the list scrolls instead. * fix: make notifications with nowhere to go inert in the panel An entry with no target (a worker deploy result) showed a default cursor yet, when clicked, was dismissed and took the panel with it — nothing opened, the entry was gone, and the list had closed. Render such entries as text with the ✕ as their only action; only share entries remain buttons. The ✕ now names its notification for screen readers, since on an inert entry it is the only focusable control. * fix: stop a listing in flight from resurrecting dismissed notifications The list is refreshed on open, on reconnect, and when the tab comes back into view; a dismissal landing while that listing is in flight was undone when it resolved, since the server's snapshot predates the ack. When the listing also resolved after the server's own ack event, nothing removed the entry again and it stayed until the next refresh. Leave out of the reconciliation whatever was acknowledged — here or in another tab — since the listing was requested.
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

