Repository navigation
KoBup 2.0: bug fixes, security, merge restore, TypeScript UI, EN/IT, SEO prerender, PWA - #4
Merged
Merged
Conversation
Drops unused components/helpers and the broken browser-fs-access fallback (directoryOpen returns File[], not a handle), removes jszip/adm-zip/ better-sqlite3, simplifies .gitignore and moves private real-backup fixtures to ./fixtures (overridable via KOBUP_FIXTURES_DIR). Generated with [Devin](https://devin.ai) Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
- React 19, Vite 8 (Rolldown/Oxc), Vitest 5, Tailwind 4 (CSS-first config), Zustand 5, ESLint 10 flat config + typescript-eslint + react-hooks 7 + jsx-a11y, Prettier config, GitHub Actions CI (typecheck/lint/format/test/build) - utils, hooks, store and tests rewritten in strict TypeScript with shared domain types; common UI components (Button, Modal on native <dialog>, Icon, Checkbox, ...) converted to accessible TSX - sql.js WASM is now imported via ?url so it is always in sync with the JS glue (public/sql-wasm.wasm was 1.13 while the package is 1.14) - app version injected from package.json (__APP_VERSION__) Generated with [Devin](https://devin.ai) Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
…identity - Kobo stores TimeSpentReading in seconds: values are now converted to minutes (stats were inflated 60x, e.g. 1418h shown instead of 23h38m) - sanitize(): fix "PRAGMA journaling_mode" typo (silently ignored) so the restored database really leaves WAL mode - schema version read from the DbVersion table (PRAGMA user_version is always 0 on Kobo databases) - real model/firmware from .kobo/version (serial number is discarded), with the Nickel model id table - compatibility check returns coded warnings and blocks restoring a newer schema onto older firmware - restore preview computes stats from the backup database (old metadata stored seconds labelled as minutes) - scanning extracted to utils/scan.ts; warns about a pending (non-empty) WAL file, recorded in backup metadata - stats query shares the exact same filter as the book list Generated with [Devin](https://devin.ai) Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
…-hosted fonts - optional AES-256 password protection for backups (zip.js, streaming); restore detects encrypted archives and reports missing/wrong passwords (the database contains Kobo account tokens) - restore saves the current device database (and a pending WAL) to .kobo/KoboReader.sqlite.before-restore; undoLastRestore() puts it back - restore refuses to write "books" into hidden/system folders (e.g. books/.kobo/KoboReader.sqlite from a crafted archive) - vercel.json: strict Content-Security-Policy (connect-src 'self' makes the "nothing is uploaded" promise enforced by the browser), nosniff, Referrer/Permissions-Policy, immutable caching for hashed assets; COEP removed (sql.js never needed SharedArrayBuffer) - Oswald/Poppins served locally via @fontsource instead of Google Fonts Generated with [Devin](https://devin.ai) Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
…ckup - KoboSource abstraction (File System Access handle or plain FileList) used by scanning, backup and covers, with cached directory handles - covers: look in .kobo-images/<d1>/<d2>/ using Nickel's qhash (current firmware) before the legacy .kobo/images; verified against real paths - restore "merge" mode: copy progress, highlights/notes and collections of sideloaded books into the device's own database, keeping its account, store library and settings; refuses to run with a pending WAL - backups are read back after writing: entry list + database SHA-256; restore flags archives whose database does not match its checksum - "Device settings" option now real: Kobo eReader.conf, custom fonts and screensavers are backed up under device/ and restored only from a whitelist of paths Generated with [Devin](https://devin.ai) Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
…a11y - History-API router with real URLs (/backup, /it/ripristino, ...), crawlable <a href> links, legacy #hash redirects and a 404 page - typed i18n (English + Italian, same shape enforced by the compiler) with localized numbers, dates, sizes, durations, plurals and error messages - per-page <title>, description, canonical, hreflang and JSON-LD kept in sync on navigation - Backup: shared device session with the Library, real options (books, readable highlights, settings/fonts/screensavers), AES-256 password, read-back verification, file handle saved for History - Restore: password unlock, target-device compatibility (model, firmware, schema), merge vs replace mode, visible errors, one-click undo - Library usable on its own: ARIA tabs, lazy covers, collections tab, Obsidian/Anki/Markdown exports, book details in an accessible dialog - History: verify or restore a backup from its stored handle - works without File System Access (folder input) for backup/library - accessibility: skip link, focus management, contrast-safe accent colour, labelled controls, live regions, keyboard-friendly components - ZIP/SQLite code loaded on demand; SSR-safe components (every route is server-rendered in tests) Generated with [Devin](https://devin.ai) Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
…oads SEO - every route is prerendered at build time in English and Italian (17 static pages) with localized <title>, description, canonical, hreflang (en/it/x-default), Open Graph/Twitter tags and JSON-LD (WebApplication, WebSite, BreadcrumbList, FAQPage, HowTo); pages hydrate without mismatches - real sitemap.xml with hreflang alternates (replaces the #hash URLs), robots.txt pointing to it, 404.html served with a real 404 status - correct <html lang> per page; Italian home at /it PWA / browsers - web app manifest and generated PNG icons (standard, maskable, Apple) - service worker precaches pages and hashed assets (works offline) and streams backups as downloads in Firefox/Safari (no showSaveFilePicker), pulling one chunk at a time so memory stays flat for multi-GB libraries Generated with [Devin](https://devin.ai) Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
- README rewritten for the current app: features, browser support table, backup contents/layout, privacy, stack, structure, dev commands, changelog - AGENTS.md with verification commands, architecture map and project rules - version 2.0.0 (routes and UI changed); Node 22.18+ for TS scripts - removed exports left unused by the rewrite and the unused jest-dom package Generated with [Devin](https://devin.ai) Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
This branch was successfully deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Full audit and modernization of KoBup, one commit per phase:
fixtures/journal_modetypo, schema version fromDbVersion, real model/firmware from.kobo/version, WAL warning, restore preview stats.kobo-images(qhash), read-back backup verification + checksum check on restore, settings/fonts/screensavers backup,KoboSourceabstractionTest plan
npm run check(typecheck, lint, 131 tests, build + prerender + service worker)npm run format:checkvite preview: clean URLs (/it,/it/ripristino), sitemap, manifest, sw.jsDeploy note: the build runs
node scripts/postbuild.tsand needs Node 22.18+.Generated with Devin