Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ Non-code commits (documentation, planning, README-only updates) are excluded.
## v3.10.0

- **Description:** Introduced scalable local document storage, complete workspace backup and recovery, and a rebuilt GitHub importer with secure private-repository access.
- **In-App Release Notes:** Added the single extensionless, read-only v3.10.0 release note as a branded workspace tab with first-run visibility, close-as-seen version tracking, a sticky section guide, a Show Release Notes action in About, and a documented Markdown format that scales from one-fix patches to large multi-contributor releases.
- **Workspace Storage:** Removed the document-count limit, migrated browser workspaces to per-document IndexedDB records with on-demand loading, a bounded memory cache, and paged Explorer rendering, and stored desktop documents as ordinary Markdown files in the fixed `Documents/Markdown Viewer Vault` location.
- **Backup & Recovery:** Added folder-preserving ZIP backup and restore for web and desktop, optional encrypted Secret Workspace files, exact usage and document counts, safer import and reset confirmations, and clearer browser-data and Private mode behavior.
- **GitHub Import:** Discovered every Markdown file including truncated repository trees, resolved branches, tags, slash-containing refs, and commits to immutable SHAs, and added up to 50 named fine-grained or classic PAT entries stored in an AES-GCM-encrypted local credential vault.
Expand Down
1 change: 1 addition & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ COPY workspace-storage.js /usr/share/nginx/html/
COPY script.js /usr/share/nginx/html/
COPY styles.css /usr/share/nginx/html/
COPY sw.js /usr/share/nginx/html/
COPY RELEASE_NOTES /usr/share/nginx/html/
COPY manifest.json /usr/share/nginx/html/
COPY robots.txt /usr/share/nginx/html/
COPY sitemap.xml /usr/share/nginx/html/
Expand Down
83 changes: 83 additions & 0 deletions RELEASE_NOTES
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
![Markdown Viewer logo](assets/icon.jpg) **Markdown Viewer release** · `v3.10.0`

# Welcome to Markdown Viewer 3.10.0

_Released August 2, 2026_

This release gives your workspace room to grow, makes complete backups practical, and rebuilds GitHub importing for large and private repositories.

Everything here ships with the web, PWA, Docker, and desktop editions. **Happy coding!**

