Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
43 commits
Select commit Hold shift + click to select a range
f1d4b07
fix(deps): update YAML and sanitizer security patches
Kechos23 Oct 11, 2026
fb28777
fix(storage): retain newer recovery journals after saves
Kechos23 Oct 11, 2026
4353a54
fix(review): recover comment metadata without losing newer replies
Kechos23 Oct 11, 2026
855d593
fix(editor): prevent reference chooser from stealing input focus
Kechos23 Oct 11, 2026
de4f5e8
fix(storage): coordinate deletions with queued document saves
Kechos23 Oct 11, 2026
07db99f
fix(storage): refuse destructive desktop document move collisions
Kechos23 Oct 11, 2026
d5d28ec
fix(storage): guard workspace replacement against pending operations
Kechos23 Oct 11, 2026
21905e6
docs(storage): explain recovery and workspace maintenance boundaries
Kechos23 Oct 11, 2026
bf0e404
test(storage): seed persisted document for stale writer move
Kechos23 Oct 11, 2026
3596f33
test(theme): compare final tokens after animated theme changes
Kechos23 Oct 11, 2026
54fcbae
test(trash): synchronize persistence and allow selection order
Kechos23 Oct 11, 2026
042c08f
fix(editor): prevent deferred media chooser focus from redirecting input
Kechos23 Oct 11, 2026
42d6c06
fix(editor): prevent deferred table chooser focus from changing row i…
Kechos23 Oct 11, 2026
f1b4041
feat(storage): isolate linked recovery hierarchy and detach imported …
Kechos23 Oct 11, 2026
8c3c1cf
feat(desktop): integrate reviewed linked workflows and draft safety g…
Kechos23 Oct 11, 2026
b3a1a72
test(desktop): cover linked safety and folder workflows without custo…
Kechos23 Oct 11, 2026
eee37bd
docs(desktop): explain linked workflows and filesystem safety boundaries
Kechos23 Oct 11, 2026
9e8b706
feat(i18n): complete reviewed Linked Workspace UI catalogs
Kechos23 Oct 11, 2026
d6762f2
fix(linked): persist new folder roots before scanning
Kechos23 Oct 12, 2026
578b987
fix(linked): require durable metadata before scan success
Kechos23 Oct 12, 2026
0598011
fix(linked): normalize Windows UNC source identities
Kechos23 Oct 12, 2026
9fce0a1
fix(i18n): preserve copy import labels across language updates
Kechos23 Oct 12, 2026
250a98e
fix(linked): serialize concurrent folder registration commits
Kechos23 Oct 12, 2026
637ae5f
test(linked): verify organization write failures through desktop backend
Kechos23 Oct 12, 2026
76f01e7
fix(linked): reject managed Vault source and export destinations
Kechos23 Oct 12, 2026
634c95d
fix(linked): persist scanned documents before reporting completion
Kechos23 Oct 12, 2026
6964424
fix(linked): distinguish conflict recovery from requested conversion …
Kechos23 Oct 12, 2026
afac215
test(ui): align broad menu assertions with copy import labels
Kechos23 Oct 12, 2026
c3f8f37
test(linked): verify managed path guards and IndexedDB session bounda…
Kechos23 Oct 12, 2026
50a5668
fix(i18n): translate incomplete linked scan notification
Kechos23 Oct 12, 2026
d6a2c50
fix(workspace): resolve linked workspace review findings
ThisIs-Developer Oct 17, 2026
638d0e0
fix(workspace): resolve main conflicts and preserve linked exclusions
ThisIs-Developer Oct 22, 2026
1cdf40b
fix(workspace): preserve open menus during draft persistence
ThisIs-Developer Oct 23, 2026
60e1463
fix(ui): simplify linked workspace controls and guide
ThisIs-Developer Oct 23, 2026
2495eb7
fix(desktop): resolve linked workspace icon mask URL
ThisIs-Developer Oct 23, 2026
2b2c62c
fix(ui): restore linked workspace chain icon
ThisIs-Developer Oct 24, 2026
b871d1f
docs(linked-workspace): redesign the welcome guide
ThisIs-Developer Oct 24, 2026
70038b3
docs(workspace): simplify welcome guide and use book icons
ThisIs-Developer Oct 24, 2026
f702e60
fix(desktop): allow native path normalization for linked files
ThisIs-Developer Oct 24, 2026
8971979
style(ui): use plain file icons for documents
ThisIs-Developer Oct 26, 2026
4146f9c
feat(linked-workspace): show progress while linking folders
ThisIs-Developer Oct 26, 2026
614fb9d
fix(explorer): disable header context menu and reorder actions
ThisIs-Developer Oct 27, 2026
83ab4fa
style(explorer): separate linking actions from Trash
ThisIs-Developer Oct 27, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 9 additions & 1 deletion assets/i18n/audit-ui-locales.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,13 @@ import { readFile, readdir } from 'node:fs/promises';

