{"_id":"@abhi_zit/terminaltalk","_rev":"4-93f7940913628d544d914770cfc881e0","name":"@abhi_zit/terminaltalk","dist-tags":{"latest":"0.1.3"},"versions":{"0.1.0":{"name":"@abhi_zit/terminaltalk","version":"0.1.0","keywords":["terminal","chat","ink","convex","cli","tui"],"author":{"name":"Abhijit Singh"},"license":"MIT","_id":"@abhi_zit/terminaltalk@0.1.0","maintainers":[{"name":"abhi_zit","email":"abhiisingh769@gmail.com"}],"bin":{"terminaltalk":"dist/cli.js"},"dist":{"shasum":"10576d2984d07ebb1e7c25480bc779b756d70c45","tarball":"https://registry.npmjs.org/@abhi_zit/terminaltalk/-/terminaltalk-0.1.0.tgz","fileCount":24,"integrity":"sha512-CbOpfn1ts2cCl0faR2BSrsLyVu543SIOKAATsu6QsDZGU1YTEiCqLlRh7vHRiL4mSyWEOHPJqaTNROx7JrnluA==","signatures":[{"sig":"MEYCIQCXS9uUGO7sisUo8Vh3gdfnWz5JwLjNCndwMPqyUkR1jAIhAOqixEFSOB8EPFBSF4Krto6FCsKULXjjbdPfC/ats1Wq","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":76943},"type":"module","engines":{"node":">=20"},"gitHead":"f1603906c8b690538842fdd8d19b92cd26e3fa0b","scripts":{"dev":"tsx src/cli.tsx","lint":"eslint .","test":"vitest run","build":"npm run clean && tsc -p tsconfig.build.json","clean":"node -e \"fs.rmSync('dist', { recursive: true, force: true })\"","start":"tsx src/cli.tsx","pack:dry":"npm pack --dry-run","validate":"npm run lint && npx tsc --noEmit && npm test","typecheck":"tsc --noEmit"},"_npmUser":{"name":"abhi_zit","email":"abhiisingh769@gmail.com"},"_npmVersion":"11.15.0","description":"Open-source realtime terminal chat built with Ink and Convex.","directories":{},"_nodeVersion":"24.16.0","dependencies":{"ink":"^5.2.1","zod":"^3.25.76","react":"^18.3.1","convex":"^1.25.4","nanoid":"^5.1.5","@noble/hashes":"^1.8.0","systeminformation":"^5.27.11"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.3","eslint":"^9.32.0","vitest":"^4.1.8","@eslint/js":"^9.32.0","typescript":"^5.8.3","@types/node":"^22.13.14","@types/react":"^18.3.23","typescript-eslint":"^8.38.0"},"_npmOperationalInternal":{"tmp":"tmp/terminaltalk_0.1.0_1780496989401_0.15153805177667734","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@abhi_zit/terminaltalk","version":"0.1.1","keywords":["terminal","chat","ink","convex","cli","tui"],"author":{"name":"Abhijit Singh"},"license":"MIT","_id":"@abhi_zit/terminaltalk@0.1.1","maintainers":[{"name":"abhi_zit","email":"abhiisingh769@gmail.com"}],"bin":{"terminaltalk":"dist/cli.js"},"dist":{"shasum":"cde15d40d109afc70e5a55764ee4ec62f4876898","tarball":"https://registry.npmjs.org/@abhi_zit/terminaltalk/-/terminaltalk-0.1.1.tgz","fileCount":32,"integrity":"sha512-juXQz974MJveLINNBJCaChCPFwx/7aaTBUnZUfjyJicyDLIyMPmF9VDcqtgDgVxO57TYstXLIqTEDKwpt+ZPhg==","signatures":[{"sig":"MEUCIAwdoneMkANNS7tuEDwAIrhIrOxSx+1H9G824/m3CAhAAiEAqOd4VBD0owGkQnJ8UNJux2lgC6iF4kminR9KH4blkFQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":183738},"type":"module","engines":{"node":">=20"},"gitHead":"1e2d03fd135c4d8168efcdb990fa8b9c76697b42","scripts":{"dev":"tsx src/cli.tsx","lint":"eslint .","test":"vitest run","build":"npm run clean && tsc -p tsconfig.build.json","clean":"node -e \"fs.rmSync('dist', { recursive: true, force: true })\"","start":"tsx src/cli.tsx","pack:dry":"npm pack --dry-run","validate":"npm run lint && npx tsc --noEmit && npm test","typecheck":"tsc --noEmit"},"_npmUser":{"name":"abhi_zit","email":"abhiisingh769@gmail.com"},"_npmVersion":"11.15.0","description":"Open-source realtime terminal chat built with Ink and Convex.","directories":{},"_nodeVersion":"24.16.0","dependencies":{"ink":"^5.2.1","zod":"^3.25.76","react":"^18.3.1","convex":"^1.25.4","nanoid":"^5.1.5","@noble/hashes":"^1.8.0","systeminformation":"^5.27.11"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.3","eslint":"^9.32.0","vitest":"^4.1.8","@eslint/js":"^9.32.0","typescript":"^5.8.3","@types/node":"^22.13.14","@types/react":"^18.3.23","typescript-eslint":"^8.38.0"},"_npmOperationalInternal":{"tmp":"tmp/terminaltalk_0.1.1_1781154549900_0.3834094739924714","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@abhi_zit/terminaltalk","version":"0.1.2","keywords":["terminal","chat","ink","convex","cli","tui"],"author":{"name":"Abhijit Singh"},"license":"MIT","_id":"@abhi_zit/terminaltalk@0.1.2","maintainers":[{"name":"abhi_zit","email":"abhiisingh769@gmail.com"}],"bin":{"terminaltalk":"dist/cli.js"},"dist":{"shasum":"0091bccfed0b31536bd67bf445baa09623614706","tarball":"https://registry.npmjs.org/@abhi_zit/terminaltalk/-/terminaltalk-0.1.2.tgz","fileCount":32,"integrity":"sha512-9db8FGwf79zuG70ijKVZHSCoUMkgrFC7Zquacf0g9zHcTsw4zIX0f4YEVs8NxOfenwQsHas9apgusd+0YJa9Mg==","signatures":[{"sig":"MEYCIQCCHXf3JynGKPxxVK/QSvrJbh9da44rABvnER4VpoLTXwIhAPu8WemQXKq7A3aeH++67EE6XmHaPJpDQvX7C73G+NNl","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":184001},"type":"module","engines":{"node":">=20"},"gitHead":"1e2d03fd135c4d8168efcdb990fa8b9c76697b42","scripts":{"dev":"tsx src/cli.tsx","lint":"eslint .","test":"vitest run","build":"npm run clean && tsc -p tsconfig.build.json","clean":"node -e \"fs.rmSync('dist', { recursive: true, force: true })\"","start":"tsx src/cli.tsx","pack:dry":"npm pack --dry-run","validate":"npm run lint && npx tsc --noEmit && npm test","typecheck":"tsc --noEmit"},"_npmUser":{"name":"abhi_zit","email":"abhiisingh769@gmail.com"},"_npmVersion":"11.15.0","description":"Open-source realtime terminal chat built with Ink and Convex.","directories":{},"_nodeVersion":"24.16.0","dependencies":{"ink":"^5.2.1","zod":"^3.25.76","react":"^18.3.1","convex":"^1.25.4","nanoid":"^5.1.5","@noble/hashes":"^1.8.0","systeminformation":"^5.27.11"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.3","eslint":"^9.32.0","vitest":"^4.1.8","@eslint/js":"^9.32.0","typescript":"^5.8.3","@types/node":"^22.13.14","@types/react":"^18.3.23","typescript-eslint":"^8.38.0"},"_npmOperationalInternal":{"tmp":"tmp/terminaltalk_0.1.2_1781155677842_0.7281019717300057","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@abhi_zit/terminaltalk","version":"0.1.3","description":"Open-source realtime terminal chat built with Ink and Convex.","type":"module","bin":{"terminaltalk":"dist/cli.js"},"scripts":{"build":"npm run clean && tsc -p tsconfig.build.json","clean":"node -e \"fs.rmSync('dist', { recursive: true, force: true })\"","dev":"tsx src/cli.tsx","lint":"eslint .","pack:dry":"npm pack --dry-run","start":"tsx src/cli.tsx","test":"vitest run","typecheck":"tsc --noEmit","validate":"npm run lint && npx tsc --noEmit && npm test"},"keywords":["terminal","chat","ink","convex","cli","tui"],"author":{"name":"Abhijit Singh"},"license":"MIT","publishConfig":{"access":"public"},"dependencies":{"@noble/hashes":"^1.8.0","convex":"^1.25.4","ink":"^5.2.1","nanoid":"^5.1.5","react":"^18.3.1","systeminformation":"^5.27.11","zod":"^3.25.76"},"devDependencies":{"@eslint/js":"^9.32.0","@types/node":"^22.13.14","@types/react":"^18.3.23","eslint":"^9.32.0","tsx":"^4.20.3","typescript":"^5.8.3","typescript-eslint":"^8.38.0","vitest":"^4.1.8"},"engines":{"node":">=20"},"gitHead":"9bcfacd1f9905423bb6883a955186b8587f14e24","_id":"@abhi_zit/terminaltalk@0.1.3","_nodeVersion":"24.16.0","_npmVersion":"11.15.0","dist":{"integrity":"sha512-JTPlNTiMhRlXMdIT0C2NGzIF2PZlgcu++L6eapvEZRVS4IFRhuDUgRGZ0tCKLpv6pKFX1LHrBkORnRmmNT6cBQ==","shasum":"3ea3b86916d28d9366666444b4d662b9ae3c0ba2","tarball":"https://registry.npmjs.org/@abhi_zit/terminaltalk/-/terminaltalk-0.1.3.tgz","fileCount":32,"unpackedSize":184935,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIB8h3OJgYq7x0EypKb8nxyT4ipoKTu7oK5LMn7wU6eYVAiEA09xE7RVHpmhlAwR4PYJLVDX6DQE+URvtyqYHywdIIX0="}]},"_npmUser":{"name":"abhi_zit","email":"abhiisingh769@gmail.com"},"directories":{},"maintainers":[{"name":"abhi_zit","email":"abhiisingh769@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/terminaltalk_0.1.3_1781157920331_0.6041411547802147"},"_hasShrinkwrap":false}},"time":{"created":"2026-06-03T14:29:49.059Z","modified":"2026-06-11T06:05:20.592Z","0.1.0":"2026-06-03T14:29:49.649Z","0.1.1":"2026-06-11T05:09:10.110Z","0.1.2":"2026-06-11T05:27:57.976Z","0.1.3":"2026-06-11T06:05:20.489Z"},"author":{"name":"Abhijit Singh"},"license":"MIT","keywords":["terminal","chat","ink","convex","cli","tui"],"description":"Open-source realtime terminal chat built with Ink and Convex.","maintainers":[{"name":"abhi_zit","email":"abhiisingh769@gmail.com"}],"readme":"# TerminalTalk\r\n\r\nMIND IT IT'S STILL IN TESTING SO ANY INTERACTION WITH THE CODE CAN BE HARMFULL\r\nOpen-source realtime terminal chat built with TypeScript, Ink, and Convex.\r\n\r\nTerminalTalk is a dedicated terminal UI for chatting from the command line. It\r\nopens as an app-like TUI, keeps local device details local, and uses Convex for\r\nrealtime accounts, sessions, groups, friends, and messages.\r\n\r\n```bash\r\nnpm i -g @abhi_zit/terminaltalk\r\nterminaltalk\r\n```\r\n\r\nThe npm package is scoped as `@abhi_zit/terminaltalk`. The product name is\r\n`TerminalTalk`, and the CLI command is `terminaltalk`.\r\n\r\n## Features\r\n\r\n- Realtime terminal chat powered by Convex.\r\n- Ink and React TUI with profile, groups, friends, chat history, composer, quick commands, and local system status.\r\n- Group chat with generated join codes.\r\n- Direct chats between accepted friends only.\r\n- Friend requests, blocking, unblocking, and local private nicknames.\r\n- Account settings for display name, username, and password changes.\r\n- Theme picker with persisted local theme selection.\r\n- Terminal-session-based message disappearance: message bodies are removed when a terminal session ends or expires.\r\n- Vanished-message placeholders stay visible for 24 hours, then are cleaned up automatically.\r\n- Local demo mode for UI development without a Convex deployment.\r\n- Local-only system stats. RAM, disk, CPU, OS, GPU, and network status are shown in the UI but are not written to Convex.\r\n- Password hashing with salted PBKDF2-HMAC-SHA256. Raw passwords are never stored.\r\n- Local session persistence under the OS config directory.\r\n\r\n## Install\r\n\r\n```bash\r\nnpm i -g @abhi_zit/terminaltalk\r\nterminaltalk\r\n```\r\n\r\nTerminalTalk requires Node.js 20 or newer.\r\n\r\n## Local Development\r\n\r\n```bash\r\nnpm install\r\nnpm run dev\r\n```\r\n\r\nWithout a local Convex URL, TerminalTalk uses the public TerminalTalk Convex\ndeployment. Set demo mode when you want an in-memory local UI session instead.\n\r\nPowerShell demo mode:\r\n\r\n```powershell\r\n$env:TERMINALTALK_DEMO_MODE=\"true\"\r\nnpm run dev\r\n```\r\n\r\nmacOS/Linux demo mode:\r\n\r\n```bash\r\nTERMINALTALK_DEMO_MODE=true npm run dev\r\n```\r\n\r\n## Convex Setup\r\n\r\nCreate a Convex project, then deploy or run the functions in `convex/`.\r\n\r\n```bash\r\nnpx convex dev\r\n```\r\n\r\nSet the public deployment URL in `.env`:\r\n\r\n```bash\r\nTERMINALTALK_CONVEX_URL=https://your-project.convex.cloud\r\nTERMINALTALK_DEMO_MODE=false\r\n```\r\n\r\nDo not commit `.env`, private deployment credentials, or secrets.\r\n\r\n## Environment Variables\r\n\r\n| Variable | Required | Purpose |\n| --- | --- | --- |\n| `TERMINALTALK_CONVEX_URL` | No | Override the public TerminalTalk Convex deployment used by the CLI client. |\n| `TERMINALTALK_DEMO_MODE` | No | Set to `true` to use the in-memory demo gateway for local UI work. |\n\r\n## Command Reference\r\n\r\nTerminalTalk has two kinds of actions:\r\n\r\n- Slash commands typed into the composer.\r\n- Sidebar action menus opened with keyboard selection and Enter.\r\n\r\n### Slash Commands\r\n\r\n| Command | Purpose |\r\n| --- | --- |\r\n| `/theme` | Open the theme picker. Use arrow keys to preview, number keys `1-5` to choose, Enter to return, and Esc to close. |\r\n| `/settings` | Open account settings for display name, username, current password, and new password. Enter advances fields and saves on the last field. Esc closes. |\r\n| `/create-group <name>` | Create a new group and receive a join code. Group names may contain spaces. |\r\n| `/join-group <code>` | Join an existing group with its join code. |\r\n| `/add-friend <username>` | Send a friend request to another user. |\r\n| `/help` | Show the currently available slash commands in the notice line. |\r\n| `/logout` | Clear the local stored session and return to the auth screen. |\r\n\r\nText that does not start with `/` is sent as a message to the active chat.\r\n\r\n### Sidebar Actions\r\n\r\nMove focus into the sidebar, select a group or friend, and press Enter to open\r\nits action menu.\r\n\r\nFriend actions:\r\n\r\n| Action | Purpose |\r\n| --- | --- |\r\n| `Open Chat` | Open a direct chat with an accepted friend. |\r\n| `Set Nickname` | Save a private local nickname for that friend. Nicknames are not persisted to Convex. |\r\n| `Accept Request` | Accept an incoming friend request. |\r\n| `Deny Request` | Deny an incoming friend request. |\r\n| `Cancel Request` | Cancel an outgoing friend request. |\r\n| `Block` | Block a user and remove any stale accepted friendship. |\r\n| `Unblock` | Remove a block. A fresh friend request is required before chatting again. |\r\n\r\nGroup actions:\r\n\r\n| Action | Purpose |\r\n| --- | --- |\r\n| `Open Chat` | Open the selected group chat. |\r\n| `Leave Group` | Leave the selected group. The built-in demo group cannot be left in demo mode. |\r\n\r\n### Keyboard Controls\r\n\r\n| Key | Purpose |\r\n| --- | --- |\r\n| `Enter` | Send a message, advance form fields, select a menu action, or save on the final settings field. |\r\n| `Ctrl+N` | Insert a newline in the message composer. |\r\n| `Ctrl+C` | Exit the app. |\r\n| `Esc` | Close settings, theme picker, nickname editor, or action menus. |\r\n| `PageUp` / `PageDown` | Scroll chat history. |\r\n| `k` / `j` | Scroll chat history when the composer is empty. |\r\n| Arrow keys | Move through menus and theme options. |\r\n| Number keys `1-5` | Select a theme in the theme picker. |\r\n\r\nMouse-wheel scrolling is best effort and depends on the terminal forwarding\r\nxterm mouse events.\r\n\r\n## Message Disappearance Model\r\n\r\nTerminalTalk ties messages to a terminal session.\r\n\r\n1. A terminal session starts after sign-in.\r\n2. The client sends heartbeats while the TUI is open.\r\n3. When the terminal closes cleanly, that session ends.\r\n4. If heartbeats stop, Convex expires the session.\r\n5. Messages from the ended or expired terminal session are redacted by removing the message body.\r\n6. Other users see `<sender>'s message vanished` for 24 hours after redaction.\r\n7. After 24 hours, the placeholder is removed from query results and a Convex cron deletes the redacted record.\r\n\r\nThe original message body is not retained after redaction.\r\n\r\n## Security And Privacy\r\n\r\n- No account recovery exists in the first release.\r\n- Forgotten passwords cannot be reset yet.\r\n- Passwords are hashed before storage.\r\n- Session tokens are stored locally, and only token hashes are stored in Convex.\r\n- Group join codes are returned to the creator and stored as hashes in Convex.\r\n- Convex authorizes group messages by group membership.\r\n- Convex authorizes direct messages by accepted friendships.\r\n- Blocking removes stale accepted relationships and blocks direct messages in both directions.\r\n- Friend and group sidebars may load from local cache, but Convex still authorizes message access.\r\n- Private nicknames are local device data only.\r\n- Local system stats are display-only and are not persisted to Convex.\r\n\r\n## Project Structure\r\n\r\n```text\r\nconvex/                     Convex schema, auth, groups, friends, messages, crons\r\nsrc/cli.tsx                 CLI entry point\r\nsrc/ui/App.tsx              Main Ink TUI\r\nsrc/ui/tuiLayout.ts         Pure layout, wrapping, scrolling, and composer helpers\r\nsrc/services/chatGateway.ts Convex and demo chat gateways\r\nsrc/services/sessionStore.ts Local session, directory cache, theme, and nickname storage\r\nsrc/config/themes.ts        Terminal themes\r\ntests/                      Vitest coverage for parser, gateway, layout, env, sessions, themes\r\n```\r\n\r\n## Development Scripts\r\n\r\n| Command | Purpose |\r\n| --- | --- |\r\n| `npm run dev` | Start TerminalTalk from TypeScript source. |\r\n| `npm start` | Alias for starting the TypeScript CLI. |\r\n| `npm run lint` | Run ESLint. |\r\n| `npm run typecheck` | Run TypeScript with `--noEmit`. |\r\n| `npx tsc --noEmit` | Typecheck without using the npm script. |\r\n| `npm test` | Run the Vitest suite. |\r\n| `npm run validate` | Run lint, typecheck, and tests. |\r\n| `npm audit --audit-level=high` | Check for high-severity dependency vulnerabilities. |\r\n| `npm run build` | Clean and build the package into `dist/`. |\r\n| `npm run pack:dry` | Preview the npm package contents without publishing. |\r\n\r\n## Validation\r\n\r\nRun the full quality gate before publishing:\r\n\r\n```bash\r\nnpm run lint\r\nnpx tsc --noEmit\r\nnpm test\r\nnpm audit --audit-level=high\r\nnpm run build\r\nnpm run pack:dry\r\n```\r\n\r\n## Release And NPM Update Commands\r\n\r\nUse these commands when publishing a new npm package version.\r\n\r\nPatch release:\r\n\r\n```bash\r\nnpm version patch\r\nnpm run validate\r\nnpm audit --audit-level=high\r\nnpm run build\r\nnpm run pack:dry\r\nnpm publish --access public\r\ngit push origin main --follow-tags\r\n```\r\n\r\nMinor release:\r\n\r\n```bash\r\nnpm version minor\r\nnpm run validate\r\nnpm audit --audit-level=high\r\nnpm run build\r\nnpm run pack:dry\r\nnpm publish --access public\r\ngit push origin main --follow-tags\r\n```\r\n\r\nMajor release:\r\n\r\n```bash\r\nnpm version major\r\nnpm run validate\r\nnpm audit --audit-level=high\r\nnpm run build\r\nnpm run pack:dry\r\nnpm publish --access public\r\ngit push origin main --follow-tags\r\n```\r\n\r\nIf you already updated `package.json` manually, replace `npm version ...` with:\r\n\r\n```bash\r\nnpm publish --access public\r\ngit push origin main --follow-tags\r\n```\r\n\r\n## Publishing Checklist\r\n\r\n- Confirm `package.json` has the correct package name, version, description, license, bin path, files list, and npm access.\r\n- Confirm npm login and package ownership with `npm whoami`.\r\n- Confirm the GitHub repository remote is correct.\r\n- Confirm Convex functions are deployed.\r\n- Confirm `TERMINALTALK_CONVEX_URL` points to the intended production Convex deployment.\r\n- Run the validation gate.\r\n- Run `npm run pack:dry` and inspect the package contents.\r\n- Publish with `npm publish --access public`.\r\n- Push the version commit and tag to GitHub.\r\n- Create a GitHub release from the version tag when the release is ready to announce.\r\n\r\n## Contributing\r\n\r\nContributions are welcome. Please keep changes focused and include tests for\r\nbehavior changes.\r\n\r\nRecommended local loop:\r\n\r\n```bash\r\nnpm install\r\nnpm run validate\r\n```\r\n\r\nFor UI changes, also run TerminalTalk in a real terminal and verify layout,\r\nkeyboard behavior, wrapping, and scroll behavior manually.\r\n\r\n## Professional Open-Source Notes\r\n\r\nBefore a wider release, consider adding:\r\n\r\n- `CONTRIBUTING.md` for contribution workflow and coding standards.\r\n- `CODE_OF_CONDUCT.md` for community expectations.\r\n- `SECURITY.md` for vulnerability reporting.\r\n- GitHub issue templates for bugs and feature requests.\r\n- GitHub Actions CI for lint, typecheck, test, audit, and build.\r\n- Screenshots or a short terminal recording in the README.\r\n- Changelog entries for each published npm version.\r\n\r\n## License\r\n\r\nMIT. See `LICENSE`.\r\n","readmeFilename":"README.md"}