{"_id":"9alma-app","_rev":"28-eb54123408e41bdac06b3617faed54da","name":"9alma-app","dist-tags":{"latest":"3.4.6"},"versions":{"3.4.1":{"name":"9alma-app","version":"3.4.1","keywords":["9alma","activation","license","ocr","dashboard","oauth2","dpop"],"author":{"url":"https://github.com/oliverawi","name":"oliverawi","email":"oliverawi1998@gmail.com"},"license":"UNLICENSED","_id":"9alma-app@3.4.1","maintainers":[{"name":"oliverawi","email":"oliverawi1998@gmail.com"}],"homepage":"https://github.com/oliverawi/9alma#readme","bugs":{"url":"https://github.com/oliverawi/9alma/issues"},"os":["win32","darwin","linux"],"bin":{"9alma":"bin/9alma.js","9alma-app":"bin/9alma.js"},"dist":{"shasum":"9f18617b6f1d8704b008e0ad34162b870e229215","tarball":"https://registry.npmjs.org/9alma-app/-/9alma-app-3.4.1.tgz","fileCount":29,"integrity":"sha512-umfHpTYO7/Kv+xt8VgWGD7MT2dj+GJyMB+8qTSOsbkycqnTmD8YZ75EGNFVexIp+vVCfoXUGEPuiU6ohS+mYRw==","signatures":[{"sig":"MEQCIFvNeqx75rwaJ+x5ZTxjd9cOq7vBXk3lESgyPfKDgss2AiAvj6oCRi1BPm8iyYX7H5vobtpXMDqhC32RDcQno6L9Yw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":682512},"main":"dist/app.js","engines":{"node":">=18.0.0"},"gitHead":"a329a61672238a54784a98c74e946dab02599479","scripts":{"dev":"nodemon src/app.js","build":"node build/obfuscate.js","start":"node bin/9alma.js","prepublishOnly":"npm run build"},"_npmUser":{"name":"oliverawi","email":"oliverawi1998@gmail.com"},"repository":{"url":"git+https://github.com/oliverawi/9alma.git","type":"git"},"_npmVersion":"11.12.1","description":"9alma — Activation & License Management Assistant. A web dashboard for M******ft product activation: convert I**********n *Ds (IID) into C*******tion *Ds (CID) with multi-account support, automatic OCR, a REST API, and self-update. For educational and tes","directories":{},"_nodeVersion":"24.15.0","dependencies":{"ejs":"^3.1.9","jose":"^5.2.0","open":"^8.4.2","axios":"^1.7.0","express":"^4.19.0","cookie-parser":"^1.4.6","better-sqlite3":"^12.0.0","express-session":"^1.18.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"sharp":"^0.34.5","nodemon":"^3.1.0","javascript-obfuscator":"^4.1.0"},"_npmOperationalInternal":{"tmp":"tmp/9alma-app_3.4.1_1779442621407_0.9054288295081139","host":"s3://npm-registry-packages-npm-production"}},"3.4.2":{"name":"9alma-app","version":"3.4.2","keywords":["9alma","activation","license","ocr","dashboard","oauth2","dpop"],"author":{"url":"https://github.com/oliverawi","name":"oliverawi","email":"oliverawi1998@gmail.com"},"license":"UNLICENSED","_id":"9alma-app@3.4.2","maintainers":[{"name":"oliverawi","email":"oliverawi1998@gmail.com"}],"homepage":"https://github.com/oliverawi/9alma#readme","bugs":{"url":"https://github.com/oliverawi/9alma/issues"},"os":["win32","darwin","linux"],"bin":{"9alma":"bin/9alma.js","9alma-app":"bin/9alma.js"},"dist":{"shasum":"08bc1ed2ea61059f3f51ea2d09f447dc0716337f","tarball":"https://registry.npmjs.org/9alma-app/-/9alma-app-3.4.2.tgz","fileCount":29,"integrity":"sha512-Y2IVpIvA2W8i92st8kUz4S16fLIPlircuIiMDHOiTIT/v8MVqDGayd6Bby0CdMslAiRRoyAAqQ1DCCRZ8kUoPA==","signatures":[{"sig":"MEUCIHr7Y6rLhcQuGA4ZvOICLNlmKFU9BzWNPs/lQ/CeXklPAiEAsV6cyhVZhZHW6RJRg/ZGO1Wb8iX69JCPDFKfrOnwOkk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":687362},"main":"dist/app.js","engines":{"node":">=18.0.0"},"gitHead":"434b9de93b1d3070628677e3ec14f235090960e3","scripts":{"dev":"nodemon src/app.js","build":"node build/obfuscate.js","start":"node bin/9alma.js","prepublishOnly":"npm run build"},"_npmUser":{"name":"oliverawi","email":"oliverawi1998@gmail.com"},"repository":{"url":"git+https://github.com/oliverawi/9alma.git","type":"git"},"_npmVersion":"11.12.1","description":"9alma — Activation & License Management Assistant. A web dashboard for M******ft product activation: convert I**********n *Ds (IID) into C*******tion *Ds (CID) with multi-account support, automatic OCR, a REST API, and self-update. For educational and tes","directories":{},"_nodeVersion":"24.15.0","dependencies":{"ejs":"^3.1.9","jose":"^5.2.0","open":"^8.4.2","axios":"^1.7.0","express":"^4.19.0","cookie-parser":"^1.4.6","better-sqlite3":"^12.0.0","express-session":"^1.18.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"sharp":"^0.34.5","nodemon":"^3.1.0","javascript-obfuscator":"^4.1.0"},"_npmOperationalInternal":{"tmp":"tmp/9alma-app_3.4.2_1783089646052_0.7887430626310288","host":"s3://npm-registry-packages-npm-production"}},"3.4.3":{"name":"9alma-app","version":"3.4.3","keywords":["9alma","activation","license","ocr","dashboard","oauth2","dpop"],"author":{"url":"https://github.com/oliverawi","name":"oliverawi","email":"oliverawi1998@gmail.com"},"license":"UNLICENSED","_id":"9alma-app@3.4.3","maintainers":[{"name":"oliverawi","email":"oliverawi1998@gmail.com"}],"homepage":"https://github.com/oliverawi/9alma#readme","bugs":{"url":"https://github.com/oliverawi/9alma/issues"},"os":["win32","darwin","linux"],"bin":{"9alma":"bin/9alma.js","9alma-app":"bin/9alma.js"},"dist":{"shasum":"0c74bca5f78284d9d6e2be243bffe0b601f8a105","tarball":"https://registry.npmjs.org/9alma-app/-/9alma-app-3.4.3.tgz","fileCount":29,"integrity":"sha512-ZAelphkBwgj4kdwwEPMlNQBRl3NLjOQOXNUPRXsOVCZJ2fd47hO5EMwg40QiD6dxvjLhkGt2wlvJHnruBl8ezA==","signatures":[{"sig":"MEQCIDi0b2iTI3knG4Sp3wAugIHui84ZXLqH+tqWfmugqsOoAiAKFKiOTiZRZSsAqHRTcsnvkOWRtzvxAGFoJ1j4mqyDtg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":686945},"main":"dist/app.js","engines":{"node":">=18.0.0"},"gitHead":"6fd9aac5b105cd2f3d58f4ecf6425af8a6369981","scripts":{"dev":"nodemon src/app.js","build":"node build/obfuscate.js","start":"node bin/9alma.js","prepublishOnly":"npm run build"},"_npmUser":{"name":"oliverawi","email":"oliverawi1998@gmail.com"},"repository":{"url":"git+https://github.com/oliverawi/9alma.git","type":"git"},"_npmVersion":"11.12.1","description":"9alma — Activation & License Management Assistant. A web dashboard for M******ft product activation: convert I**********n *Ds (IID) into C*******tion *Ds (CID) with multi-account support, automatic OCR, a REST API, and self-update. For educational and tes","directories":{},"_nodeVersion":"24.15.0","dependencies":{"ejs":"^3.1.9","jose":"^5.2.0","open":"^8.4.2","axios":"^1.7.0","express":"^4.19.0","cookie-parser":"^1.4.6","better-sqlite3":"^12.0.0","express-session":"^1.18.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"sharp":"^0.34.5","nodemon":"^3.1.0","javascript-obfuscator":"^4.1.0"},"_npmOperationalInternal":{"tmp":"tmp/9alma-app_3.4.3_1783096179194_0.9638728595778285","host":"s3://npm-registry-packages-npm-production"}},"3.4.4":{"name":"9alma-app","version":"3.4.4","keywords":["9alma","activation","license","ocr","dashboard","oauth2","dpop"],"author":{"url":"https://github.com/oliverawi","name":"oliverawi","email":"oliverawi1998@gmail.com"},"license":"UNLICENSED","_id":"9alma-app@3.4.4","maintainers":[{"name":"oliverawi","email":"oliverawi1998@gmail.com"}],"homepage":"https://github.com/oliverawi/9alma#readme","bugs":{"url":"https://github.com/oliverawi/9alma/issues"},"os":["win32","darwin","linux"],"bin":{"9alma":"bin/9alma.js","9alma-app":"bin/9alma.js"},"dist":{"shasum":"38a621af1beef68c0d67480c98c55786c8897131","tarball":"https://registry.npmjs.org/9alma-app/-/9alma-app-3.4.4.tgz","fileCount":29,"integrity":"sha512-yT9Eg526ADFAPda1Udj+QvXnper0raa9Uo6ubWGlSKa/h1vDHRl5YtO0Cuz0dYQB4KnKas9b25FCKsUBztSrMQ==","signatures":[{"sig":"MEUCIQC9x1xLBtchmQ4LIuCcPTGhBrT/RMtdnT3e6MRMQtsrFwIgb2jPYfH+ftxw+viduftc+hp51nD2XJcsut3ht9KMQXc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":680062},"main":"dist/app.js","engines":{"node":">=18.0.0"},"gitHead":"0b6d157e095be68bd49d80f36326a8b73ddd4e79","scripts":{"dev":"nodemon src/app.js","build":"node build/obfuscate.js","start":"node bin/9alma.js","prepublishOnly":"npm run build"},"_npmUser":{"name":"oliverawi","email":"oliverawi1998@gmail.com"},"repository":{"url":"git+https://github.com/oliverawi/9alma.git","type":"git"},"_npmVersion":"11.12.1","description":"9alma — Activation & License Management Assistant. A web dashboard for M******ft product activation: convert I**********n *Ds (IID) into C*******tion *Ds (CID) with multi-account support, automatic OCR, a REST API, and self-update. For educational and tes","directories":{},"_nodeVersion":"24.15.0","dependencies":{"ejs":"^3.1.9","jose":"^5.2.0","open":"^8.4.2","axios":"^1.7.0","express":"^4.19.0","cookie-parser":"^1.4.6","better-sqlite3":"^12.0.0","express-session":"^1.18.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"sharp":"^0.34.5","nodemon":"^3.1.0","javascript-obfuscator":"^4.1.0"},"_npmOperationalInternal":{"tmp":"tmp/9alma-app_3.4.4_1783097403899_0.287405040816332","host":"s3://npm-registry-packages-npm-production"}},"3.4.5":{"name":"9alma-app","version":"3.4.5","keywords":["9alma","activation","license","ocr","dashboard","oauth2","dpop"],"author":{"url":"https://github.com/oliverawi","name":"oliverawi","email":"oliverawi1998@gmail.com"},"license":"UNLICENSED","_id":"9alma-app@3.4.5","maintainers":[{"name":"oliverawi","email":"oliverawi1998@gmail.com"}],"homepage":"https://github.com/oliverawi/9alma#readme","bugs":{"url":"https://github.com/oliverawi/9alma/issues"},"os":["win32","darwin","linux"],"bin":{"9alma":"bin/9alma.js","9alma-app":"bin/9alma.js"},"dist":{"shasum":"4093c7c9ff5b64722e801b6a3238791453b4d593","tarball":"https://registry.npmjs.org/9alma-app/-/9alma-app-3.4.5.tgz","fileCount":29,"integrity":"sha512-tobpRBgpldue9KbTqOmdYmOmwpXyXMkjbqdbbc0osy87GPqBebAAu/oRhsAU7bFhjQyggRxymJtjM+lDRn3Igg==","signatures":[{"sig":"MEUCIEyP/N8HnddDxwkWOPtIqLpwc2aH3Oa+AhPNmrpAaoj5AiEA4jLtNNKLhZUqzCvRsBoPpoL84SZu/Q3k0Nq2SQnQoy0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":683253},"main":"dist/app.js","engines":{"node":">=18.0.0"},"gitHead":"987fb48c77c93eeabc8985efd1cf340569255994","scripts":{"dev":"nodemon src/app.js","build":"node build/obfuscate.js","start":"node bin/9alma.js","prepublishOnly":"npm run build"},"_npmUser":{"name":"oliverawi","email":"oliverawi1998@gmail.com"},"repository":{"url":"git+https://github.com/oliverawi/9alma.git","type":"git"},"_npmVersion":"11.12.1","description":"9alma — Activation & License Management Assistant. A web dashboard for M******ft product activation: convert I**********n *Ds (IID) into C*******tion *Ds (CID) with multi-account support, automatic OCR, a REST API, and self-update. For educational and tes","directories":{},"_nodeVersion":"24.15.0","dependencies":{"ejs":"^3.1.9","jose":"^5.2.0","open":"^8.4.2","axios":"^1.7.0","express":"^4.19.0","cookie-parser":"^1.4.6","better-sqlite3":"^12.0.0","express-session":"^1.18.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"sharp":"^0.34.5","nodemon":"^3.1.0","javascript-obfuscator":"^4.1.0"},"_npmOperationalInternal":{"tmp":"tmp/9alma-app_3.4.5_1783097884373_0.3977315914864661","host":"s3://npm-registry-packages-npm-production"}},"3.4.6":{"name":"9alma-app","version":"3.4.6","description":"9alma — Activation & License Management Assistant. A web dashboard for M******ft product activation: convert I**********n *Ds (IID) into C*******tion *Ds (CID) with multi-account support, automatic OCR, a REST API, and self-update. For educational and tes","main":"dist/app.js","bin":{"9alma":"bin/9alma.js","9alma-app":"bin/9alma.js"},"homepage":"https://github.com/oliverawi/9alma#readme","repository":{"type":"git","url":"git+https://github.com/oliverawi/9alma.git"},"bugs":{"url":"https://github.com/oliverawi/9alma/issues"},"author":{"name":"oliverawi","email":"oliverawi1998@gmail.com","url":"https://github.com/oliverawi"},"publishConfig":{"access":"public"},"scripts":{"start":"node bin/9alma.js","dev":"nodemon src/app.js","build":"node build/obfuscate.js","prepublishOnly":"npm run build"},"engines":{"node":">=18.0.0"},"os":["win32","darwin","linux"],"dependencies":{"axios":"^1.7.0","better-sqlite3":"^12.0.0","cookie-parser":"^1.4.6","ejs":"^3.1.9","express":"^4.19.0","express-session":"^1.18.0","jose":"^5.2.0","open":"^8.4.2"},"devDependencies":{"javascript-obfuscator":"^4.1.0","nodemon":"^3.1.0","sharp":"^0.34.5"},"keywords":["9alma","activation","license","ocr","dashboard","oauth2","dpop"],"license":"UNLICENSED","gitHead":"a05911afc210fd2e656e594ca6c81a60913fb79b","_id":"9alma-app@3.4.6","_nodeVersion":"24.15.0","_npmVersion":"11.12.1","dist":{"integrity":"sha512-hO5TEVBJBybjKi8ISoTkT/Wht+1E++Q1LLPj/kDeINnA6BlDoeE5A+KrewcRLnWI8Y/9qmHyO0Ac1rFI59ic/A==","shasum":"cebda3e7aeece32096a3a36015ca968a1c9240df","tarball":"https://registry.npmjs.org/9alma-app/-/9alma-app-3.4.6.tgz","fileCount":29,"unpackedSize":711453,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCgm31O//NFYLX8+y1yITazQoLce+E01l7ImYGvru0Q2AIgRCFneJF5uivcTgmasYwaZdvU2G5oBcZD+RWg8ckaRiQ="}]},"_npmUser":{"name":"oliverawi","email":"oliverawi1998@gmail.com"},"directories":{},"maintainers":[{"name":"oliverawi","email":"oliverawi1998@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/9alma-app_3.4.6_1783699500171_0.30654500016940855"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-14T05:02:24.770Z","modified":"2026-07-10T16:05:00.440Z","3.2.0":"2026-05-14T05:02:25.023Z","3.2.1":"2026-05-14T05:12:51.486Z","3.2.2":"2026-05-14T05:30:32.217Z","3.2.3":"2026-05-14T06:55:20.163Z","3.3.0":"2026-05-14T08:41:29.532Z","3.3.1":"2026-05-14T09:16:02.932Z","3.3.2":"2026-05-14T09:23:56.045Z","3.3.3":"2026-05-14T09:33:17.651Z","3.3.4":"2026-05-21T10:30:03.338Z","3.3.5":"2026-05-21T11:04:43.188Z","3.4.0":"2026-05-22T09:06:50.724Z","3.4.1":"2026-05-22T09:37:01.672Z","3.4.2":"2026-07-03T14:40:46.239Z","3.4.3":"2026-07-03T16:29:39.405Z","3.4.4":"2026-07-03T16:50:04.080Z","3.4.5":"2026-07-03T16:58:04.579Z","3.4.6":"2026-07-10T16:05:00.327Z"},"bugs":{"url":"https://github.com/oliverawi/9alma/issues"},"author":{"name":"oliverawi","email":"oliverawi1998@gmail.com","url":"https://github.com/oliverawi"},"license":"UNLICENSED","homepage":"https://github.com/oliverawi/9alma#readme","keywords":["9alma","activation","license","ocr","dashboard","oauth2","dpop"],"repository":{"type":"git","url":"git+https://github.com/oliverawi/9alma.git"},"description":"9alma — Activation & License Management Assistant. A web dashboard for M******ft product activation: convert I**********n *Ds (IID) into C*******tion *Ds (CID) with multi-account support, automatic OCR, a REST API, and self-update. For educational and tes","maintainers":[{"name":"oliverawi","email":"oliverawi1998@gmail.com"}],"readme":"# 9alma\r\n\r\n**Activation & License Management Assistant**\r\n\r\nA web dashboard for M******ft product activation. Convert I**********n *Ds (IID) into C*******tion *Ds (CID) with multi-account support, automatic OCR, a REST API, and self-update.\r\n\r\n\r\n[![npm](https://img.shields.io/npm/v/9alma-app.svg)](https://www.npmjs.com/package/9alma-app)\r\n[![node](https://img.shields.io/node/v/9alma-app.svg)](https://nodejs.org)\r\n\r\n---\r\n\r\n> ## ⚠️ Disclaimer\r\n>\r\n> This project is provided **strictly for educational, research, testing, and personal development purposes**.\r\n>\r\n> - The author is **NOT responsible** for any misuse of this software.\r\n> - The author is **NOT affiliated** with, sponsored by, endorsed by, or working in cooperation with any company, organization, or third party referenced in this project.\r\n> - This software is **NOT intended** to harm, defraud, or cause loss to any person, company, or entity.\r\n> - Any user of this software is **fully responsible** for ensuring their use complies with all applicable laws, regulations, and the terms of service of any third-party platform.\r\n> - Use at your own risk. The software is provided \"AS IS\" without warranty of any kind.\r\n>\r\n> By installing or using this software you acknowledge and accept the terms above.\r\n\r\n---\r\n\r\n## Quick Start (for Users)\r\n\r\n### 1. Install\r\n```bash\r\nnpm install -g 9alma-app\r\n```\r\n\r\n### 2. Run\r\n```bash\r\n9alma\r\n```\r\n\r\nThe browser will open automatically at `http://localhost:8556`.\r\n\r\n### 3. First Login\r\n- Username: `superadmin`\r\n- Password: `superadmin`\r\n\r\nYou will be asked to change your password after the first login.\r\n\r\n### 4. Set Up an M******ft Account\r\n- Log in to the dashboard\r\n- Go to **Token Manager** → **Setup New Token**\r\n- Follow the device code flow (sign in with your M******ft account)\r\n\r\n### 5. Configure OCR (optional)\r\n- Settings → **OCR.space API Key**\r\n- Sign up for a free key at https://ocr.space/ocrapi/freekey\r\n- Paste the key → Save\r\n\r\n### 6. Generate a CID\r\n- Go to **Generate CID**\r\n- Paste a 54 or 63 digit IID, or drag and drop a screenshot\r\n- Click **Generate CID**\r\n\r\n---\r\n\r\n## Updating\r\n\r\n### Automatic (via Dashboard)\r\nWhen a new version is available, the sidebar will display:\r\n```\r\n↑ New version: v3.x.x\r\n[Update Now]\r\nnpm i -g 9alma-app@latest --prefer-online\r\n```\r\nClick **Update Now**, or copy the command to install manually.\r\n\r\n### Manual\r\n```bash\r\nnpm install -g 9alma-app@latest --prefer-online\r\n```\r\n\r\n---\r\n\r\n## Data Location\r\n\r\nThe database and configuration are stored in:\r\n- **Windows**: `C:\\Users\\<username>\\.9alma\\accounts.db`\r\n- **macOS / Linux**: `~/.9alma/accounts.db`\r\n\r\nThis data is **not** removed during updates.\r\n\r\n---\r\n\r\n## Features\r\n\r\n- ✅ OAuth2 Device Code Flow for M******ft sign-in\r\n- ✅ Auto-refreshing tokens (in the background)\r\n- ✅ Multi-account support with round-robin mode\r\n- ✅ DPoP-signed JWT requests\r\n- ✅ Automatic OCR (paste / drop a screenshot to extract the IID)\r\n- ✅ Realtime token countdown on the accounts page\r\n- ✅ REST API with token authentication\r\n- ✅ Role-based access control (superadmin / admin / user)\r\n- ✅ Endpoint management (enable / disable per endpoint)\r\n- ✅ Self-update via the npm registry\r\n\r\n---\r\n\r\n## REST API Usage\r\n\r\nAfter generating an API token from the **API Keys** page:\r\n\r\n### Generate a CID\r\n```bash\r\ncurl -X POST http://localhost:8556/validate \\\r\n  -H \"Authorization: Bearer YOUR_API_TOKEN\" \\\r\n  -H \"Content-Type: application/json\" \\\r\n  -d '{\"iid\": \"YOUR_63_OR_54_DIGIT_IID\"}'\r\n```\r\n\r\n### OCR + Generate CID (one-shot)\r\n```bash\r\ncurl -X POST http://localhost:8556/api/ocr-validate \\\r\n  -H \"Authorization: Bearer YOUR_API_TOKEN\" \\\r\n  -H \"Content-Type: application/json\" \\\r\n  -d '{\"image\": \"data:image/jpeg;base64,...\"}'\r\n```\r\n\r\n### Health Check\r\n```bash\r\ncurl http://localhost:8556/health\r\n```\r\n\r\n---\r\n\r\n## For Developers\r\n\r\n### Requirements\r\n- Node.js >= 18\r\n- npm 8+\r\n\r\n### Local Development\r\n```bash\r\ngit clone https://github.com/oliverawi/9alma.git\r\ncd 9alma\r\nnpm install\r\nnpm start            # production-like\r\nnpm run dev          # nodemon hot-reload\r\n```\r\n\r\n### Project Structure\r\n```\r\n9alma/\r\n├── bin/9alma.js          # CLI entry point (supervisor)\r\n├── src/                  # Source code\r\n│   ├── app.js            # Express app and routes\r\n│   ├── config.js         # Default values and config metadata\r\n│   ├── db.js             # SQLite schema and helpers\r\n│   ├── auth.js           # Session and role middleware\r\n│   ├── oauth.js          # OAuth, DPoP and OCR\r\n│   ├── crypto-utils.js   # DPoP JWT, IID parser\r\n│   ├── seed-endpoints.js # Default API endpoints\r\n│   ├── updater.js        # npm-based self-updater\r\n│   └── banner.js         # Terminal banner with IP info\r\n├── views/                # EJS templates\r\n├── public/               # Static CSS / JS / images\r\n├── build/obfuscate.js    # Source obfuscation build script\r\n├── VERSION.txt\r\n├── package.json\r\n├── .gitignore\r\n└── .npmignore\r\n```\r\n\r\n### Publishing a New Version\r\n```bash\r\n# 1. Bump the version\r\nnpm version patch                                  # 3.x.x → 3.x.y\r\nnode -e \"require('fs').writeFileSync('VERSION.txt', require('./package.json').version + '\\n')\"\r\n\r\n# 2. Push to GitHub\r\ngit add .\r\ngit commit -m \"Release v3.x.y\"\r\ngit push origin main --tags\r\n\r\n# 3. Publish to npm (prepublishOnly auto-runs source obfuscation)\r\nnpm publish\r\n```\r\n\r\nExisting users will be notified about the new version on the dashboard sidebar within 30 minutes (polling interval). The supervisor in `bin/9alma.js` will auto-restart the app in place after a successful update.\r\n\r\n---\r\n\r\n## Security\r\n\r\n- **Session security**: The secret key is regenerated on every startup, so old sessions are invalidated after a restart.\r\n- **API token auth**: Each user has an independent API token that inherits their role.\r\n- **DPoP signing**: Every request to the upstream API is signed with a per-account EC private key.\r\n- **Database isolation**: Data is stored in `~/.9alma/`, untouched by updates.\r\n\r\n---\r\n\r\n## Configuration\r\n\r\nAll configuration can be changed from the **Settings** page (superadmin only):\r\n\r\n| Category | Key | Description |\r\n|----------|-----|-------------|\r\n| OAuth | `ms_client_id` | Application client ID |\r\n| OAuth | `ms_token_url` | OAuth2 token endpoint |\r\n| OAuth | `ms_device_code_url` | Device code endpoint |\r\n| OAuth | `ms_scope` | OAuth2 scopes |\r\n| V****L S*****t API | `visual_api_url` | Validation endpoint URL |\r\n| V****L S*****t API | `visual_api_path` | Path used for the DPoP signature |\r\n| OCR | `ocr_api_key` | OCR.space API key (free tier is fine) |\r\n| OCR | `ocr_api_url` | OCR.space endpoint |\r\n| OCR | `ocr_language` | Language code (default: `eng`) |\r\n| OCR | `ocr_engines` | Engines to try (default: `2,3,1`) |\r\n| Session | `session_lifetime_minutes` | Session timeout in minutes |\r\n| Server | `server_port` | HTTP port (default: 8556) |\r\n| Server | `server_host` | Bind address (default: 0.0.0.0) |\r\n\r\n\r\n---\r\n\r\n## Links\r\n\r\n- **npm**: https://www.npmjs.com/package/9alma-app\r\n- **Issues**: https://github.com/oliverawi/9alma/issues\r\n\r\n---\r\n\r\n## License\r\n\r\n**No Warranty / No Liability — Personal & Educational Use Only**\r\n\r\nThis software is released without any warranty, express or implied. The author provides this project free of charge for **educational, research, testing, and personal development** purposes only.\r\n\r\n- **No liability**: The author shall not be held liable for any direct, indirect, incidental, special, consequential, or punitive damages arising out of the use, misuse, or inability to use this software.\r\n- **No affiliation**: This project is an independent work. It is not affiliated with, endorsed by, or sponsored by any company, organization, or third party referenced (directly or indirectly) in the source code, documentation, or runtime output.\r\n- **No malicious intent**: This project is not designed to defraud, harm, or cause loss to any person or entity.\r\n- **User responsibility**: Each user is solely responsible for verifying that their use of this software complies with all applicable laws, regulations, and third-party terms of service in their jurisdiction.\r\n\r\nBy downloading, installing, or running this software, you accept these terms in full.\r\n\r\n## Credits\r\n\r\nPowered by Logic 💪\r\n","readmeFilename":"README.md"}