Lattice
A workspace for your research.
Organize selected files privately and export approved copies offline.
Translation pending
ProductivityJavaScript · HTMLGitHub @Link-eristOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
SortU: private, on-device file organization, transcription and transfer.
Translation pending
Loading the full README. The saved excerpt is shown below.
Organize, transcribe and share your files privately. Everything runs on your own device, and nothing is uploaded.
Windows may show "Windows protected your PC" the first time, because the app is not code-signed. Choose More info, then Run anyway.Read the full README ↗Organize, transcribe and share your files privately. Everything runs on your own device, and nothing is uploaded.
| Use it in your browser | sortu-app.vercel.app. Works in Chrome or Edge on a computer, and Chrome on Android. You can install it as an app from the browser. |
| Download for Windows | Portable app on the Releases page. One ZIP with the AI models included: unzip, run SortU.exe, and it works offline. Nothing is installed; delete the folder to remove it. |
Windows may show "Windows protected your PC" the first time, because the app is not code-signed. Choose More info, then Run anyway.
SortU is a Progressive Web App in plain HTML, CSS and JavaScript, with locally bundled ZIP, QR and hashing libraries. Deployment needs no build step or runtime CDN.
Vercel project: https://vercel.com/link-erists-projects/sortu-app
The GitHub repository is linked to Vercel, with main as the production branch. Pushes to main automatically deploy updates. The portable app is built from desktop/; see desktop/README.md.
Use Node.js 22 or newer. In PowerShell, from this repository:
npm start
Open http://127.0.0.1:4173. Keep the terminal running. Stop it with Ctrl+C. No npm install is needed. This loopback address qualifies for local PWA testing.
npm test
The tests exercise organizer rules, safe proposals, approval invalidation, exclusions, bounded ZIP export, verified copies, workspace ownership, and PWA/transfer behavior. Native installation and physical LAN compatibility still need device checks.
main as the production branch once the code is ready there.vercel.json already supplies these static-site settings; no environment variables are required.This project's account import is complete. The steps above are retained for recreating the setup elsewhere. Local configuration alone does not establish the account connection. See Vercel GitHub integration and project configuration.
Installation needs HTTPS or localhost. Double-clicking index.html opens a file:// page, which is not a working PWA preview. Plain HTTP from a computer's LAN IP is also unsuitable for Android PWA testing; use the deployed HTTPS URL.
Visit once online on EACH device and wait for Available offline. The worker precaches both workspaces, workers, bundled libraries, page, styles, manifest, and icons. A subsequent offline reload returns the cached app. First visits need a connection. A cache may be removed by the browser, storage pressure, or clearing site data, so offline access is not permanent storage.
The page checks the network first; local app assets use a versioned cache. When changing cached files, increment APP_VERSION in public/sw.js and the app-shell-version meta tag in public/index.html together, for example to v2. Keep that meta tag's attribute order as written. While the next worker waits, the active worker keeps its previous page when the network delivers a different shell version, preventing new markup from mixing with old assets. A new worker normally waits until all old app tabs/windows close. Close them and reopen to activate the new version. Old caches belonging to this app are then removed. No forced reload is used.
To check offline behavior manually: visit online, wait for the offline-ready status, reload once, enable Offline in browser developer tools' Network panel, and reload again. Confirm the page and styles load, then disable Offline. Do not disable the service worker or use bypass-for-network when checking its fallback.
This feature branch implements rules-based organization and renaming of exported copies, plus file transfer. Local AI, content understanding, chatbot, PDF content analysis, and timestamped transcription remain subsequent subsystems. This rules-based milestone alone does not meet the hackathon's local AI inference requirement. Installing a PWA does not grant unrestricted file access or native background operation. File picking and saving vary across browsers. Browser-local storage can be cleared; browser installation does not make it a backup. The existing production URL is not updated until this feature is published.
Open Organize, then select 1 to 100 files or a folder. Only these selected files are accessible. Uncheck any files to exclude them. Inventory and proposals use names, extensions, and last-modified metadata without reading file contents.
Use automatic defaults or choose grouping by type, modified year, or original folders. Preserve names, normalize them, or use {stem}, {category}, {index}, and {date} in a naming template. Extensions are retained. {date} uses the selected file's last-modified date in the device's time zone.
Optionally provide supported directives in the instruction box (8 KiB UTF-8) or a .txt/.md README guide (32 KiB). For example:
Group by: type
Naming: project_{stem}_{index}
Exclude: *.tmp, private*
Unsupported prose or conflicting guides block the proposal. Use automatic settings and ignore guides explicitly bypasses guide instructions and resets manual settings. Manually excluded files stay excluded. Manually changed controls override matching guide directives and are identified in the active rules summary. Exclusion patterns support * and ?, at most 20 patterns of 256 characters each.
Generate a proposal, review the original and proposed paths, edit if needed, and explicitly approve. Changes to selection, settings, instructions, or target paths invalidate approval. Unsafe Windows paths, collisions, and file/directory conflicts block approval. Automatic collisions receive deterministic keep-both suffixes.
Download a ZIP, or on browsers exposing folder-writing support choose a parent folder. Folder export creates a new Organized-<date>-<uuid> subfolder, copies bytes, and independently rereads and verifies each saved file. Originals are not moved, rewritten, or deleted. A failure reports the partial output folder instead of deleting it. ZIP export reports download requested because the app cannot confirm browser saving finished.
Or choose Reorganize this folder in place (Chrome and Edge on computers, and the portable app; not Android, where the browser cannot write to folders). Pick the folder the files came from. Before anything changes, SortU checks that every selected file is still there and unchanged and that no proposed path is already taken, then lists every move for you to confirm. Each file is copied, re-read and checked, and only then is the original removed; folders left empty are removed too. SortU-restore-log.json is written in the folder first and updated after each move, so Restore original layout can move everything back, even after a reload (choose the same folder). Saving copies stays the default.
The Proposed changes panel shows Before (original paths) and After (the new folder tree with file counts) side by side. Select a file on either side to highlight it on both.
ZIP output is capped at 64 MiB including archive overhead and the organization report. The conservative admission estimate can reject a selection slightly below that ceiling. Folder export streams files sequentially and has no app-wide byte cap, subject to browser permissions and disk capacity. Both export modes read in 32 KiB chunks. The report includes metadata, rules, excluded paths, and SHA-256 checksums, with a 512 KiB report cap. It does not include guide text or file contents.
Organizer and Transfer retain their sessions when switching tabs. Export construction is serialized across both workspaces. Retained download buffers share a 64 MiB budget and release after up to 60 seconds; this is not a total browser RAM guarantee. Ending Transfer releases only Transfer downloads. Clearing Organizer releases only Organizer downloads. Wait for downloads before clearing or closing.
Android uses the capabilities its browser actually provides. ZIP export and standard file selection are the portable routes; direct folder saving is offered only when supported. Mobile viewport tests do not prove physical Android support or acceptable memory use. Keep this app in the foreground during jobs.
The organizer ZIP vendor is the stored-entry subset of fflate 0.8.3, bundled locally with its MIT license. Run node scripts/vendor-organizer.mjs after installing development dependencies to regenerate it. Runtime operations use no CDN or server API. Model inference is not part of this version.
See MDN installability guidance and service worker guidance.
public/: everything deployed, including the web manifest and service worker.scripts/serve.mjs: localhost preview server. Development only.scripts/create-icons.ps1: recreates the PNG icons on Windows. The artwork fits the maskable safe zone.tests/pwa.test.mjs: browser-API behavior harness; no external packages.vercel.json: static output and service worker cache headers.docs/superpowers/: approved design and implementation plan.Automated tests and browser results are recorded in docs/verification.md. Physical Windows-to-Android LAN transfer, camera-based pairing, native installation, and large-file streaming still need device checks.
Ordinary download export is limited to 64 MiB per file. Windows browsers that support private storage and a user-selected streaming destination can handle larger files, subject to actual storage. This is capability-based, not an Android version promise. Keep both pages open and in the foreground. Guest Wi-Fi, client isolation, firewall settings, and browser suspension can prevent or interrupt transfers.
On interruption, keep the pages and selected source files open, re-pair and confirm again, then use Resume retained transfer on the receiver. The stored prefix must match. Reload recovery is not supported. Cancel or end the session to discard partial receiving storage. Incoming files are never executed automatically.
Download object URLs share a 64 MiB memory budget. Large batches can wait up to 60 seconds for earlier download buffers to be released. Wait for browser downloads to finish before ending the session or closing the page; ending the session releases retained URLs. This bounds retained exports, not total browser memory.
Bundled dependencies: Nayuki QR Code generator, jsQR 1.4.0, and the SHA-256 subset of noble-hashes 2.0.1. Versions, hashes, and licenses are in public/vendor/manifest.json and public/vendor/LICENSES.txt. esbuild 0.25.12 is a development bundler. No model or AI service is used by transfer. Development is AI-assisted through Codex; the transfer subsystem is new, while the PWA shell predates this feature.
node scripts/measure-transfer-assets.mjs reports raw and gzip script sizes. To rebuild the pinned vendor assets, run npm ci and node scripts/vendor-transfer.mjs while online. Deployment uses committed browser-ready files instead.
The optional scripts/check-transfer-browser.mjs uses Playwright and installed Microsoft Edge. Install Playwright in your development environment or set PLAYWRIGHT_MODULE to its module path, start npm start, then run the script. It tests cached offline reload, blocks HTTP during pairing/transfer, downloads and independently hashes the result, and captures desktop/mobile-width screenshots under ignored work/evidence/. It is a same-PC browser check, not a physical LAN benchmark.