This page details the configuration variables, local storage structures, container files, and desktop configuration parameters for Markdown Viewer (v3.7.4).
The web application stores user preferences and document states directly in the browser's localStorage.
| LocalStorage Key | Type | Default Value | Description |
|---|---|---|---|
theme |
"light" | "dark" |
System preference | Renders light or dark colors. |
syncScroll |
"true" | "false" |
"true" |
Controls editor-preview scroll sync. |
viewMode |
"split" | "editor" | "preview" |
"split" |
Sets the default editing layout. |
markdown_tabs |
JSON string |
Sample tab schema | Array of document objects (ID, title, content, scroll position, view mode). |
Markdown Viewer loads large dependencies from CDNs. To update a library or pin it to a specific version, modify the script or link tag in the head of index.html:
| Library Name | Version | CDN Service Provider | Core URL |
|---|---|---|---|
| Marked.js | 9.1.6 |
jsDelivr | https://cdn.jsdelivr.net/npm/marked@9.1.6/marked.min.js |
| Highlight.js | 11.9.0 |
cdnjs | https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/highlight.min.js |
| DOMPurify | 3.0.9 |
jsDelivr | https://cdn.jsdelivr.net/npm/dompurify@3.0.9/dist/purify.min.js |
| MathJax | 3.2.2 |
jsDelivr | https://cdn.jsdelivr.net/npm/mathjax@3.2.2/es5/tex-mml-chtml.js |
| Mermaid | 11.15.0 |
jsDelivr | https://cdn.jsdelivr.net/npm/mermaid@11.15.0/dist/mermaid.min.js |
| jsPDF | 2.5.1 |
cdnjs | https://cdnjs.cloudflare.com/ajax/libs/jspdf/2.5.1/jspdf.umd.min.js |
| html2canvas | 1.4.1 |
cdnjs | https://cdnjs.cloudflare.com/ajax/libs/html2canvas/1.4.1/html2canvas.min.js |
| Pako | 2.1.0 |
cdnjs | https://cdnjs.cloudflare.com/ajax/libs/pako/2.1.0/pako.min.js |
| js-yaml | 4.1.0 |
cdnjs | https://cdnjs.cloudflare.com/ajax/libs/js-yaml/4.1.0/js-yaml.min.js |
| FileSaver.js | 2.0.5 |
cdnjs | https://cdnjs.cloudflare.com/ajax/libs/FileSaver.js/2.0.5/FileSaver.min.js |
| Bootstrap | 5.3.2 |
jsDelivr | https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.js |
The container image is built using nginx:alpine. Static web files are served from /usr/share/nginx/html/.
/etc/nginx/conf.d/default.conf)server {
listen 80;
server_name localhost;
root /usr/share/nginx/html;
index index.html;
# SPA Routing Fallback
location / {
try_files $uri $uri/ /index.html;
}
# Static Assets Caching (1 year)
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff2?)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
# Security Headers
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
}
The docker-compose.yml file defines how the container runs locally:
services:
markdown-viewer:
image: ghcr.io/thisis-developer/markdown-viewer:sha-15eafb0
container_name: markdown-viewer
ports:
- "8080:80"
restart: unless-stopped
To build and run a local image instead of pulling the pre-built container from the registry, replace the image key with build: .:
services:
markdown-viewer:
build: .
container_name: markdown-viewer
ports:
- "8080:80"
restart: unless-stopped
The desktop application uses the NeutralinoJS framework, which is configured in desktop-app/neutralino.config.json.
{
"applicationId": "js.neutralino.markdownviewer",
"version": "1.2.0",
"defaultMode": "window",
"enableServer": true,
"enableNativeAPI": true,
"tokenSecurity": "one-time",
"logging": {
"enabled": true,
"writeToLogFile": true
},
"nativeAllowList": [
"app.*",
"os.*",
"debug.*",
"filesystem.*"
],
"window": {
"title": "Markdown Viewer",
"width": 1000,
"minWidth": 800,
"height": 700,
"minHeight": 500,
"resizable": true,
"maximize": false,
"center": true
},
"modes": {
"window": {
"index": "/index.html",
"icon": "/resources/assets/icon.jpg"
}
},
"cli": {
"binaryName": "markdown-viewer",
"resourcesPath": "/resources/",
"extensionsPath": "/extensions/",
"clientLibrary": "/resources/js/neutralino.js",
"binaryVersion": "6.5.0",
"clientVersion": "11.7.0"
}
}
width / height: The default launch window size in pixels ($1000 \times 700$).minWidth / minHeight: Restricts window scaling below $800 \times 500$ to prevent UI layout issues.nativeAllowList: Grants the application permission to access OS and filesystem APIs (e.g. filesystem.* is required for loading and saving local files).The desktop-app/package.json file contains scripts for development, packaging, and dependency updates:
| Script Name | Command | Description |
|---|---|---|
setup |
node setup-binaries.js |
Downloads Neutralino platform-specific runtimes. |
dev |
npx @neutralinojs/neu run |
Starts the desktop app in hot-reload development mode. |
prepare |
node prepare.js |
Copies core files from the project root into the desktop build directory. |
build |
node build-windows.js |
Compiles a single-file executable for Windows. |
build:portable |
npx @neutralinojs/neu build --release |
Packages the application into zip files for Windows, Linux, and macOS. |
The repository uses two GitHub Actions workflows:
docker-publish.yml)main branch, or pull requests.ghcr.io).linux/amd64 and linux/arm64 (multi-arch build).latest for main branch releases, and commit-sha tags for development runs.desktop-build.yml)desktop-v* (e.g. desktop-v1.2.0).setup, prepare, and build:portable scripts, and generates checksums.