[View release on GitHub](https://github.com/ThisIs-Developer/Markdown-Viewer/releases/tag/v3.10.0) [Open the full changelog](https://github.com/ThisIs-Developer/Markdown-Viewer/blob/main/CHANGELOG.md)

---

## Highlights

- **A workspace without a document-count ceiling.** Documents now use scalable per-document storage instead of one increasingly large browser record.
- **Complete backup and recovery.** Export and restore folder-preserving ZIP backups on the web and desktop.
- **A rebuilt GitHub importer.** Discover every Markdown file, work with branches and tags reliably, and save private-repository access securely.
- **Polish across the product.** Faster bulk tab closing, clearer staged loading, responsive import selection, and an audit of all 14 interface languages.

> [!TIP]
> Start with **Workspace storage** if you manage a large library, or jump to **GitHub import** if your documentation lives in repositories.

## Workspace storage

Markdown Viewer no longer limits a workspace to a fixed number of documents. Browser documents are stored as individual IndexedDB records, loaded only when needed, retained in a bounded memory cache, and rendered in paged Explorer groups.

Desktop documents remain ordinary Markdown files in the fixed **Documents/Markdown Viewer Vault** location, so the vault is predictable and easy to inspect outside the application.

### What changed

- Removed the former document-count limit.
- Added on-demand document loading and a bounded cache.
- Added paged Explorer rendering for large workspaces.
- Added exact storage usage and document totals.
- Preserved a normal Markdown-file vault for desktop users.

## Backup and recovery

Workspace backup now preserves documents and folder organization in a ZIP file. The same archive can restore a workspace on the web or desktop, with clearer confirmations before imports and destructive resets.

Secret Workspace files can be included as encrypted data, while Private mode continues to pause persistence without silently removing saved work.

> [!IMPORTANT]
> A workspace reset removes documents, settings, and release-note visibility data. After a reset, Markdown Viewer treats the next launch as a first run and shows Welcome with this release-note tab beside it.

## GitHub import

The importer now finds all Markdown files even when GitHub truncates a large repository tree. It resolves branches, tags, slash-containing references, and commit selections to immutable SHAs before importing.

Private access supports up to 50 named fine-grained or classic personal access tokens. Saved credentials stay in a local AES-GCM-encrypted vault and are sent only to `api.github.com` for the selected repository operation.

### Import workflow improvements

- Search and select files in a responsive picker.
- Import files into Explorer without opening a flood of tabs.
- See staged progress and clearer success or failure feedback.
- Distinguish repository folders and their expanded state more easily.
- Keep private credentials named, encrypted, and removable.

## Interface, languages, and desktop

The release completes a visual and localization pass across the importer and workspace. All 14 interface catalogs were audited, desktop resources were synchronized with the web build, and tagged prereleases now publish with the correct metadata.

Bulk tab closing is batched so large sessions remain responsive, and small-screen import selection retains comfortable touch targets.

## Thank you

### Contributors

- **[Baivab Sarkar (@ThisIs-Developer)](https://github.com/ThisIs-Developer)** — Design, implementation, testing, documentation, and release work.

### Changes included

- [#230 — Unlimited storage, backup, reset, and fixed vault](https://github.com/ThisIs-Developer/Markdown-Viewer/pull/230)
- [#231 — Preserve the complete #230 commit history](https://github.com/ThisIs-Developer/Markdown-Viewer/pull/231)
- [#232 — Refine storage documentation highlights](https://github.com/ThisIs-Developer/Markdown-Viewer/pull/232)
- [#233 — Scale GitHub imports and simplify private access](https://github.com/ThisIs-Developer/Markdown-Viewer/pull/233)

Thank you for using Markdown Viewer and helping make every release more useful. For the complete history, read the [project changelog](https://github.com/ThisIs-Developer/Markdown-Viewer/blob/main/CHANGELOG.md).

**Happy coding!**
20 changes: 16 additions & 4 deletions assets/i18n/de.json
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,6 @@
"Capturing document": "Dokument erfassen",
"Capturing image": "Bild wird aufgenommen",
"Change text case": "Text-Groß-/Kleinschreibung ändern",
"Changelog": "Änderungsprotokoll",
"Chars": "Zeichen",
"Checkbox Map": "Kontrollkästchen-Karte",
"Checklist Map": "Checklistenkarte",
Expand Down Expand Up @@ -971,7 +970,6 @@
"Embedded images could not be converted. Please try again.": "Eingebettete Bilder konnten nicht konvertiert werden. Bitte versuchen Sie es erneut.",
"expanded.": "erweitert.",
"Image conversion was cancelled because the document changed.": "Die Bildkonvertierung wurde abgebrochen, da sich das Dokument geändert hat.",
"MD": "MD",
"Open an editable Markdown file before inserting images.": "Öffnen Sie eine bearbeitbare Markdown-Datei, bevor Sie Bilder einfügen.",
"uploaded and inserted with short links.": "hochgeladen und mit Kurzlinks eingefügt.",
"cancel": "abbrechen",
Expand Down Expand Up @@ -1018,7 +1016,6 @@
"Paste failed:": "Einfügen fehlgeschlagen:",
"Selection copied to clipboard.": "Auswahl in die Zwischenablage kopiert.",
"Selection cut to clipboard.": "Auswahl in Zwischenablage ausschneiden.",
"1 file": "1 Datei",
"Checking…": "Überprüfen…",
"Deleted documents are moved to recoverable trash. Desktop edits keep recent history inside the vault.": "Gelöschte Dokumente werden in den wiederherstellbaren Papierkorb verschoben. Desktop-Änderungen bewahren den aktuellen Verlauf im Tresor auf.",
"Document unavailable": "Dokument nicht verfügbar",
Expand Down Expand Up @@ -1156,5 +1153,20 @@
"Token name": "Tokenname",
"Up to 50 GitHub access tokens can be saved.": "Es können bis zu 50 GitHub-Zugriffstokens gespeichert werden.",
"Use a unique token name.": "Verwenden Sie einen eindeutigen Tokennamen.",
"Move to…": "Verschieben nach…"
"Move to…": "Verschieben nach…",
"Release notes unavailable": "Versionshinweise nicht verfügbar",
"Show Release Notes": "Versionshinweise anzeigen",
"The release notes could not be opened.": "Die Versionshinweise konnten nicht geöffnet werden.",
"Release notes are read only.": "Versionshinweise sind schreibgeschützt.",
"Release notes opened.": "Versionshinweise geöffnet.",
"Back to the top of the release notes": "Zurück zum Anfang der Versionshinweise",
"Back to top": "Zurück nach oben",
"Close Release Notes: 3.10.0": "Versionshinweise schließen: 3.10.0",
"File options for Release Notes: 3.10.0": "Dateioptionen für Versionshinweise: 3.10.0",
"In this update": "In diesem Update",
"release notes": "Versionshinweise",
"Release notes are available in the tab list.": "Versionshinweise sind in der Registerkartenliste verfügbar.",
"Release Notes: 3.10.0": "Versionshinweise: 3.10.0",
"Skip update navigation": "Update-Navigation überspringen",
"1 file": "1 Datei"
}
16 changes: 14 additions & 2 deletions assets/i18n/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,8 @@
"Area Chart": "Area Chart",
"Audio playback is not supported in this browser.": "Audio playback is not supported in this browser.",
"Back to content": "Back to content",
"Back to the top of the release notes": "Back to the top of the release notes",
"Back to top": "Back to top",
"Back up or restore your workspace": "Back up or restore your workspace",
"Backup": "Backup",
"Backup complete": "Backup complete",
Expand All @@ -120,7 +122,6 @@
"Capturing document": "Capturing document",
"Capturing image": "Capturing image",
"Change text case": "Change text case",
"Changelog": "Changelog",
"Changes not saved": "Changes not saved",
"Chars": "Chars",
"Checkbox Map": "Checkbox Map",
Expand Down Expand Up @@ -183,6 +184,7 @@
"Close others": "Close others",
"Close PDF export dialog": "Close PDF export dialog",
"Close reference dialog": "Close reference dialog",
"Close Release Notes: 3.10.0": "Close Release Notes: 3.10.0",
"Close rename dialog": "Close rename dialog",
"Close reset confirmation dialog": "Close reset confirmation dialog",
"Close review deletion dialog": "Close review deletion dialog",
Expand Down Expand Up @@ -415,6 +417,7 @@
"File not supported": "File not supported",
"File options": "File options",
"File options for": "File options for",
"File options for Release Notes: 3.10.0": "File options for Release Notes: 3.10.0",
"File options for Welcome to Markdown": "File options for Welcome to Markdown",
"File renamed": "File renamed",
"File tree actions": "File tree actions",
Expand Down Expand Up @@ -528,6 +531,7 @@
"Importing this backup permanently replaces the current workspace, including its files, folders, settings, and Secret Workspace data.": "Importing this backup permanently replaces the current workspace, including its files, folders, settings, and Secret Workspace data.",
"Importing workspace backup": "Importing workspace backup",
"in split view": "in split view",
"In this update": "In this update",
"Include secure workspace files": "Include secure workspace files",
"Incorrect access key or unreadable Secret Workspace data.": "Incorrect access key or unreadable Secret Workspace data.",
"Inline code": "Inline code",
Expand Down Expand Up @@ -620,7 +624,6 @@
"Match Whole Word": "Match Whole Word",
"Match Whole Word (W)": "Match Whole Word (W)",
"matches": "matches",
"MD": "MD",
"Media description": "Media description",
"media file": "media file",
"Media file": "Media file",
Expand Down Expand Up @@ -801,6 +804,12 @@
"Reference": "Reference",
"Reference Number": "Reference Number",
"Reference title": "Reference title",
"release notes": "release notes",
"Release notes are available in the tab list.": "Release notes are available in the tab list.",
"Release notes are read only.": "Release notes are read only.",
"Release notes opened.": "Release notes opened.",
"Release notes unavailable": "Release notes unavailable",
"Release Notes: 3.10.0": "Release Notes: 3.10.0",
"Reloading restored workspace…": "Reloading restored workspace…",
"Remove from Favorites": "Remove from Favorites",
"Remove selected access token": "Remove selected access token",
Expand Down Expand Up @@ -952,13 +961,15 @@
"Show access key": "Show access key",
"Show confirmation access key": "Show confirmation access key",
"Show Diff Preview before replace": "Show Diff Preview before replace",
"Show Release Notes": "Show Release Notes",
"Show sidebar": "Show sidebar",
"Showing": "Showing",
"shown.": "shown.",
"Signal Glitches": "Signal Glitches",
"Signature and Speed": "Signature and Speed",
"Simple Flow": "Simple Flow",
"Simple Tune": "Simple Tune",
"Skip update navigation": "Skip update navigation",
"Small documents stay encoded in the URL. Large documents use temporary Cloudflare KV for up to 90 days. Shared tabs are not saved locally on the recipient's device.": "Small documents stay encoded in the URL. Large documents use temporary Cloudflare KV for up to 90 days. Shared tabs are not saved locally on the recipient's device.",
"Solid": "Solid",
"Solid Mode": "Solid Mode",
Expand Down Expand Up @@ -1034,6 +1045,7 @@
"The live room could not be joined. Please check the invite link or connection.": "The live room could not be joined. Please check the invite link or connection.",
"The media file could not be inserted.": "The media file could not be inserted.",
"The provided URL does not point to a Markdown file.": "The provided URL does not point to a Markdown file.",
"The release notes could not be opened.": "The release notes could not be opened.",
"The repository folder could not be created.": "The repository folder could not be created.",
"The selected GitHub access could not be saved.": "The selected GitHub access could not be saved.",
"The share link could not be generated.": "The share link could not be generated.",
Expand Down
20 changes: 16 additions & 4 deletions assets/i18n/es.json
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,6 @@
"Capturing document": "Capturando documento",
"Capturing image": "Capturando imagen",
"Change text case": "Cambiar mayúsculas y minúsculas del texto",
"Changelog": "Registro de cambios",
"Chars": "Caracteres",
"Checkbox Map": "Mapa de casillas de verificación",
"Checklist Map": "Mapa de lista de verificación",
Expand Down Expand Up @@ -971,7 +970,6 @@
"Embedded images could not be converted. Please try again.": "Las imágenes incrustadas no se pudieron convertir. Por favor inténtalo de nuevo.",
"expanded.": "ampliado.",
"Image conversion was cancelled because the document changed.": "La conversión de imagen se canceló porque el documento cambió.",
"MD": "MD",
"Open an editable Markdown file before inserting images.": "Abra un archivo Markdown editable antes de insertar imágenes.",
"uploaded and inserted with short links.": "subido e insertado con enlaces cortos.",
"cancel": "cancelar",
Expand Down Expand Up @@ -1018,7 +1016,6 @@
"Paste failed:": "Error al pegar:",
"Selection copied to clipboard.": "Selección copiada al portapapeles.",
"Selection cut to clipboard.": "Selección cortada al portapapeles.",
"1 file": "1 archivo",
"Checking…": "Comprobando…",
"Deleted documents are moved to recoverable trash. Desktop edits keep recent history inside the vault.": "Los documentos eliminados se mueven a la papelera recuperable. Las ediciones de escritorio mantienen el historial reciente dentro de la bóveda.",
"Document unavailable": "Documento no disponible",
Expand Down Expand Up @@ -1156,5 +1153,20 @@
"Token name": "Nombre del token",
"Up to 50 GitHub access tokens can be saved.": "Se pueden guardar hasta 50 tokens de acceso de GitHub.",
"Use a unique token name.": "Utilice un nombre de token único.",
"Move to…": "Mover a…"
"Move to…": "Mover a…",
"Release notes unavailable": "Notas de la versión no disponibles",
"Show Release Notes": "Mostrar notas de la versión",
"The release notes could not be opened.": "No se pudieron abrir las notas de la versión.",
"Release notes are read only.": "Las notas de la versión son de solo lectura.",
"Release notes opened.": "Notas de la versión abiertas.",
"Back to the top of the release notes": "Volver al principio de las notas de la versión",
"Back to top": "Volver arriba",
"Close Release Notes: 3.10.0": "Cerrar Notas de la versión: 3.10.0",
"File options for Release Notes: 3.10.0": "Opciones de archivo para Notas de la versión: 3.10.0",
"In this update": "En esta actualización",
"release notes": "notas de la versión",
"Release notes are available in the tab list.": "Las notas de la versión están disponibles en la lista de pestañas.",
"Release Notes: 3.10.0": "Notas de la versión: 3.10.0",
"Skip update navigation": "Saltar navegación de actualización",
"1 file": "1 archivo"
}
20 changes: 16 additions & 4 deletions assets/i18n/fr.json
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,6 @@
"Capturing document": "Capture de document",
"Capturing image": "Capture d'image",
"Change text case": "Modifier la casse du texte",
"Changelog": "Journal des modifications",
"Chars": "Caractères",
"Checkbox Map": "Carte des cases à cocher",
"Checklist Map": "Carte de la liste de contrôle",
Expand Down Expand Up @@ -971,7 +970,6 @@
"Embedded images could not be converted. Please try again.": "Les images intégrées n'ont pas pu être converties. Veuillez réessayer.",
"expanded.": "développé.",
"Image conversion was cancelled because the document changed.": "La conversion de l'image a été annulée car le document a été modifié.",
"MD": "MD",
"Open an editable Markdown file before inserting images.": "Ouvrez un fichier Markdown modifiable avant d'insérer des images.",
"uploaded and inserted with short links.": "téléchargé et inséré avec des liens courts.",
"cancel": "annuler",
Expand Down Expand Up @@ -1018,7 +1016,6 @@
"Paste failed:": "Échec du collage :",
"Selection copied to clipboard.": "Sélection copiée dans le presse-papiers.",
"Selection cut to clipboard.": "Sélection coupée dans le presse-papiers.",
"1 file": "1 fichier",
"Checking…": "Vérification…",
"Deleted documents are moved to recoverable trash. Desktop edits keep recent history inside the vault.": "Les documents supprimés sont déplacés vers la corbeille récupérable. Les modifications apportées au bureau conservent l’historique récent dans le coffre-fort.",
"Document unavailable": "Document indisponible",
Expand Down Expand Up @@ -1156,5 +1153,20 @@
"Token name": "Nom du jeton",
"Up to 50 GitHub access tokens can be saved.": "Jusqu'à 50 jetons d'accès GitHub peuvent être enregistrés.",
"Use a unique token name.": "Utilisez un nom de jeton unique.",
"Move to…": "Déplacer vers…"
"Move to…": "Déplacer vers…",
"Release notes unavailable": "Notes de version indisponibles",
"Show Release Notes": "Afficher les notes de version",
"The release notes could not be opened.": "Les notes de version n'ont pas pu être ouvertes.",
"Release notes are read only.": "Les notes de version sont en lecture seule.",
"Release notes opened.": "Notes de version ouvertes.",
"Back to the top of the release notes": "Retour en haut des notes de version",
"Back to top": "Retour en haut",
"Close Release Notes: 3.10.0": "Fermer les notes de version : 3.10.0",
"File options for Release Notes: 3.10.0": "Options de fichier pour les notes de version : 3.10.0",
"In this update": "Dans cette mise à jour",
"release notes": "Notes de version",
"Release notes are available in the tab list.": "Les notes de version sont disponibles dans la liste des onglets.",
"Release Notes: 3.10.0": "Notes de version : 3.10.0",
"Skip update navigation": "Ignorer la navigation de mise à jour",
"1 file": "1 fichier"
}
Loading
Loading