const CATALOG_DIR = new URL('./', import.meta.url);
const EXPECTED_LOCALES = ['bg', 'de', 'en', 'es', 'fr', 'it', 'ja', 'ko', 'pl', 'pt', 'ru', 'tr', 'tw', 'uk', 'zh'];
// Keyboard key names and bare capacity values may legitimately remain identical.
// Keep the exception finite: ordinary untranslated UI labels must still fail.
const SHARED_TECHNICAL_LITERALS = ['Alt', 'Tab', 'Cmd', 'F11', 'F3', '10 MB.', '20 MiB.'];
const REVIEWED_IDENTICAL_TRANSLATIONS = {
de: ['Option'],
it: ['$$ formula $$', ...Array.from({ length: 6 }, (_, index) => `Desktop: Ctrl/Cmd+${index + 1}`)]
};
const ALLOWED_IDENTICAL_TRANSLATIONS = {
bg: ['{{0}}m', '{{0}}m {{1}}s', '{{0}}s', 'Ab', 'Ctrl', 'Git Graph', 'GitHub', 'GitHub URL', 'h1, h2, h3, h4, h5, h6', 'HTML', 'JavaScript', 'Markdown (.md)', 'Markdown Viewer', 'MD', 'PDF', 'PNG', 'Shift', 'SVG', 'ThisIs-Developer'],
de: ['Neutral', '{{0}}m', '{{0}}m {{1}}s', '{{0}}s', 'Ab', 'Explorer', 'FAQ', 'h1, h2, h3, h4, h5, h6', 'HTML', 'JavaScript', 'Link', 'Markdown (.md)', 'Markdown Viewer', 'MD', 'Name', 'PDF', 'PNG', 'SVG', 'ThisIs-Developer', 'Version', 'Wrap'],
Expand Down Expand Up @@ -54,6 +61,7 @@ addFailures(failures, 'en', 'non-English source pollution', englishKeys.filter(s
addFailures(failures, 'en', 'non-interface source key', englishKeys.filter(source =>
/^\d+\.\d+\.\d+(?:-[\w.-]+)?$/i.test(source)
|| /^bi(?:\s+bi-[\w-]+)+$/i.test(source)
|| /\[[\w-]+[~|^$*]?=[^\]]*\]/.test(source)
|| /(?:^|\s)(?:style|class|id|aria-[\w-]+|data-[\w-]+|role|tabindex)=/i.test(source)
));

Expand All @@ -75,7 +83,7 @@ for (const locale of files) {
|| (key.includes('Markdown') && !catalog[key].includes('Markdown'))
));
if (locale !== 'en') {
const allowed = new Set(['GitHub', ...(ALLOWED_IDENTICAL_TRANSLATIONS[locale] || [])]);
const allowed = new Set(['GitHub', ...SHARED_TECHNICAL_LITERALS, ...(ALLOWED_IDENTICAL_TRANSLATIONS[locale] || []), ...(REVIEWED_IDENTICAL_TRANSLATIONS[locale] || [])]);
if (locale === 'de') allowed.add('Smileys');
if (locale === 'fr') allowed.add('Nature');
addFailures(failures, locale, 'unexpected English fallback', keys.filter(key =>
Expand Down
490 changes: 428 additions & 62 deletions assets/i18n/bg.json

Large diffs are not rendered by default.

490 changes: 428 additions & 62 deletions assets/i18n/de.json

Large diffs are not rendered by default.

554 changes: 460 additions & 94 deletions assets/i18n/en.json

Large diffs are not rendered by default.

490 changes: 428 additions & 62 deletions assets/i18n/es.json

Large diffs are not rendered by default.

490 changes: 428 additions & 62 deletions assets/i18n/fr.json

Large diffs are not rendered by default.

490 changes: 428 additions & 62 deletions assets/i18n/it.json

Large diffs are not rendered by default.

490 changes: 428 additions & 62 deletions assets/i18n/ja.json

Large diffs are not rendered by default.

490 changes: 428 additions & 62 deletions assets/i18n/ko.json

Large diffs are not rendered by default.

490 changes: 428 additions & 62 deletions assets/i18n/pl.json

Large diffs are not rendered by default.

490 changes: 428 additions & 62 deletions assets/i18n/pt.json

Large diffs are not rendered by default.

490 changes: 428 additions & 62 deletions assets/i18n/ru.json

Large diffs are not rendered by default.

490 changes: 428 additions & 62 deletions assets/i18n/tr.json

Large diffs are not rendered by default.

490 changes: 428 additions & 62 deletions assets/i18n/tw.json

Large diffs are not rendered by default.

490 changes: 428 additions & 62 deletions assets/i18n/uk.json

Large diffs are not rendered by default.

490 changes: 428 additions & 62 deletions assets/i18n/zh.json

Large diffs are not rendered by default.

58 changes: 58 additions & 0 deletions assets/linked-workspace-guide.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
# Welcome to Linked Workspace

**Open and edit files already on your computer—right inside Markdown Viewer.** Your files stay where they are. A *link* is simply a shortcut to the original.

## 🚀 Get started

1. **Link:** In the **Explorer** sidebar, open the menu beside **Linked Workspace**.
- Choose **Link file** to add one or more files.
- Choose **Link folder** to add a folder and its Markdown files, including subfolders.
2. **Edit:** Click a linked file in the sidebar to open it and make changes.
3. **Save:** Press **Ctrl + S** (or **Cmd + S** on Mac) to save your changes to the original file.

## 🗺️ How it works

```mermaid
%%{init: {"theme": "base", "themeVariables": {"fontSize": "22px", "lineColor": "#64748b"}, "flowchart": {"rankSpacing": 60, "curve": "linear"}}}%%
flowchart TD
accTitle: Link, edit, and save an existing file
accDescr: Choose a file or folder, link it, open a file from Linked Workspace, then edit and save to update the original.
A["1. Choose a file or folder"] --> B["2. Click Link file or Link folder"]
B --> C["3. Open a file from Linked Workspace"]
C --> D["4. Edit it and press Ctrl + S to save"]
D --> E["Your original file is updated"]

classDef step fill:#eff6ff,stroke:#3b82f6,stroke-width:2px,color:#172554;
classDef finish fill:#dcfce7,stroke:#16a34a,stroke-width:2px,color:#14532d;
class A,B,C,D step;
class E finish;
```

## 📁 File or folder?

| Choose | When to use it |
| --- | --- |
| **Link file** | Open one or more specific files. |
| **Link folder** | Browse files in a folder and its subfolders. |

## 🖱️ What do the options do?

**Right-click** a linked file or folder to open its menu.

| Option | What it does |
| --- | --- |
| **Save As** | Save a new file and link it. |
| **Remove linked file / folder** | Remove the shortcut from the sidebar; keep the original. |
| **Convert to Workspace copy** | Make a separate copy inside the app. |
| **Rescan folder** | Refresh a linked folder's file list. |
| **Reload from disk** | Open the latest saved version from your computer. |
| **Link file / Link folder** | Add links inside a linked folder to keep them organized. |

## 💡 Good to know

- **Find a file:** Hover over its name in the sidebar to see its location.
- **While editing:** The app keeps a local recovery draft. **Save** updates the original.
- **Organize:** Group links in the sidebar without moving files on your computer.
- **Close a tab:** Your link stays in Linked Workspace.

**You're ready!** Link a file or folder, open it, edit, and save.
13 changes: 13 additions & 0 deletions assets/lucide-icons.css

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 5 additions & 0 deletions desktop-app/neutralino.config.json
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
"nativeAllowList": [
"app.exit",
"os.showOpenDialog",
"os.showFolderDialog",
"os.showSaveDialog",
"os.showMessageBox",
"os.getPath",
Expand All @@ -32,9 +33,13 @@
"filesystem.writeBinaryFile",
"filesystem.getStats",
"filesystem.getJoinedPath",
"filesystem.getNormalizedPath",
"filesystem.copy",
"filesystem.move",
"filesystem.remove",
"filesystem.createWatcher",
"filesystem.removeWatcher",
"filesystem.getWatchers",
"storage.setData",
"storage.getData",
"storage.getKeys",
Expand Down
3 changes: 3 additions & 0 deletions desktop-app/prepare.js
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ fs.copyFileSync(path.join(ROOT_DIR, "script.js"), path.join(jsDest, "script.js")
console.log("✓ Copied script.js → resources/js/script.js");

fs.copyFileSync(path.join(ROOT_DIR, "workspace-storage.js"), path.join(jsDest, "workspace-storage.js"));
fs.copyFileSync(path.join(ROOT_DIR, "native-markdown-source.js"), path.join(jsDest, "native-markdown-source.js"));
console.log("✓ Copied workspace-storage.js → resources/js/workspace-storage.js");

if (fs.existsSync(path.join(ROOT_DIR, "visual-settings-store.js"))) {
Expand Down Expand Up @@ -348,6 +349,8 @@ async function prepareOfflineDependencies() {
html = html.replace(/<script\b[^>]*type="application\/ld\+json"[^>]*>[\s\S]*?<\/script>/i, '');
html = html.replace(/\s*<!-- Browser fallback for hosts that do not run the Cloudflare Pages SEO middleware\. -->\s*<script type="module" src="assets\/seo-metadata\.mjs"><\/script>/i, '');

html = html.replace(/<script src="native-markdown-source\.js" defer><\/script>/g, '<script src="/js/native-markdown-source.js"></script>');

// Inject Neutralino script tags
html = html.replace(
/<script\s+src="workspace-storage\.js"[^>]*><\/script>(?:\s*<script\s+src="visual-settings-adapters\.js"[^>]*><\/script>)?(?:\s*<script\s+src="visual-settings-store\.js"[^>]*><\/script>)?\s*<script\s+src="script\.js"[^>]*><\/script>/i,
Expand Down
Loading
Loading