diff --git a/CHANGELOG.md b/CHANGELOG.md
index b41b573..fef9d43 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -6,6 +6,11 @@ Das Format folgt [Keep a Changelog](https://keepachangelog.com/de/1.1.0/), die V
## [Unreleased]
+## [0.21.0] - 2026-10-31
+
+### Added
+- Teilen aus anderen Apps: Geteiltes landet wie bisher sofort im Quick Dump. Die Meldung danach bietet ein paar Sekunden lang **→ Aufgabe** und **→ Liste** an, um es mit einem Tipp stattdessen dort abzulegen (bei nur einer beschreibbaren Liste direkt, sonst mit kurzer Listenauswahl). Wer nichts tippt, behält den gewohnten Ablauf.
+
## [0.20.0] - 2026-10-31
### Changed
@@ -445,7 +450,8 @@ Das Format folgt [Keep a Changelog](https://keepachangelog.com/de/1.1.0/), die V
- Geteilte Listen (Einkaufs-, Pack- und Checklisten) mit `#Kategorie`-Gruppierung, Mengenangaben und Echtzeit-Abhaken.
- Benutzer-, Gruppen- und Admin-Verwaltung (Ersteinrichtungs-Assistent, Einladungscodes, Profilbilder, persönliche API-Keys & Webhook-Ingest `/api/v1/webhooks/ingest`, JSON-Datenexport) sowie CSS-Theme-Engine mit 4 Themes (`Dark`, `Light`, `High Contrast`, `Soft`) und PWA-Unterstützung.
-[Unreleased]: https://git.dsit.me/sandrodach/MindSift/compare/v0.20.0...dev
+[Unreleased]: https://git.dsit.me/sandrodach/MindSift/compare/v0.21.0...dev
+[0.21.0]: https://git.dsit.me/sandrodach/MindSift/compare/v0.20.0...v0.21.0
[0.20.0]: https://git.dsit.me/sandrodach/MindSift/compare/v0.19.0...v0.20.0
[0.19.0]: https://git.dsit.me/sandrodach/MindSift/compare/v0.18.1...v0.19.0
[0.18.1]: https://git.dsit.me/sandrodach/MindSift/compare/v0.18.0...v0.18.1
diff --git a/README.md b/README.md
index b3401e6..c0eb84d 100644
--- a/README.md
+++ b/README.md
@@ -6,7 +6,7 @@
[](#)
[](#-schnellstart)
[](#-deine-daten-gehören-dir)
-[](CHANGELOG.md)
+[](CHANGELOG.md)
**MindSift** ist eine selbst gehostete Schaltstelle für spontane Gedanken, Aufgaben mit Kanban-Board, hierarchische Outliner-Notizen, die mehrere Personen gleichzeitig bearbeiten können, und gemeinsame Listen. Alles läuft als ein einzelner Container mit eingebetteter SQLite-Datenbank, auf deinem eigenen Server.
@@ -39,7 +39,7 @@ Die meisten Notiz- und Aufgaben-Apps verlangen Struktur im falschen Moment: Wenn
* Eingabeleiste im Kopf der App, jederzeit mit `C` oder `/` fokussierbar; auch per Spracheingabe: über den Browser oder datenschutzfreundlich über einen eigenen Whisper-Container (optional in `docker-compose.yml`, siehe [Architektur](Doku/architecture.md#spracherkennung)); auf Smartphones auch per Gedrückthalten des `+`-Knopfs (Hold-to-Record mit Pegel-Wellen).
* Ziel beim Erfassen wählbar: Posteingang, Aufgabe, Listeneintrag oder Notiz.
* **Triage-Deck:** `H`/`←` verwerfen, `L`/`→` zur Aufgabe, `T` Aufgabe mit Termin, `D` in Notiz verwandeln, Leertaste = später. Auf dem Smartphone per Wischgeste oder über große Knöpfe unter der Karte; die Warteschlange klappt bei Bedarf auf.
-* **Teilen aus anderen Apps:** Als installierte App erscheint MindSift im Teilen-Menü des Smartphones; geteilte Texte und Links landen im Posteingang.
+* **Teilen aus anderen Apps:** Als installierte App erscheint MindSift im Teilen-Menü des Smartphones; geteilte Texte und Links landen im Posteingang und lassen sich direkt danach mit einem Tipp zur Aufgabe oder auf eine Liste schicken.
* Papierkorb mit Wiederherstellen.
diff --git a/frontend/package-lock.json b/frontend/package-lock.json
index cee0a00..cb52abb 100644
--- a/frontend/package-lock.json
+++ b/frontend/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "mindsift-frontend",
- "version": "0.20.0",
+ "version": "0.21.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "mindsift-frontend",
- "version": "0.20.0",
+ "version": "0.21.0",
"license": "Unlicense",
"dependencies": {
"@fontsource-variable/inter": "5.3.0",
diff --git a/frontend/package.json b/frontend/package.json
index c49a278..c118634 100644
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -1,7 +1,7 @@
{
"name": "mindsift-frontend",
"private": true,
- "version": "0.20.0",
+ "version": "0.21.0",
"license": "Unlicense",
"type": "module",
"scripts": {
diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx
index 1a0f95a..358a61c 100644
--- a/frontend/src/App.tsx
+++ b/frontend/src/App.tsx
@@ -56,6 +56,7 @@ import { WorkspaceView } from './features/workspace/WorkspaceView';
import { SharedListsView } from './features/lists/SharedListsView';
import { SetupAndAuthView } from './features/auth/SetupAndAuthView';
import { OfflineBanner } from './components/OfflineBanner';
+import { SharedImportToast } from './components/SharedImportToast';
import { outboxCount, clearOfflineData } from './lib/offline';
import { DemoCountdown } from './components/DemoCountdown';
import { UserSettingsView } from './features/settings/UserSettingsView';
@@ -136,6 +137,9 @@ export const App: React.FC = () => {
const [demoDeadline, setDemoDeadline] = useState(null);
const [dataEpoch, setDataEpoch] = useState(0);
const [demoNotice, setDemoNotice] = useState(null);
+ // Just shared from another app: these Quick Dump entries can still be sent on as task / list item
+ const [sharedImportIds, setSharedImportIds] = useState(null);
+ const closeSharedImport = useCallback(() => setSharedImportIds(null), []);
const lastDemoResetRef = useRef(0);
const handleDemoResetRef = useRef<() => void>(() => {});
// Link from the password reset mail (?resetToken=…); removed from the address bar right away
@@ -601,18 +605,25 @@ export const App: React.FC = () => {
if (shares.length === 0) return;
let importedCount = 0;
+ const ids: string[] = [];
for (const share of shares) {
const content = formatSharedThought(share);
if (content) {
- await api.captureThought(content, 'normal', 'manual', '', { target: 'inbox' });
+ const created = await api.captureThought(content, 'normal', 'manual', '', { target: 'inbox' });
importedCount++;
+ if (created?.id && !created.id.startsWith('th_offline_')) ids.push(created.id);
}
}
if (importedCount > 0) {
triggerHaptic(15);
- setDemoNotice('Erfolgreich im Quick Dump abgelegt');
- setTimeout(() => setDemoNotice(null), 4000);
+ if (ids.length === importedCount) {
+ setSharedImportIds(ids);
+ } else {
+ // Offline: kept for later, nothing to convert yet
+ setDemoNotice('Im Quick Dump abgelegt');
+ setTimeout(() => setDemoNotice(null), 4000);
+ }
refreshAll();
}
} catch (err) {
@@ -1184,6 +1195,19 @@ export const App: React.FC = () => {
+ {sharedImportIds && (
+ {
+ setSharedImportIds(null);
+ setDemoNotice(message);
+ setTimeout(() => setDemoNotice(null), 3000);
+ refreshAll();
+ }}
+ />
+ )}
{demoNotice && (