Repository files navigation

RMW Archive

A desktop app for archiving and browsing public content from forums.rpgmakerweb.com, preserving its categories, forums, threads, posts and members for offline browsing.

Stack

  • Tauri 2 desktop shell
  • Rust crawler, XenForo parsers and SQLite storage
  • TypeScript + Vite frontend without a framework
  • Local filesystem for assets and optional raw page HTML

Layout

src/ frontend (TypeScript)
views/ Home, Forum, Members, Downloads, Settings, Viewer
styles/ application styles
assets/icons/ bundled Lucide SVGs
src-tauri/src/
db.rs schema and queue/storage helpers
settings.rs persisted crawler settings
commands.rs Tauri commands and viewer data loading
crawler/
mod.rs crawl engine and persistent queue
client.rs rate-limited HTTP client
parse.rs XenForo page parsers
bbcode.rs rendered HTML to BBCode reconstruction
assets.rs asset storage and download bookkeeping

Data locations

  • Database: %APPDATA%/com.rmwarchive.app/rmw-archive.sqlite3
  • Archive folder: configurable in Settings, containing assets/ and optional raw/ page captures

Crawling model

The persistent crawl_queue table makes these entry flows resumable and deduplicated by URL:

  1. Forum root discovers categories and forums.
  2. Forum selection archives thread lists, threads, posts and enabled assets.
  3. Thread URL archives one public thread directly.
  4. Member profile URL archives the public profile and selected wall posts, comments and referenced content.

The crawler uses one connection, one request at a time and a 10-second default delay between page requests. It does not log in or bypass permissions.

Development

npm install
npm run tauri dev
npm run build
npm run tauri build

The release/ directory contains versioned packaging material and end-user notes for the corresponding release artifact. Distribution-specific details such as WebView2 installation and SmartScreen behavior belong there rather than in this development overview.

About

Desktop app for archiving and browsing RPG Maker Web forums offline.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

RMW Archive

A desktop app for archiving and browsing public content from forums.rpgmakerweb.com, preserving its categories, forums, threads, posts and members for offline browsing.

Stack

  • Tauri 2 desktop shell
  • Rust crawler, XenForo parsers and SQLite storage
  • TypeScript + Vite frontend without a framework
  • Local filesystem for assets and optional raw page HTML

Layout

src/ frontend (TypeScript)
views/ Home, Forum, Members, Downloads, Settings, Viewer
styles/ application styles
assets/icons/ bundled Lucide SVGs
src-tauri/src/
db.rs schema and queue/storage helpers
settings.rs persisted crawler settings
commands.rs Tauri commands and viewer data loading
crawler/
mod.rs crawl engine and persistent queue
client.rs rate-limited HTTP client
parse.rs XenForo page parsers
bbcode.rs rendered HTML to BBCode reconstruction
assets.rs asset storage and download bookkeeping

Data locations

  • Database: %APPDATA%/com.rmwarchive.app/rmw-archive.sqlite3
  • Archive folder: configurable in Settings, containing assets/ and optional raw/ page captures

Crawling model

The persistent crawl_queue table makes these entry flows resumable and deduplicated by URL:

  1. Forum root discovers categories and forums.
  2. Forum selection archives thread lists, threads, posts and enabled assets.
  3. Thread URL archives one public thread directly.
  4. Member profile URL archives the public profile and selected wall posts, comments and referenced content.

The crawler uses one connection, one request at a time and a 10-second default delay between page requests. It does not log in or bypass permissions.

Development

npm install
npm run tauri dev
npm run build
npm run tauri build

The release/ directory contains versioned packaging material and end-user notes for the corresponding release artifact. Distribution-specific details such as WebView2 installation and SmartScreen behavior belong there rather than in this development overview.

About

Desktop app for archiving and browsing RPG Maker Web forums offline.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

RMW Archive

A desktop app for archiving and browsing public content from forums.rpgmakerweb.com, preserving its categories, forums, threads, posts and members for offline browsing.

Stack

  • Tauri 2 desktop shell
  • Rust crawler, XenForo parsers and SQLite storage
  • TypeScript + Vite frontend without a framework
  • Local filesystem for assets and optional raw page HTML

Layout

src/ frontend (TypeScript)
views/ Home, Forum, Members, Downloads, Settings, Viewer
styles/ application styles
assets/icons/ bundled Lucide SVGs
src-tauri/src/
db.rs schema and queue/storage helpers
settings.rs persisted crawler settings
commands.rs Tauri commands and viewer data loading
crawler/
mod.rs crawl engine and persistent queue
client.rs rate-limited HTTP client
parse.rs XenForo page parsers
bbcode.rs rendered HTML to BBCode reconstruction
assets.rs asset storage and download bookkeeping

Data locations

  • Database: %APPDATA%/com.rmwarchive.app/rmw-archive.sqlite3
  • Archive folder: configurable in Settings, containing assets/ and optional raw/ page captures

Crawling model

