{"slug": "show-hn-livecomment-who-is-hiring-plugin", "title": "Show HN: LiveComment – \"Who Is Hiring?\" Plugin", "summary": "LiveComment, a new open-source web framework that turns a code repository into a live-editable tree with plugins, launched on Hacker News. The tool uses Express and Socket.IO to sync a file system browser with a local server, offering features like drag-and-drop navigation, a Monaco editor, and AI-assisted code context. A dedicated \"Who Is Hiring?\" plugin pulls job listings from Hacker News directly into the tree, targeting developers who need grounded file context for large codebases.", "body_md": "A small **web framework** around your repo: Express serves the UI, Socket.IO keeps the tree in sync, and **plugins** extend the browser with the same `//:=frame('client.exec')`\n\nstory on client and server. Your **code** stays center stage. Built for fast navigation, live reload, and **AI-assisted** work (one surface for you, your editor, and tools).\n\n- Minimal core, strong\n**plugin** story with live reload (`plugins/0/…`\n\n) **Same code** for client and server where you want it — e.g.`//:=frame('client.exec')`\n\n**Auto ports**: if HTTP or WebSocket ports are taken, the next free ones are used (see console)- Optional\n**VSCode/monaco** for code blocks (themes, line modes, fit height) — plugin`D000-monaco-editor.js`\n\n**Drag–drop** scopes and nodes, safer path paste —`C000-drag-drop-content.js`\n\n**Color tags** on nodes, persisted locally, filter/hide by color —`F000-color-buttons.js`\n\n- Multilanguage highlighting, file watch, code navigator\n\n- For 80/20 developers who live in the tree\n- Code navigator, refactor-friendly structure\n- Local “cloud IDE” extension: browser + your disk\n- Brain helper for big codebases — and for models that need\n**grounded** file context\n\nExtensions in `plugins/0/`\n\n(live reload). With the server running, open [http://localhost:3070/plugins](http://localhost:3070/plugins) to browse plugins in the tree. Index:\n\n[0000 Init](#0000-init)—[plugins/0/0000-init.js](/d08ble/livecomment/blob/master/plugins/0/0000-init.js)[A000 Route](#a000-route)—[plugins/0/A000-route.js](/d08ble/livecomment/blob/master/plugins/0/A000-route.js)[B000 URL iframe preview](#b000-url-iframe-preview)—[plugins/0/B000-url-iframe-preview.js](/d08ble/livecomment/blob/master/plugins/0/B000-url-iframe-preview.js)[C000 Drag-drop content](#c000-drag-drop-content)—[plugins/0/C000-drag-drop-content.js](/d08ble/livecomment/blob/master/plugins/0/C000-drag-drop-content.js)[D000 Monaco editor](#d000-monaco-editor)—[plugins/0/D000-monaco-editor.js](/d08ble/livecomment/blob/master/plugins/0/D000-monaco-editor.js)[E000 Enable-disable](#e000-enable-disable)—[plugins/0/E000-enable-disable.js](/d08ble/livecomment/blob/master/plugins/0/E000-enable-disable.js)[F000 Color buttons](#f000-color-buttons)—[plugins/0/F000-color-buttons.js](/d08ble/livecomment/blob/master/plugins/0/F000-color-buttons.js)[G000 Ruler](#g000-ruler)—[plugins/0/G000-ruler.js](/d08ble/livecomment/blob/master/plugins/0/G000-ruler.js)[I000 AI](#i000-ai)—[plugins/0/I000-ai.js](/d08ble/livecomment/blob/master/plugins/0/I000-ai.js)[I001 Export tree](#i001-export-tree)—[plugins/0/I001-export-tree.js](/d08ble/livecomment/blob/master/plugins/0/I001-export-tree.js)[J001 HN Firebase plugin — Ask HN: Who is hiring?](#j001-hn-firebase)—[plugins/0/J001-hn-firebase.js](/d08ble/livecomment/blob/master/plugins/0/J001-hn-firebase.js)\n\n[plugins/0/0000-init.js](/d08ble/livecomment/blob/master/plugins/0/0000-init.js) — Client and server bootstrap (`client.exec`\n\n/ `server.exec`\n\n); registers `client.css`\n\nframe for scoped `<style>`\n\ntags; default menu and scope styling.\n\n[plugins/0/A000-route.js](/d08ble/livecomment/blob/master/plugins/0/A000-route.js) — Server routes `/b`\n\n, `/c`\n\n, `/plugins`\n\n; `filterRoute`\n\nrewrites `*HIDE*`\n\nnodes and `*TEST_HOSTNAME*`\n\nplaceholders; `?queryHash=plugins_only`\n\nlimits the tree to `plugins/0/`\n\n.\n\n[plugins/0/B000-url-iframe-preview.js](/d08ble/livecomment/blob/master/plugins/0/B000-url-iframe-preview.js) — **Preview** button on highlighted links in code blocks; toggles an inline iframe (sites with `X-Frame-Options`\n\nmay not embed).\n\n[plugins/0/C000-drag-drop-content.js](/d08ble/livecomment/blob/master/plugins/0/C000-drag-drop-content.js) — Drag scope names and node names from the tree; drop into editors or paste paths (basenames for local files, full URL for `http(s)`\n\n).\n\n[plugins/0/D000-monaco-editor.js](/d08ble/livecomment/blob/master/plugins/0/D000-monaco-editor.js) — Monaco / VS Code editor for code blocks (CDN); language mapping, themes, line-number modes, fit-to-content height.\n\n[plugins/0/E000-enable-disable.js](/d08ble/livecomment/blob/master/plugins/0/E000-enable-disable.js) — Toggle nodes on/off in the tree (persisted in `localStorage`\n\n); undo/redo; export enabled or disabled outline from the menu.\n\n[plugins/0/F000-color-buttons.js](/d08ble/livecomment/blob/master/plugins/0/F000-color-buttons.js) — Twelve color tags per node (stored locally); filter or hide by color; reading-line scroll offset below the menu.\n\n[plugins/0/G000-ruler.js](/d08ble/livecomment/blob/master/plugins/0/G000-ruler.js) — Log-scale ruler widgets on nodes via `//:=frame('ruler')`\n\nJSON config; markers, cursor, pan/zoom; visibility persisted per ruler.\n\n[plugins/0/I000-ai.js](/d08ble/livecomment/blob/master/plugins/0/I000-ai.js) — **AI** menu button (placeholder for future AI actions).\n\n[plugins/0/I001-export-tree.js](/d08ble/livecomment/blob/master/plugins/0/I001-export-tree.js) — **Export** menu button: MainView tree → livecomment block syntax per scope; preview, copy, single or multi-file download, optional ZIP.\n\n[plugins/0/J001-hn-firebase.js](/d08ble/livecomment/blob/master/plugins/0/J001-hn-firebase.js) — Loads the monthly ([Ask HN: Who is hiring? (June)](https://news.ycombinator.com/item?id=48357725)) thread through the [HN Firebase API](https://github.com/HackerNews/API), builds a nested LiveComment tree (comments → nodes, jobs → segment text) and decorates job lines with location hints (country flags, remote / on-site). **Hiring HN** menu button shows fetch progress while the thread loads.\n\n``` bash\n$ npm install -g livecomment\n```\n\nLivecomment current directory\nScan for files contains livecomment blocks `# PYTHON-BLOCK [`\n\nor `// C-BLOCK [`\n\n``` bash\n$ livecomment\njs\n// Import LiveComment module\n\nvar LiveComment = require('livecomment');\n\n// Define options (defaults: livecomment/config/config.js)\n\nvar options = {\n  port: 3070,\n  ws_port: 3071,\n  dangerousCodeExecution: ['client', 'server'], // for plugins\n  debug: 1,\n  common: {\n    ignore: [\n      /^node_modules.*/,\n      /^\\.idea.*/,\n      /^\\.svn.*/,\n      /^\\.git.*/\n    ]\n  },\n  paths: [\n    '/path/to/dir/',\n    // === or ===\n    {\n      '/path/to/dir1': {\n        ignore: [\n          /.*dist.*/\n        ]\n      }\n    }\n  ]\n};\n\n// Start server\n\nvar livecomment = new LiveComment(options);\n```\n\nIf a configured port is already in use, you will see a line like `HTTP port 3070 in use, using 3071`\n\n(and similarly for the WebSocket port). Default case:\n\n```\n=== LiveComment Configuration ===\nServer Settings:\n  ...\n==============================\n\nEXE.ONFRAME [server.exec][][frame] function\nScan files [\n/path/to/dir/livecomment [\n/path/to/dir/livecomment ]\nScan files ]\nWatch for changes [\n /path/to/dir/livecomment\n /path/to/dir/livecomment/bin\n /path/to/dir/livecomment/config\n /path/to/dir/livecomment/plugins\n /path/to/dir/livecomment/public/css\n /path/to/dir/livecomment/public/js\n /path/to/dir/livecomment/views\nWatch for changes ]\n✔ socket.io server listening on port 3071\n✔ Express server listening on port 3070 in development mode\n/path/to/dir/livecomment/bin/index-debug.js javascript\nEXE.EMIT [this][CHECK FORMAT][mount] undefined CHECK FORMAT\nEXE.EMIT [this][SUPPORT FORMATS][mount] undefined SUPPORT FORMATS\n/path/to/dir/livecomment/config/config.js javascript\nEXE.EMIT [this][DEFAULT CONFIG][mount] undefined DEFAULT CONFIG\n/path/to/dir/livecomment/livecomment.js javascript\n...\n```\n\n(Order of the two `✔`\n\nlines can vary slightly. If ports clash, the printed numbers match the chosen ports.)\n\nArchive [README-old.md](/d08ble/livecomment/blob/master/README-old.md).\n\nBTC 💰 18Bth1u3pSJzPrCf21tx1F6iSzA2fgKdfU\n\nSOL Solana 💰 9gLVQr97baX3KrG9DyaUDd5FwXaiLcDuU6CK5RCNMnWu\n\nETH Ethereum 💰 0x072c709a8Ad95Fc182e0E2EEF834C3d944122f0b\n\nUSDT Ethereum 💰 0x072c709a8Ad95Fc182e0E2EEF834C3d944122f0b\n\nDOGE Dogecoin 💰 DJP8425i4sGT4tSEXwEDRPJb4vJBGroJs6\n\nLTC Litecoin 💰 ltc1q69gg9udgqnky60n7mfzfaj0w7lu80ujx6fysly\n\nTRX Tron 💰 TLjkoQfnu7aRRbVRkEYN1vZPzW7ntuM4tn", "url": "https://wpnews.pro/news/show-hn-livecomment-who-is-hiring-plugin", "canonical_source": "https://github.com/d08ble/livecomment", "published_at": "2026-06-04 01:44:38+00:00", "updated_at": "2026-06-04 02:16:13.730505+00:00", "lang": "en", "topics": ["ai-tools", "ai-infrastructure", "ai-products"], "entities": ["Express", "Socket.IO", "VSCode", "Monaco Editor", "LiveComment"], "alternates": {"html": "https://wpnews.pro/news/show-hn-livecomment-who-is-hiring-plugin", "markdown": "https://wpnews.pro/news/show-hn-livecomment-who-is-hiring-plugin.md", "text": "https://wpnews.pro/news/show-hn-livecomment-who-is-hiring-plugin.txt", "jsonld": "https://wpnews.pro/news/show-hn-livecomment-who-is-hiring-plugin.jsonld"}}