The persistent crawl_queue table makes these entry flows resumable and deduplicated by URL:

  1. Forum root discovers categories and forums.
  2. Forum selection archives thread lists, threads, posts and enabled assets.
  3. Thread URL archives one public thread directly.
  4. Member profile URL archives the public profile and selected wall posts, comments and referenced content.

The crawler uses one connection, one request at a time and a 10-second default delay between page requests. It does not log in or bypass permissions.

Development

npm install
npm run tauri dev
npm run build
npm run tauri build

The release/ directory contains versioned packaging material and end-user notes for the corresponding release artifact. Distribution-specific details such as WebView2 installation and SmartScreen behavior belong there rather than in this development overview.

About

Desktop app for archiving and browsing RPG Maker Web forums offline.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

RMW Archive

A desktop app for archiving and browsing public content from forums.rpgmakerweb.com, preserving its categories, forums, threads, posts and members for offline browsing.

Stack

  • Tauri 2 desktop shell
  • Rust crawler, XenForo parsers and SQLite storage
  • TypeScript + Vite frontend without a framework
  • Local filesystem for assets and optional raw page HTML

Layout

src/ frontend (TypeScript)
views/ Home, Forum, Members, Downloads, Settings, Viewer
styles/ application styles
assets/icons/ bundled Lucide SVGs
src-tauri/src/
db.rs schema and queue/storage helpers
settings.rs persisted crawler settings
commands.rs Tauri commands and viewer data loading
crawler/
mod.rs crawl engine and persistent queue
client.rs rate-limited HTTP client
parse.rs XenForo page parsers
bbcode.rs rendered HTML to BBCode reconstruction
assets.rs asset storage and download bookkeeping

Data locations

  • Database: %APPDATA%/com.rmwarchive.app/rmw-archive.sqlite3
  • Archive folder: configurable in Settings, containing assets/ and optional raw/ page captures

Crawling model

The persistent crawl_queue table makes these entry flows resumable and deduplicated by URL:

  1. Forum root discovers categories and forums.
  2. Forum selection archives thread lists, threads, posts and enabled assets.
  3. Thread URL archives one public thread directly.
  4. Member profile URL archives the public profile and selected wall posts, comments and referenced content.

The crawler uses one connection, one request at a time and a 10-second default delay between page requests. It does not log in or bypass permissions.

Development

npm install
npm run tauri dev
npm run build
npm run tauri build

The release/ directory contains versioned packaging material and end-user notes for the corresponding release artifact. Distribution-specific details such as WebView2 installation and SmartScreen behavior belong there rather than in this development overview.

About

Desktop app for archiving and browsing RPG Maker Web forums offline.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

RMW Archive

A desktop app for archiving and browsing public content from forums.rpgmakerweb.com, preserving its categories, forums, threads, posts and members for offline browsing.

Stack

  • Tauri 2 desktop shell
  • Rust crawler, XenForo parsers and SQLite storage
  • TypeScript + Vite frontend without a framework
  • Local filesystem for assets and optional raw page HTML

Layout

src/ frontend (TypeScript)
views/ Home, Forum, Members, Downloads, Settings, Viewer
styles/ application styles
assets/icons/ bundled Lucide SVGs
src-tauri/src/
db.rs schema and queue/storage helpers
settings.rs persisted crawler settings
commands.rs Tauri commands and viewer data loading
crawler/
mod.rs crawl engine and persistent queue
client.rs rate-limited HTTP client
parse.rs XenForo page parsers
bbcode.rs rendered HTML to BBCode reconstruction
assets.rs asset storage and download bookkeeping

Data locations

  • Database: %APPDATA%/com.rmwarchive.app/rmw-archive.sqlite3
  • Archive folder: configurable in Settings, containing assets/ and optional raw/ page captures

Crawling model

The persistent crawl_queue table makes these entry flows resumable and deduplicated by URL:

  1. Forum root discovers categories and forums.
  2. Forum selection archives thread lists, threads, posts and enabled assets.
  3. Thread URL archives one public thread directly.
  4. Member profile URL archives the public profile and selected wall posts, comments and referenced content.

The crawler uses one connection, one request at a time and a 10-second default delay between page requests. It does not log in or bypass permissions.

Development

npm install
npm run tauri dev
npm run build
npm run tauri build

The release/ directory contains versioned packaging material and end-user notes for the corresponding release artifact. Distribution-specific details such as WebView2 installation and SmartScreen behavior belong there rather than in this development overview.

About

Desktop app for archiving and browsing RPG Maker Web forums offline.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

RMW Archive

A desktop app for archiving and browsing public content from forums.rpgmakerweb.com, preserving its categories, forums, threads, posts and members for offline browsing.

Stack

  • Tauri 2 desktop shell
  • Rust crawler, XenForo parsers and SQLite storage
  • TypeScript + Vite frontend without a framework
  • Local filesystem for assets and optional raw page HTML

Layout

src/ frontend (TypeScript)
views/ Home, Forum, Members, Downloads, Settings, Viewer
styles/ application styles
assets/icons/ bundled Lucide SVGs
src-tauri/src/
db.rs schema and queue/storage helpers
settings.rs persisted crawler settings
commands.rs Tauri commands and viewer data loading
crawler/
mod.rs crawl engine and persistent queue
client.rs rate-limited HTTP client
parse.rs XenForo page parsers
bbcode.rs rendered HTML to BBCode reconstruction
assets.rs asset storage and download bookkeeping

Data locations

  • Database: %APPDATA%/com.rmwarchive.app/rmw-archive.sqlite3
  • Archive folder: configurable in Settings, containing assets/ and optional raw/ page captures

Crawling model

The persistent crawl_queue table makes these entry flows resumable and deduplicated by URL:

  1. Forum root discovers categories and forums.
  2. Forum selection archives thread lists, threads, posts and enabled assets.
  3. Thread URL archives one public thread directly.
  4. Member profile URL archives the public profile and selected wall posts, comments and referenced content.

The crawler uses one connection, one request at a time and a 10-second default delay between page requests. It does not log in or bypass permissions.

Development

npm install
npm run tauri dev
npm run build
npm run tauri build

The release/ directory contains versioned packaging material and end-user notes for the corresponding release artifact. Distribution-specific details such as WebView2 installation and SmartScreen behavior belong there rather than in this development overview.

About

Desktop app for archiving and browsing RPG Maker Web forums offline.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

RMW Archive

A desktop app for archiving and browsing public content from forums.rpgmakerweb.com, preserving its categories, forums, threads, posts and members for offline browsing.

Stack

  • Tauri 2 desktop shell
  • Rust crawler, XenForo parsers and SQLite storage
  • TypeScript + Vite frontend without a framework
  • Local filesystem for assets and optional raw page HTML

Layout

src/ frontend (TypeScript)
views/ Home, Forum, Members, Downloads, Settings, Viewer
styles/ application styles
assets/icons/ bundled Lucide SVGs
src-tauri/src/
db.rs schema and queue/storage helpers
settings.rs persisted crawler settings
commands.rs Tauri commands and viewer data loading
crawler/
mod.rs crawl engine and persistent queue
client.rs rate-limited HTTP client
parse.rs XenForo page parsers
bbcode.rs rendered HTML to BBCode reconstruction
assets.rs asset storage and download bookkeeping

Data locations

  • Database: %APPDATA%/com.rmwarchive.app/rmw-archive.sqlite3
  • Archive folder: configurable in Settings, containing assets/ and optional raw/ page captures

Crawling model

The persistent crawl_queue table makes these entry flows resumable and deduplicated by URL:

  1. Forum root discovers categories and forums.
  2. Forum selection archives thread lists, threads, posts and enabled assets.
  3. Thread URL archives one public thread directly.
  4. Member profile URL archives the public profile and selected wall posts, comments and referenced content.

The crawler uses one connection, one request at a time and a 10-second default delay between page requests. It does not log in or bypass permissions.

Development

npm install
npm run tauri dev
npm run build
npm run tauri build

The release/ directory contains versioned packaging material and end-user notes for the corresponding release artifact. Distribution-specific details such as WebView2 installation and SmartScreen behavior belong there rather than in this development overview.

About

Desktop app for archiving and browsing RPG Maker Web forums offline.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

RMW Archive

A desktop app for archiving and browsing public content from forums.rpgmakerweb.com, preserving its categories, forums, threads, posts and members for offline browsing.

Stack

  • Tauri 2 desktop shell
  • Rust crawler, XenForo parsers and SQLite storage
  • TypeScript + Vite frontend without a framework
  • Local filesystem for assets and optional raw page HTML

Layout

src/ frontend (TypeScript)
views/ Home, Forum, Members, Downloads, Settings, Viewer
styles/ application styles
assets/icons/ bundled Lucide SVGs
src-tauri/src/
db.rs schema and queue/storage helpers
settings.rs persisted crawler settings
commands.rs Tauri commands and viewer data loading
crawler/
mod.rs crawl engine and persistent queue
client.rs rate-limited HTTP client
parse.rs XenForo page parsers
bbcode.rs rendered HTML to BBCode reconstruction
assets.rs asset storage and download bookkeeping

Data locations

  • Database: %APPDATA%/com.rmwarchive.app/rmw-archive.sqlite3
  • Archive folder: configurable in Settings, containing assets/ and optional raw/ page captures

Crawling model

The persistent crawl_queue table makes these entry flows resumable and deduplicated by URL:

  1. Forum root discovers categories and forums.
  2. Forum selection archives thread lists, threads, posts and enabled assets.
  3. Thread URL archives one public thread directly.
  4. Member profile URL archives the public profile and selected wall posts, comments and referenced content.

The crawler uses one connection, one request at a time and a 10-second default delay between page requests. It does not log in or bypass permissions.

Development

npm install
npm run tauri dev
npm run build
npm run tauri build

The release/ directory contains versioned packaging material and end-user notes for the corresponding release artifact. Distribution-specific details such as WebView2 installation and SmartScreen behavior belong there rather than in this development overview.

About

Desktop app for archiving and browsing RPG Maker Web forums offline.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages