Raw JSON report machine-readable
{
"data": {
"repo": {
"topics": [],
"is_fork": false,
"size_kb": 9351,
"has_wiki": true,
"homepage": null,
"languages": {
"CSS": 90287,
"HTML": 1105,
"Shell": 2304,
"Python": 194931,
"Makefile": 1160,
"JavaScript": 238185
},
"pushed_at": "2026-08-01T03:23:43Z",
"created_at": "2026-07-27T16:45:55Z",
"owner_type": "User",
"updated_at": "2026-08-01T03:23:52Z",
"description": "VibeFoundry IDE engine — the standalone Python library (local data-science IDE: file management, script runner, data preview, metadata digests).",
"is_archived": false,
"is_disabled": false,
"license_spdx": null,
"default_branch": "main",
"license_spdx_raw": null,
"primary_language": "JavaScript",
"significant_languages": [
"JavaScript",
"Python",
"CSS"
]
},
"owner": {
"blog": null,
"name": null,
"type": "User",
"login": "vibefoundry",
"company": null,
"location": null,
"followers": 1,
"avatar_url": "https://avatars.githubusercontent.com/u/214882911?v=4",
"created_at": "2025-06-04T18:16:36Z",
"is_verified": null,
"public_repos": 12,
"account_age_days": 422
},
"license": {
"state": "absent",
"spdx_id": null,
"raw_spdx": null,
"file_present": false,
"scorecard_found": false,
"profile_has_license": false
},
"activity": {
"releases": [],
"recent_commits": [
{
"oid": "36aea3d168cd7339ac57458904bee1ae15ef1e5a",
"body": "publish.sh bumped pyproject.toml but not __init__.py, so the 0.4.1 wheel\nannounced itself as 0.4.0 in --version and /api/health. Bump both together\nfrom now on.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "0.4.2: report the version we actually are",
"author_name": "vibefoundry",
"author_login": "vibefoundry",
"committed_at": "2026-08-01T03:23:42Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "845293674c9411a2800b63cc1a1309f99509e07a",
"body": "Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "0.4.1: deterministic folder opening, Logs button, no scaffold on launch",
"author_name": "vibefoundry",
"author_login": "vibefoundry",
"committed_at": "2026-08-01T03:22:10Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "90034f8a3becc5ec14a3a86e011133bf68c0ca0e",
"body": "Launch created input_folder/output_folder/app_folder in whatever folder the\nbackend started on — the one place left that mutated a folder you merely\nopened. Every other path already lived by the opposite rule: generate_metadata\nno-ops until app_folder exists, the watcher only watches folders that ex\n[…]\n\n\nRemove the lifespan call so the rule holds everywhere: opening is read-only,\nand structure is created in exactly one place — the Build button.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Opening a folder no longer scaffolds it",
"author_name": "vibefoundry",
"author_login": "vibefoundry",
"committed_at": "2026-08-01T03:11:00Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "ff8d950f15ff8add6bb982bceab4f19833b347ae",
"body": "It lived in the top bar, and the top bar only renders once a project is open —\nso the one state where diagnostics matter most, a pane with no backend and\nnothing loading, had no way to reach them. Float a Logs button whenever the\nbar is absent, so every state can produce a log, including total failure.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Make the Logs button reachable when nothing is working",
"author_name": "vibefoundry",
"author_login": "vibefoundry",
"committed_at": "2026-08-01T02:57:35Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "a8dedfae289a044a058dacd0a63973f86202feb6",
"body": "One attempt was not enough in a pane. The widget renders off the tool\nDEFINITION, so it appears even when open_vibefoundry failed — and when the\nmodel retries with a corrected folder, the real backend arrives seconds after\nthe pane already gave up. The result was a dead folder picker reading \"Failed\n[…]\n for up to 90s before conceding to the picker.\nA live backend with no folder still gets the picker immediately — that is the\none case it is for.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Keep asking for the project folder until a backend answers",
"author_name": "vibefoundry",
"author_login": "vibefoundry",
"committed_at": "2026-08-01T02:52:55Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "03f8ff525c5c01e87602a0a650a7d53aa883f88b",
"body": "Removing it broke the pane. The host renders this widget off the tool\nDEFINITION, so it appears even when open_vibefoundry failed and no backend\nexists. Mounting <App/> unconditionally then put a full IDE on screen with\nnothing behind it: /api/folder/info failed, the IDE fell through to the folder\np\n[…]\nas.\n\nThe folder resolution is untouched: the host's root still decides which folder\nopens, and the IDE still opens straight into it.\n\nCo-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Put the pane's launch button back",
"author_name": "vibefoundry",
"author_login": "vibefoundry",
"committed_at": "2026-08-01T02:47:41Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "897a5e59157f589d2c4b8fe0785178078d29bc37",
"body": "The IDE always booted into the folder picker: showFolderPicker started true\nand nothing ever called /api/folder/info, an endpoint that had no callers at\nall. The backend knew its folder the whole time — set from\nVIBEFOUNDRY_PROJECT_PATH at startup — so the picker was a question with one\nright answer\n[…]\nso a misbehaving UI leaves no evidence unless it keeps\nsome itself. In-memory only; it leaves the machine when someone presses Copy.\n\nCo-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Open the project you launched, and add a Logs button",
"author_name": "vibefoundry",
"author_login": "vibefoundry",
"committed_at": "2026-08-01T02:33:56Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "243655b5d88898fa198982bf061d759b7aa990e3",
"body": "Reading a file to one base64 string and handing it to callTool crashed the\ndesktop app — a multi-megabyte string crossing the host bridge is a single\nenormous JSON value, and a large enough one aborts V8 and takes the app with\nit. A 12MB csv produced a 16.3MB message.\n\nThe file is now sliced and str\n[…]\nr interrupted stream aborts its buffer instead of stranding it.\n\nSame 12MB file: 49 messages, largest 341KB, arrives byte-identical.\n\nCo-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Stream uploads from the pane instead of sending whole files",
"author_name": "vibefoundry",
"author_login": "vibefoundry",
"committed_at": "2026-07-29T05:22:22Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "d32681d33f1048f4f3c0aa31dcb1cf01f76d7520",
"body": "Switching sheets re-parsed the whole workbook every time and shipped ~280KB of\nHTML per switch — most of it the same few style declarations repeated once per\ncell. In a pane every one of those bytes crosses the host bridge, which is\nwhere \"incredibly slow\" came from.\n\nThree changes:\n\nRenders are cac\n[…]\nrst attempt.\n\nVerified across all three writers (xlsxwriter, openpyxl, LibreOffice): 81ms\ncold, 0ms cached, correct chart per sheet.\n\nCo-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Make sheet switching fast, and show each sheet only its own charts",
"author_name": "vibefoundry",
"author_login": "vibefoundry",
"committed_at": "2026-07-29T05:03:43Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "133a8a7257dda281e24b97ced379a52e788edd5d",
"body": "Three defects, all found by one file written by xlsxwriter rather than by\nopenpyxl. Every one of them was invisible against my own test files, which is\nthe whole argument for testing against something a user actually produced.\n\nCharts were looked for only at xl/charts/chartN.xml. xlsxwriter puts the\n[…]\nntended\ncolour beats losing the words.\n\nRegression-checked against openpyxl-written and LibreOffice-written files;\nboth still parse.\n\nCo-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Handle real-world workbooks: chart location, series names, formats",
"author_name": "vibefoundry",
"author_login": "vibefoundry",
"committed_at": "2026-07-28T17:55:25Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "d62fe19f013867b621bb1835f9cd6870858df2c5",
"body": "The approach Google Sheets takes with an uploaded workbook: don't reproduce\nthe file, rebuild it. Cells become HTML carrying their real fills, fonts,\nborders, merges and number formats; charts are read out of the workbook as\ndefinitions and redrawn. No LibreOffice, no 800MB install, nothing outside\n\n[…]\ne and copyable and the browser's own find works across it. \"View as\ndata\" re-reads with asData=1 for the sortable, virtualized grid.\n\nCo-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Show spreadsheets as they look, by reconstructing rather than rendering",
"author_name": "vibefoundry",
"author_login": "vibefoundry",
"committed_at": "2026-07-28T17:19:34Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "8cae31700b36640fb02adb2bb8d76ffbb97438c6",
"body": "Rendering spreadsheets faithfully worked, but only for someone who already has\nLibreOffice — an 800MB desktop app that pip cannot install and that many\ncorporate machines will not permit. That is the wrong shape for a feature\nevery cohort needs, so it goes.\n\nReverts the office module, the render end\n[…]\nreOffice still installed locally: .xlsx opens as a dataframe\nwith all columns and sheet names, and /api/office/render is gone (404).\n\nCo-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Remove the LibreOffice renderer, keep the xlsx fix",
"author_name": "vibefoundry",
"author_login": "vibefoundry",
"committed_at": "2026-07-28T16:53:51Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "e0f7c7d4c7148c46f78e15c061003417c1a64832",
"body": "Opening an .xlsx parsed it into a dataframe, which threw away everything that\nmakes a spreadsheet a spreadsheet — charts, cell fills, merged cells, number\nformats — and showed a CSV-ish grid instead. .pptx had no handler at all.\n\nNo parser can fix this. openpyxl and SheetJS read values and some styl\n[…]\n survive, path traversal still 403s, and both outputs cross the\npane relay intact (html as text, pdf as base64 with a valid header).\n\nCo-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Show spreadsheets and decks as they actually look, via LibreOffice",
"author_name": "vibefoundry",
"author_login": "vibefoundry",
"committed_at": "2026-07-28T16:45:11Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "27f905ffce51f82e70a139332f8dc6dedab83b4d",
"body": "Launching from a host already chose the folder — it is the directory the host\nlaunched us against — but the picker still opened at the real home directory,\nso every launch began by navigating back to where you already were.\n\nThe picker starts wherever /api/fs/home points, and the shim already\ninterc\n[…]\nide\nand would break silently on any UI change. This is the deterministic part of\nthat fix — an API answer, no DOM, nothing to guess.\n\nCo-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Open the pane's folder picker in the project, not the home directory",
"author_name": "vibefoundry",
"author_login": "vibefoundry",
"committed_at": "2026-07-28T05:21:31Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "60d8a8ce2c7c783f8e474b431744a56e738a8ea3",
"body": "Two things the pane could never do, both fixed in the shim rather than the IDE.\n\nImages: the app renders <img src=\"/api/image?path=...\">, which a fetch shim\ncannot intercept — the browser loads it directly, and in the sandbox that\nrelative URL resolves against the widget's origin rather than the bac\n[…]\nffected.\n\nVerified against a live backend: the image arrives byte-identical with its PNG\nmagic intact, and the upload lands on disk.\n\nCo-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Carry images and uploads across the pane's relay",
"author_name": "vibefoundry",
"author_login": "vibefoundry",
"committed_at": "2026-07-28T01:01:46Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "595905aef20466b0834047807cd26f3926e0e793",
"body": "Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Bump to 0.3.2 (pane polling bridge)",
"author_name": "vibefoundry",
"author_login": "vibefoundry",
"committed_at": "2026-07-27T21:38:39Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "5f3e19fbd9c962ee7b8bbd5e9939275a5284112a",
"body": "The sandbox blocks websockets to localhost, so the pane replaced WebSocket\nwith an inert stub. Anything waiting on a server-pushed event therefore\nwaited forever: opening a large file for the first time left the preview\nmodal on its spinner permanently, because it waits for profile_complete.\nThe sec\n[…]\nalse, the\nserver answering \"watch the websocket\", and the profile arriving by polling\nin 0.4s with all 5 columns and 5,000,000 rows.\n\nCo-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Make the pane's websocket a polling bridge instead of a dead stub",
"author_name": "vibefoundry",
"author_login": "vibefoundry",
"committed_at": "2026-07-27T21:32:59Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "607d86c4f4a2047027896c77d008e9d99357ea76",
"body": "Restores pane support, but far smaller than it used to be. Pane mode used to\ncarry the neutral theme and hide the script runner; the theme is now the base\nfor everyone and the runner is gone, so all that remains is hiding the four\nterminal-launcher buttons — they open a native window that a sandboxe\n[…]\nges layouts.\n\nNone of this reaches the standalone app: main.jsx never imports pane-main,\nand vite.config.js -> static/ is untouched.\n\nCo-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Add the Codex pane build target",
"author_name": "vibefoundry",
"author_login": "vibefoundry",
"committed_at": "2026-07-27T18:56:09Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "5526c93ab18ef99122d487a49688b6e8669c1e4d",
"body": "The blue-tinted standalone palette was only ever repainted neutral when the\nIDE ran embedded in a host pane. Make that neutral palette the base instead —\nwhite/gray surfaces, near-black accent, system font — so the IDE looks the\nsame standalone or embedded, and no webfont is fetched at startup.\n\nRem\n[…]\noding the version in the footer: it had drifted to v0.1.38\nwhile the package was at 0.2.22. The footer now reads it off /api/health.\n\nCo-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Adopt the host-native skin and drop the bottom script runner",
"author_name": "vibefoundry",
"author_login": "vibefoundry",
"committed_at": "2026-07-27T17:55:46Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "10d8b4d6d225a742820f154cbd00f918bbbdda5e",
"body": "Takes the tree at 19b3301 — the last commit before the Codex/Claude\nplugin, SharePoint connector, and data catalogue work — as the starting\npoint for the standalone Python library. Version goes to 0.3.0 so it\nlands above the 0.2.52 currently on PyPI; __init__ was stale at 0.2.11\nand now matches.\n\nCo-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Fork the IDE engine at 0.2.22 into vibefoundry-python-lib as 0.3.0",
"author_name": "vibefoundry",
"author_login": "vibefoundry",
"committed_at": "2026-07-27T16:45:50Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "19b330167e825eec5a7285cd95095dba41df759f",
"body": "Right-click .command files now shows Run Code / Copy run command,\nrunning them via bash like .sh.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "0.2.22: add Run Code option for .command files",
"author_name": "vibefoundry",
"author_login": "vibefoundry",
"committed_at": "2026-06-21T23:52:13Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "ea8552df32f3bbd472591425ac6506cfa1ec1b05",
"body": "Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Remove unused template-cascade helpers from server.py",
"author_name": "vibefoundry",
"author_login": "vibefoundry",
"committed_at": "2026-06-21T23:52:13Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "4d89d0e7d8507408c54de9940b1f6a5debea9c50",
"body": "IDE templates moved to the website repo (vibefoundry/website, templates/ on\nmain); the /api/templates proxy reads from there now, so this folder is no\nlonger the source the IDE downloads from. Recoverable from history if needed.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Remove templates/; now hosted in vibefoundry/website",
"author_name": "vibefoundry",
"author_login": "vibefoundry",
"committed_at": "2026-06-11T23:07:10Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "b4d4de22b5f4ce8eb141aeb6553b2373ae323277",
"body": "Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "templates: add packaged_publish (conda-pack desktop app packager)",
"author_name": "vibefoundry",
"author_login": "vibefoundry",
"committed_at": "2026-06-06T00:45:31Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "4ffab768bf92cf58513c3b3158030071da1e7663",
"body": "The build env is created from conda-forge with --override-channels, and\nconda-forge's python does not bundle pip. So 'python -m pip install -r\nrequirements.txt' failed with 'No module named pip'. Add pip to the\nconda create spec so the env has it before installing the app deps.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "data_chatbot_codex_publish_v2: install pip in the conda-pack build env",
"author_name": "vibefoundry",
"author_login": "vibefoundry",
"committed_at": "2026-06-05T19:06:09Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "e4df5d517c9bbceebbbe71fd0de994a5011a6d82",
"body": "The v2 template files were already on dev_branch but absent from\ncatalog.json, so the IDE picker never showed it. Add its catalog entry\n(conda-pack publisher variant of data_chatbot_codex_publish) so it\nbecomes downloadable.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "catalog: list data_chatbot_codex_publish_v2 as a downloadable template",
"author_name": "vibefoundry",
"author_login": "vibefoundry",
"committed_at": "2026-06-05T18:56:02Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "b9bae630a2c7f2406c4147a5176b6a8b8dcfb0b8",
"body": null,
"is_bot": false,
"headline": "IDE Changes",
"author_name": "vibefoundry",
"author_login": "vibefoundry",
"committed_at": "2026-06-05T18:52:24Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "dd17a8f643e76740481714fd2c6549766f0dcb07",
"body": "Students run publish.py on Windows, where npm/node are .cmd shims that\nCreateProcess can't launch by bare name — subprocess.run([\"npm\",...]) failed\nwith WinError 2 at the 'npm ci' build step. Pass shell=True on Windows so cmd.exe\nresolves the .cmd. No change on macOS. Fixed in both published copies.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "publish.py: run subprocesses via shell on Windows (fix npm WinError 2)",
"author_name": "vibefoundry",
"author_login": "vibefoundry",
"committed_at": "2026-06-05T13:32:21Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "bb098f2f94a576379bb9144cb5c45afacbf7b425",
"body": "The Codex CLI data chatbot with a drop-in Publish/ folder (publish.py + LLM\nREADME) and the app-level changes that make it publishable: single-server\nfrontend serving + heartbeat lifecycle in app.py, the Windows codex full-path\nlogin fix, and PWA/heartbeat hooks in the frontend. Registered in catalog.json.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Add data_chatbot_codex_publish template — publish-ready Codex chatbot",
"author_name": "vibefoundry",
"author_login": "vibefoundry",
"committed_at": "2026-06-05T13:19:56Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "d0cc341639f2df56deca3b1ae40ed2b060165486",
"body": "A standalone, portable Publish/ folder (publish.py + vf_logo.png + an LLM README)\nthat packages any VibeFoundry app into a self-contained one-click desktop\ninstaller for macOS + Windows. Registered in catalog.json so it's pullable.\nThe README documents the app↔publish contract, the exact 7 edits that make a\nchatbot app publish-ready, and the agent-CLI (codex) fixes.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Add 'publish' template — drop-in desktop-app packager",
"author_name": "vibefoundry",
"author_login": "vibefoundry",
"committed_at": "2026-06-05T05:42:53Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "b114be57c5cf14b47003bc001b019a42fbbc825e",
"body": "Save builds under published_apps/dashboard_v{N} in the script's own folder\n(created on first build) instead of app_folder/. Each build still increments to\nthe next version.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "dashboard_pwa_duckdb: publish into published_apps/ next to the script",
"author_name": "vibefoundry",
"author_login": "vibefoundry",
"committed_at": "2026-06-04T18:05:19Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "9c2db05be96e603629c45e7e18c5e55bdcdb0125",
"body": "Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Remove CLERK_INTEGRATION_PLAN.md",
"author_name": "vibefoundry",
"author_login": "vibefoundry",
"committed_at": "2026-06-04T17:58:43Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "c5eae8f97c50ff439d09247efd12baccfcb98b42",
"body": "Save the distributable inside app_folder/ as an auto-incrementing\ndashboard_v{N} folder (next past the highest existing version) instead of\noverwriting <project>/output_folder/dashboard_pwa_duckdb each build.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "dashboard_pwa_duckdb: build into app_folder/dashboard_v{N}",
"author_name": "vibefoundry",
"author_login": "vibefoundry",
"committed_at": "2026-06-04T17:58:43Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "cb15fb3831122c4b71083929a4295fd065fdb575",
"body": "A node_modules/ installed from before concurrently was added to package.json\nhas vite but not concurrently, so the vite-only sentinel in run_app.sh/.bat\nskipped setup and then died at the concurrently call. Check both binaries so a\nstale/partial tree re-triggers setup. Also locks concurrently in package-lock.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "data_chatbot_codex: gate setup on concurrently too, not just vite",
"author_name": "vibefoundry",
"author_login": "vibefoundry",
"committed_at": "2026-06-04T17:58:43Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "fde68194729fa43388869d9665242e48e898f289",
"body": "The fullstack launchers reached concurrently via `npx`, which does an npm\nregistry-resolution round-trip (can stall/hang on slow or Windows machines)\neven with the package already installed, then ran the frontend through an\nextra `npm run dev` Node bootstrap.\n\n- Declare concurrently as a devDependen\n[…]\naunchers call it\n once instead of spawning python twice\n- setup.sh/.bat drop the now-redundant separate concurrently-install step\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "data_chatbot_codex: faster launch — drop npx, run vite directly",
"author_name": "vibefoundry",
"author_login": "vibefoundry",
"committed_at": "2026-06-02T20:31:56Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "7eb47f560663ef42b7a2114993907a1ee4845c2c",
"body": "subprocess.run with text=True uses the system default encoding, which\non Windows is cp1252. Codex requires UTF-8 on stdin — any em dash,\ncurly quote, or non-ASCII character in the prompt (from metadata.json,\ninstructions.json, etc.) caused \"input is not valid UTF-8\" and exit 1.\n\nAdding encoding=\"utf-8\" is a no-op on Mac/Linux where UTF-8 is already\nthe default.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Fix codex stdin UTF-8 error on Windows",
"author_name": "vibefoundry",
"author_login": "vibefoundry",
"committed_at": "2026-05-29T02:08:31Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "22f159c10709dd50a5d37513281822922e20bd3a",
"body": "On Windows, subprocess.run([\"codex\", ...]) does a PATH lookup inside\nthe child process environment, which can differ from the shell that\nstarted Flask (PATH set by an installer after the terminal opened, or\nconcurrently running with a trimmed env). This caused [WinError 2]\n\"The system cannot find th\n[…]\nutil.which() once at the top\nof _run_codex and pass that path to subprocess.run, bypassing the\nchild-process PATH lookup entirely.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Fix codex subprocess WinError 2 — use absolute path from shutil.which",
"author_name": "vibefoundry",
"author_login": "vibefoundry",
"committed_at": "2026-05-29T02:04:57Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "6350b351335631cf6d235ab718d583b78bd398dc",
"body": "- All 3 run_app.bat files now print [run_app] progress at every step so\n a silent failure on Windows is immediately visible instead of a blank\n terminal.\n- Each failure branch now ends with `pause` so the window stays open\n long enough to read the error.\n- Port-reservation now validates the resul\n[…]\ns machines that call hangs indefinitely contacting the auth\n server. Auth errors are handled by the in-app re-auth modal instead.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Add step-by-step logs to run_app.bat; remove hanging codex auth check",
"author_name": "vibefoundry",
"author_login": "vibefoundry",
"committed_at": "2026-05-29T01:57:24Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "f36f17fe29acb20f8f791c0fd673245652bb2d18",
"body": "Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "0.2.21: templates picker row layout",
"author_name": "vibefoundry",
"author_login": "vibefoundry",
"committed_at": "2026-05-29T01:35:09Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "4618592e4b96ab88b810f791a917c7f817f5e3f7",
"body": "Replace the auto-fill grid of square cards with a vertical stack of\ncompact rows — icon, title + track badge, 2-line clamped description,\nDownload button on the right. Use_cases list and +N more toggle\nremoved; description carries the gist. Easier to scan when several\ntemplates are listed.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Templates picker: row layout instead of card grid",
"author_name": "vibefoundry",
"author_login": "vibefoundry",
"committed_at": "2026-05-29T01:34:11Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "bd3afc307333f8bf0f8952737906ae3115bd0256",
"body": "The inline `python -c \"import socket; ... s.bind((''''127.0.0.1'''',0)) ...\"`\nused quadruple single quotes as a `for /f` escape trick. CMD on multiple\nWindows shell variants does NOT reduce that to a single `'` before\nPython sees it — Python receives the literal `''''` and raises\n\"unterminated strin\n[…]\n3 launcher reference snippet in AGENTS.md (with the helper file\ncontent documented so students building from scratch can ship it).\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Fix Windows port-reservation SyntaxError in run_app.bat",
"author_name": "vibefoundry",
"author_login": "vibefoundry",
"committed_at": "2026-05-29T01:33:13Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "5995a61971400fa1e9b84ec51f35470e7dac0d73",
"body": "Run Code was added in 0.2.14 for .py and .sh only. The asymmetric\nallowlists hid the menu item for .bat even though Copy run command\nalready handled it. On non-Windows the backend's runner.py returns\na clear \".bat files can only run on Windows\" error — that's a better\nUX than silently hiding the option.\n\nTwo-line change: add .bat to isRunCode and to handleRunCode's\nextension switch.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "0.2.20: enable Run Code for .bat files",
"author_name": "vibefoundry",
"author_login": "vibefoundry",
"committed_at": "2026-05-29T01:31:21Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "4e4df5fdbc104504a043359df8b92d8a8f6a1586",
"body": "The clean-install if-block had unescaped parentheses inside echo and REM\nlines nested inside the parenthesized `if not exist (...)`:\n\n echo Installing Node dependencies (clean install)...\n REM with broken perms (EACCES on esbuild's postinstall, etc.) make\n\nCMD pre-parses the whole block and tr\n[…]\n nothing else\nchanged. Applied to all three Track-3 setup.bat templates\n(data_chatbot, data_chatbot_codex, doc_scanner_fullstack).\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Fix Windows CMD parser failure on setup.bat at [2/3] Node deps",
"author_name": "vibefoundry",
"author_login": "vibefoundry",
"committed_at": "2026-05-29T01:25:19Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "22bf5c047c313daf2bffe211e1cdcff73b2b62c8",
"body": "The concurrently sentinel was a subprocess probe (`npx concurrently\n--version`) that hits the npm registry even when the package is already\nlocally installed — on Windows / corporate proxies / slow networks this\ncan hang setup forever at \"[3/3] Checking concurrently...\".\n\nReplaced with a direct bina\n[…]\n\nthe other Track 3 templates) so node_modules/, agent_results/,\ndocument_input/, and .env can never accidentally ship via cascade.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Fix Windows setup.bat hang on `npx concurrently --version` check",
"author_name": "vibefoundry",
"author_login": "vibefoundry",
"committed_at": "2026-05-29T01:18:31Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "989130e8c75268a4dda738da8970bd651626bf04",
"body": "Two new Track 3 templates for natural-language analytics over parquet:\n\n- data_chatbot — Flask + React + Polars code-gen chatbot. Three-stage\n pipeline (classify → codegen+retry → execute → answer) streamed to\n the UI via SSE. The model sees only metadata.json (column/value\n profile from data/), \n[…]\nents gitignored; .gitkeep preserves the empty folder\n- existing .gitignore already excludes node_modules/, output/,\n __pycache__/\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Add data_chatbot + data_chatbot_codex templates to catalog",
"author_name": "vibefoundry",
"author_login": "vibefoundry",
"committed_at": "2026-05-29T01:17:36Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "fd8e36e644066689922a4d6491b15f8de3717c03",
"body": "Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "0.2.19: fix folder upload jumbling",
"author_name": "vibefoundry",
"author_login": "vibefoundry",
"committed_at": "2026-05-29T00:19:21Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "b4bd94fa7feb1af058323c1fb3a210f94548d730",
"body": "The Add Folder context-menu upload built each file's destination on\nthe frontend by combining node.path with the subdir slice of\nwebkitRelativePath. Two failure modes:\n\n1. node.path with a leading slash propagated into the destination,\n producing an absolute path that Path division at the backend\n\n[…]\nible: callers that don't send relativePath fall back\nto file.filename and land directly inside folder, matching the old\nbehaviour.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Fix folder upload jumbling — preserve webkitRelativePath structure",
"author_name": "vibefoundry",
"author_login": "vibefoundry",
"committed_at": "2026-05-28T23:46:56Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "ff8300a76d1fbc52ebee85320c770baa2174127f",
"body": "Track 4 (doc_scanner_backend) now ships requirements.txt (openai,\nwatchdog, pillow) plus idempotent setup.sh / setup.bat that check\npip show <pkg> before installing. run_app.sh / .bat auto-trigger\nsetup when any required dep is missing, so a fresh clone runs in\none command.\n\nTrack 2 (dashboard_pwa_d\n[…]\nper track) and the Track 4 Launcher Scripts\nsection is rewritten to include the new requirements / setup /\nauto-trigger templates.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "templates: add requirements.txt + setup.sh/.bat for Track 4",
"author_name": "vibefoundry",
"author_login": "vibefoundry",
"committed_at": "2026-05-28T19:54:13Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "464f511c936170135dab7619229c296fa064ecbf",
"body": "Build no longer cascades any templates — it just creates the project\nskeleton and AGENTS.md. Templates are now opt-in via a Templates dropdown\nin the toolbar that exposes Download (per-template picker driven by live\ncatalog.json from the proxy) and Delete (wipes templates/).\n\n- /api/build: strip cas\n[…]\no templates/{id}/\n- DELETE /api/templates: rmtree templates/\n- Frontend: Templates ▾ dropdown, picker modal, danger confirm dialog\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "0.2.18: on-demand template download via Templates menu",
"author_name": "vibefoundry",
"author_login": "vibefoundry",
"committed_at": "2026-05-28T18:45:57Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "2bb792032575710f8c068891313dc0314cc59a1d",
"body": "Follow-up to 0.2.17: comment referenced the old pwa_duckdb name.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Fix stale template path in FileTree comment",
"author_name": "vibefoundry",
"author_login": "vibefoundry",
"committed_at": "2026-05-28T18:15:15Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "7e977ebc3b00e7373f1336ce9117eb56926b3f07",
"body": "Renames the three cascaded template folders to student-readable, intent-\nrevealing names:\n agentic_framework → doc_scanner_backend\n pwa_python_backend → doc_scanner_fullstack\n pwa_duckdb → dashboard_pwa_duckdb\n\nAdds templates/catalog.json — one consolidated description + use_cases \n[…]\ned end-to-end with the new names and a \"Cascaded template\"\ncolumn in the track table so the template-to-track mapping is explicit.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "0.2.17: rename templates and ship catalog.json + icons via cascade",
"author_name": "vibefoundry",
"author_login": "vibefoundry",
"committed_at": "2026-05-28T18:01:50Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "b1784b0296d883520ac8e08b62c0b6bc8b2f4fb3",
"body": "… proxy\n\nBuild now lists the top-level dirs under templates/ on the proxy and cascades\neach, instead of a hardcoded list. New templates ship by dropping a folder at\nthe source — no client upgrade needed for future template additions.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "0.2.16: dynamic template cascade — discover template folders from the…",
"author_name": "vibefoundry",
"author_login": "vibefoundry",
"committed_at": "2026-05-25T18:52:28Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "582ceeaf58c781e0c686fe46b4690c29f10a3ba1",
"body": "…tion; cascade all three on Build\n\n- New Track 4 (Building Agents) template: templates/agentic_framework/\n- New Track 3 (PWA + Python Runtime) template: templates/pwa_python_backend/ (flattened layout)\n- AGENTS.md: API keys now live in a .env at the app-folder root (app_folder/scripts/{app_name}/.en\n[…]\nplorer now surfaces .env files (_is_env_file)\n- server.py: /api/build cascades pwa_duckdb + agentic_framework + pwa_python_backend\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Add agentic_framework + pwa_python_backend templates; .env key conven…",
"author_name": "vibefoundry",
"author_login": "vibefoundry",
"committed_at": "2026-05-25T03:55:54Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "ce886b177c697adc6da4dd168f0de578da75f331",
"body": "- New \"Run Code\" item in the file-tree right-click menu for .py and\n .sh files: opens a fresh native terminal and runs the script from\n the project root (python/bash with the absolute path).\n- Fix /api/terminal/launch: the macOS AppleScript path interpolated\n request.command unescaped, so a quote\n[…]\nleScript literal — quoted/space-containing paths\n now work. (The Claude/Codex buttons never hit this; they pass bare\n commands.)\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "0.2.14: \"Run Code\" context-menu action for .py/.sh",
"author_name": "vibefoundry",
"author_login": "vibefoundry",
"committed_at": "2026-05-19T18:10:51Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "255d0408efaaabeca3530774c3474eac47432877",
"body": "- New POST /api/files/reveal endpoint: reveals a file/folder in the\n OS file manager (Finder -R / Explorer /select / xdg-open), with the\n same project-folder path containment check as the other fs endpoints.\n- FileTree right-click menu gains an \"Open in Folder\" item wired to it.\n- BUILD.md documen\n[…]\nlow, which caches need clearing\n (Python artifacts, not the self-clearing static dir), and the service\n worker staleness caveat.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Add \"Open in Folder\" context-menu action + BUILD.md",
"author_name": "vibefoundry",
"author_login": "vibefoundry",
"committed_at": "2026-05-19T15:06:07Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "ca0aed0f63d0ff990f6dbae7127ce7057cc991c9",
"body": "…n't break AGENTS.md fetch",
"is_bot": false,
"headline": "0.2.13: use OS trust store via truststore so corporate TLS proxies do…",
"author_name": "vibefoundry",
"author_login": "vibefoundry",
"committed_at": "2026-05-07T21:05:21Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "bb8682a71fb5637d7da3b6a8552fed2a69c97996",
"body": "- JSON viewer: replaced react-json-view-lite with custom recursive component;\n always-expanded by default, click ▾/▸ to collapse, light theme, scrollable.\n- File tree context menu: new \"Add Folder\" action uploads an entire folder\n from disk (preserves subdirectory structure). Renamed \"Add Folder\" \n[…]\nnt so any\n path component embedded in a filename gets created.\n- User-facing error strings: \"Failed to upload\" → \"Failed to add\".\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "0.2.12: JSON viewer rewrite, Add Folder upload, junk-file skips",
"author_name": "vibefoundry",
"author_login": "vibefoundry",
"committed_at": "2026-05-05T21:04:40Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "d5ff7ec9d193be055d5ea6069cd6100a55ff390a",
"body": "Add a tight Geospatial defaults subsection so the agent has a known\nstarting point for map-based PWA tasks instead of picking libraries\nad-hoc per task:\n\n- Default library: Leaflet (over deck.gl, unless 100K+ points or user\n asks for deck.gl explicitly).\n- Default basemap: OpenStreetMap tiles, with\n[…]\nverything else (choropleth, clustering, projection details) is left to\nthe agent — consistent with the broader Stay In Scope rule.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "AGENTS.md Track 2: geospatial defaults",
"author_name": "vibefoundry",
"author_login": "vibefoundry",
"committed_at": "2026-05-05T19:10:30Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "30e42e3dfb90e6c5c73bf83623aa329c854f45e3",
"body": "No code changes — version bump to mark the release of the agent-side\nguardrails:\n\n- AGENTS.md: \"Stay In Scope\" universal rule (no aesthetic edits, no\n feature additions, no defensive cleanup, no refactors unprompted).\n- AGENTS.md: Track 2 now opens with a hard pointer to\n templates/pwa_duckdb/CUST\n[…]\nojects via the templates proxy, so\nexisting 0.2.10 installs see the new rules on next Build. Republishing\njust stakes the version.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "0.2.11: agent guardrails (Stay In Scope + CUSTOMIZE.md routing)",
"author_name": "vibefoundry",
"author_login": "vibefoundry",
"committed_at": "2026-05-05T16:29:44Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "24184fd482f846263199fd1a6fc763989abf60de",
"body": "Previous policy (\"no filter fields, user picks\") rendered a usable\ntable but an empty filter sidebar (\"No Filters Configured\") on first\nlaunch — surprising and not actually what users want. Flip the default:\nthe agent picks a filter widget per column based on dtype + cardinality,\nuser refines after \n[…]\n on\nstring columns only). Numerics and booleans need no inspection beyond\nthe dtype; the existing head(5) call already gives that.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "CUSTOMIZE.md: add sensible default filters per column",
"author_name": "vibefoundry",
"author_login": "vibefoundry",
"committed_at": "2026-05-05T16:28:07Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "2641440a2da69f2c0e0c8c8fde734613e9391be0",
"body": "Three connected changes meant to stop Codex (and any other agent) from\nrewriting template files instead of cloning them:\n\n1. AGENTS.md — universal \"Stay In Scope\" rule (right after \"templates/\n is read-only\"). Explicit don'ts: no aesthetic edits, no feature\n additions (charts/leaderboards/summar\n[…]\nree to user projects on next Build, so the\nguardrails are in writing for the next agent run rather than just in\nthis conversation.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "AGENTS.md + new CUSTOMIZE.md: scope rules and Track 2 routing",
"author_name": "vibefoundry",
"author_login": "vibefoundry",
"committed_at": "2026-05-05T16:18:38Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "eee449003eb0e7ee775dcb0427d251aa0439a68e",
"body": "FileTree:\n- Templates expansion now lives in its own state (userExpandedTemplates),\n fully separated from expandedPaths. Render path for any templates/\n folder reads only from that state, so cascade-driven file additions\n can never auto-expand the folder. Only chevron click writes there.\n- Hoiste\n[…]\n.jsx):\n- \"Local Terminal\" button → \"Terminal\".\n- Removed the filename / \"No file selected\" label from the Files/Preview\n toolbar.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "0.2.10: templates collapse fix, resilient cascade, UI tweaks",
"author_name": "vibefoundry",
"author_login": "vibefoundry",
"committed_at": "2026-05-05T13:35:41Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "96b694fe990fdc153883b0ce1b388fcbd998f926",
"body": "FileTree:\n- Add 'templates' to NEVER_AUTO_EXPAND so the initial tree-load effect\n doesn't pop it open alongside app_folder / input_folder / output_folder.\n- Add an early-return guard inside expandToPath itself so any future\n caller (watcher events, scroll-to-path, etc.) is silently no-op'd\n for p\n[…]\n\n after \"Input Data Is Sacred\". Forks-only policy: copy out of\n templates/ into app_folder/scripts/{name}/, never edit in place.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "templates/ is read-only: never auto-expand, never edit",
"author_name": "vibefoundry",
"author_login": "vibefoundry",
"committed_at": "2026-05-05T12:38:39Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "e2073b1c7a1961c8d75b751b9ed63e1fcb2b624d",
"body": "Doc had been describing an aspirational Vite/esbuild/npm flow that no\ntemplate actually implements. Update Track 2 to match what pwa_duckdb\nships:\n\n- Source layout uses app_core/src_app/ with pre-bundled lib/ committed\n (no npm, no esbuild, no unpkg fetch — Python-only on the dev side).\n- Build scr\n[…]\n\n build-and-launch is reserved for distributable dogfooding.\n- Constraint #3 flipped: no Node.js anywhere, including dev machine.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "AGENTS.md Track 2: align with shipped pwa_duckdb arch",
"author_name": "vibefoundry",
"author_login": "vibefoundry",
"committed_at": "2026-05-05T12:29:59Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "d1e0d4d669295c32d27acfbf9d705ea6e4ddef8d",
"body": "- /api/build now cascades templates/pwa_duckdb/ via the authenticated\n proxy into <project>/templates/pwa_duckdb/, including binary assets\n (.wasm, .parquet, prebuilt JS bundles).\n- _cascade_templates_via_proxy() takes an optional subpath and sends\n Accept: application/vnd.github.raw on per-file \n[…]\nex shims; pwa_duckdb is now the only\n cascadable template.\n- Root the lib/ and lib64/ ignores so templates/**/lib/ stays tracked.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Cascade pwa_duckdb on Build; replace legacy templates",
"author_name": "vibefoundry",
"author_login": "vibefoundry",
"committed_at": "2026-05-05T12:16:06Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "c308f6f5453afe13b6039d8ac598e4b6ead3a3eb",
"body": "Restores the AGENTS.md content from the commit immediately before\n0578adf introduced the on-disk template subfolders. Templates are no\nlonger cascaded by Build, so the doc shouldn't reference them.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Revert templates/AGENTS.md to pre-templates version (1238ac8)",
"author_name": "vibefoundry",
"author_login": "vibefoundry",
"committed_at": "2026-05-04T14:52:22Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "203ac83219c706b8afe59d3dfbd658311279f2d7",
"body": null,
"is_bot": false,
"headline": "0.2.9: Build cascades AGENTS.md only — no template subfolder cascade",
"author_name": "vibefoundry",
"author_login": "vibefoundry",
"committed_at": "2026-05-04T10:55:49Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b9b295db6ea186d32b5a9adebd8f7a0574b782c1",
"body": "Build now only creates the folder structure (input_folder/, output_folder/,\napp_folder/) and runs git init. It no longer fetches AGENTS.md or any\ntemplates from the proxy. Users who want templates should grab them\nmanually until cascade is re-enabled.\n\nReasoning: tonight's testing showed Codex behav\n[…]\ne-enable cascading later, restore the _cascade_templates_via_proxy\ncall + the public-fallback AGENTS.md fetch in build_project — both are\nstill defined as helpers in server.py, just no longer invoked.",
"is_bot": false,
"headline": "0.2.8: disable template cascade on Build",
"author_name": "vibefoundry",
"author_login": "vibefoundry",
"committed_at": "2026-05-04T10:50:42Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "973ec2b85c1672496630b87d66c5d8f79d9ba00c",
"body": "…om feef873)",
"is_bot": false,
"headline": "Revert AGENTS.md to pre-yesterday state (0578adf, 33 lines removed fr…",
"author_name": "vibefoundry",
"author_login": "vibefoundry",
"committed_at": "2026-05-04T10:45:36Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5544a2a7e21a7ddfdb974f061955c1a103f4c46a",
"body": "Restores the AGENTS.md state from before tonight's iterative rule\nadditions. Cascading system, templates, and IDE all stay on the\nlatest commits — only AGENTS.md is rolled back. Tonight's rules\n(brief recon, build fast, no rescan, trusted workspace, partial\ntemplate matches, etc.) are gone from this file.\n\nIf we want any of those rules back, they're recoverable via:\n git log --oneline templates/AGENTS.md\nand cherry-picking specific commits.",
"is_bot": false,
"headline": "Revert templates/AGENTS.md to yesterday's version (feef873)",
"author_name": "vibefoundry",
"author_login": "vibefoundry",
"committed_at": "2026-05-04T10:44:30Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1e692089be3253e7f397aa5696c30ab26f2a8de7",
"body": "…et URL\n\nTwo fixes after testing the plain-script migration end-to-end:\n\n1) DuckDB-WASM doesn't ship a UMD/IIFE build on unpkg — only ESM/CJS.\n The previous prepare_dev_assets.py URL pointed at duckdb-browser-eh.js\n which doesn't exist (only the .worker.js variant does, plus the\n ESM/CJS main \n[…]\ntarts, the map's basemap should\nappear. County boundary GeoJSONs are still gitignored — that's the\ndeferred external-hosting task.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "templates: ship pre-built DuckDB IIFE bundle, drop COOP/COEP, fix ass…",
"author_name": "vibefoundry",
"author_login": "vibefoundry",
"committed_at": "2026-05-04T10:12:45Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "b9569486fe5752bd1696c15464d76cb541250faf",
"body": "geo_dashboard and trend_analytics_dashboard now use the project's\ncanonical Track 2 architecture (per AGENTS.md): UMD libs loaded via\n<script>, DuckDB-WASM IIFE bundle from unpkg, Python's built-in\nhttp.server with COOP/COEP headers for SharedArrayBuffer. Students\nneed only Python — no Node, no npm,\n[…]\nntentionally still use Vite — that's\nthe right tool for React + backend dev workflows and isn't affected\nby the Track 2 migration.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Migrate Track 2 templates from Vite to plain-script (no npm, no Node)",
"author_name": "vibefoundry",
"author_login": "vibefoundry",
"committed_at": "2026-05-04T09:57:43Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "eeedbc38abe14069991a6052b8173d823734c7a5",
"body": "…resh-write\n\nMost build requests are an 80% template match — the chassis (Vite,\nlaunchers, port logic, DuckDB-WASM, packaging) fits but the specific\nfeatures (charts, filters, columns) differ. The wrong instinct is to\nwrite the app from scratch because \"the template doesn't have feature X\"\n— that re\n[…]\nplate doesn't ship, ADD them.\n Never tell the user \"the template doesn't support that\". Extend it.\n\nMental model added at the end: template = chassis, features = body\npanels you bolt on or swap out.",
"is_bot": false,
"headline": "AGENTS.md: rule for partial template matches — fork + extend, never f…",
"author_name": "vibefoundry",
"author_login": "vibefoundry",
"committed_at": "2026-05-04T09:18:09Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "f8b22a38f41b20521a6c72f94794aa64db616475",
"body": "Adds a hard rule directly under the \"Which Track?\" section so the\nmoment Codex picks Track 2 or Track 3, its very first read is the\ntemplate's CUSTOMIZE.md — not app.js, not prepare_dev_assets.py,\nnot anything else. The recipe tells the agent which one file (usually\njust app_config.json) needs editing and lists what NOT to touch.\n\nTrack 1 keeps the existing pattern (read template's app.py for\nreference, write task fresh).",
"is_bot": false,
"headline": "AGENTS.md: route to template CUSTOMIZE.md immediately after track pick",
"author_name": "vibefoundry",
"author_login": "vibefoundry",
"committed_at": "2026-05-04T09:15:59Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "69fd49b7bd2e161760868572c257eb6ff20b32cc",
"body": "Each Track 2 template (geo_dashboard, trend_analytics_dashboard) now\nships a tight 5-step CUSTOMIZE.md at its root, designed for the agent\n(or a human) to follow in 30-60 seconds rather than minutes:\n\n 1. Read input_metadata.txt to identify the user's data\n 2. Fork the template (with sample_data/n\n[…]\n go off and edit 1600 lines of JS that are already config-driven.\n\nAGENTS.md now points to the per-template CUSTOMIZE.md as step 3 of\n\"How to use a template\" — agent reads it first before refactoring.",
"is_bot": false,
"headline": "templates: ship CUSTOMIZE.md recipe per template + point AGENTS.md at it",
"author_name": "vibefoundry",
"author_login": "vibefoundry",
"committed_at": "2026-05-04T09:13:34Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "7b8833900422c74eaba01fb0cfd6897b3c9616ef",
"body": "Replaces the prior \"no upfront recon\" rule with the Claude-Code-style\n\"brief recon then build\" pattern. Allows a quick metadata read and a\nsingle glance at project structure but bans:\n\n- Spawning sub-agents to \"explore\" or \"research\" before any edit\n- Opening 10+ files to \"understand the codebase\"\n-\n[…]\n\n- Recursive cataloging of app_folder/scripts/ or output_folder/\n- Extensive multi-step \"planning\" before any user-visible action\n\nTarget: first file edited within 10-20 seconds of the user's request.",
"is_bot": false,
"headline": "AGENTS.md: brief top-level recon, no agent-swarm pre-build phase",
"author_name": "vibefoundry",
"author_login": "vibefoundry",
"committed_at": "2026-05-04T08:52:08Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "c90dbe076fc09766dda615897d1b0de0b91c9806",
"body": "Stops Codex from spending 2 minutes scanning input files, listing\ndirectories, reading \"the codebase\", and sample-querying data before\nwriting a single line of code.\n\nHard rule near the top: when asked to build, start writing code now.\nUse the cached metadata for schema/types/row counts. Don't scan,\ndon't list, don't sample. If something isn't in the metadata, ask\nONE specific question — don't recon.",
"is_bot": false,
"headline": "AGENTS.md: start building immediately — no upfront file recon",
"author_name": "vibefoundry",
"author_login": "vibefoundry",
"committed_at": "2026-05-04T08:51:03Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "3eba8c73831dd401faa938ca323b72af3f87dae5",
"body": "Adds a \"Build fast\" section directly after the no-rescan rule. The\nexisting rules said \"don't re-scan\" but didn't address the bigger\nissue: Codex was running the pipeline after every single file edit,\nturning a 30-second task into 5+ minutes.\n\nNew rule, three lines:\n1. Read cached metadata so you kn\n[…]\np2, running pipeline...\n- Editing one step then re-running the entire pipeline to \"make sure\"\n- Running each new file just to confirm it executes\n- Reading back files you just wrote to verify contents",
"is_bot": false,
"headline": "AGENTS.md: build fast — write everything, run once",
"author_name": "vibefoundry",
"author_login": "vibefoundry",
"committed_at": "2026-05-04T08:50:02Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "6a3564d885173a25d94577fd8fbc45216dfa8587",
"body": "…first\n\nCodex was running pl.scan_csv / pl.scan_parquet repeatedly before\ndoing actual work, even when the IDE had already scanned the same\nfiles and stored the results in app_folder/meta_data/{input,output}_metadata.txt.\n\nAdds a 4-step rule near the top of AGENTS.md:\n1. Read meta_data/*.txt before \n[…]\nIDE already paid for it\n2. Only scan when you need stats the metadata doesn't have, then once\n3. Never re-scan to \"verify\" your own outputs\n4. Never re-run the whole pipeline to test one step's change",
"is_bot": false,
"headline": "AGENTS.md: hard rule against endless pl.scan_* — use cached metadata …",
"author_name": "vibefoundry",
"author_login": "vibefoundry",
"committed_at": "2026-05-04T08:48:54Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "d3b069591cdca3be42d83799ef27eeeb1296db50",
"body": "When the harness prompts for approval on routine commands in a fresh\nworkspace, the agent now offers a one-time setup using a specific\nphrasing the user can recognise:\n\n \"AGENTS.md would like to set up your Codex for smoother approvals.\n Mark this workspace as trusted so I stop asking permission \n[…]\nys to ~/.codex/config.toml. After that one\napproval, no more prompts in any project on that machine.\n\nTwo safety rules: never run without explicit approval, never propose\nmore than once per workspace.",
"is_bot": false,
"headline": "AGENTS.md: agent proposes setup_codex.sh with exact approval wording",
"author_name": "vibefoundry",
"author_login": "vibefoundry",
"committed_at": "2026-05-04T08:31:48Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "f443e7eeeb126bd81fe30923a482872feaf6d147",
"body": "…TS.md\n\nThe auto-write helper kept producing TOML files that Codex's parser\nrejected with 'invalid type: string \"never\", expected u32 in\ntui.model_availability_nux' — not worth the schema-fragility for a\nprompt-skipping nicety.\n\nWhat ships now:\n- Removed _ensure_codex_trusted() helper and its call f\n[…]\ns whose\n harness keeps prompting anyway. The agent reads this on every\n interaction and the user reads it when opening the file.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "0.2.7: revert auto-write to ~/.codex/config.toml; move policy to AGEN…",
"author_name": "vibefoundry",
"author_login": "vibefoundry",
"committed_at": "2026-05-04T08:27:00Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "55c048aebfdd5542809717f38031ec1fb383e273",
"body": "The previous implementation appended new keys at the end of the file.\nIf the user's existing config ended with a [section] (e.g.,\n[tui.model_availability_nux]), TOML's table-scope rules slurped the\nnew approval_policy = \"never\" into that table — breaking config load\nwith: invalid type: string \"never\n[…]\nwhitespace) immediately before it, so they stay top-level. Falls back\nto append-at-end only when the file has no [section] at all.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "0.2.6: fix _ensure_codex_trusted to insert ABOVE first [section]",
"author_name": "vibefoundry",
"author_login": "vibefoundry",
"committed_at": "2026-05-04T08:22:53Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "eb680f2eb844e6a782a97708e405f51dbee18e6c",
"body": "Adds _ensure_codex_trusted() helper that's called from /api/build\nafter folder scaffolding. It writes two keys to ~/.codex/config.toml\n(approval_policy = \"never\", sandbox_mode = \"workspace-write\") if and\nonly if they aren't already set — preserving any manual config the\nuser already has.\n\nEffect: st\n[…]\nriting to ~/.codex/ fails for any reason\n(permissions, missing dir, etc.) we log and continue — Build never\nfails because of this.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "0.2.5: Build auto-trusts the workspace for Codex CLI",
"author_name": "vibefoundry",
"author_login": "vibefoundry",
"committed_at": "2026-05-04T08:18:07Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "5c9e28f7c7264fd0513f1e95ece10b845cc25bcd",
"body": "Updates the comment headers in both setup_codex.sh and .ps1 to\nexplicitly list what falls under the \"trusted workspace\" policy\nand what still requires approval. Mirrors the standard \"Trust\nworkspace\" pattern from VS Code / Cursor / Codespaces.\n\nAUTO-APPROVED (inside the workspace only):\n - File exp\n[…]\nthe project (scp, curl uploads, etc.)\n - Plans for multi-step builds (agent-side, AGENTS.md-governed)\n - Judgment-call questions\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "codex setup: enumerate exact auto-approve scope (D&T-friendly)",
"author_name": "vibefoundry",
"author_login": "vibefoundry",
"committed_at": "2026-05-04T08:09:12Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "e565803a9f55381efd63fffd680c2bac77d2105e",
"body": "setup_codex.sh / setup_codex.ps1 are one-time-run scripts that mark\nthe user's workspace as trusted in their global ~/.codex/config.toml,\nso Codex stops prompting for approval on every shell command and\nenv-var prefix.\n\nSpecifically: sets approval_policy = \"never\" and sandbox_mode =\n\"workspace-write\n[…]\nBoth scripts are idempotent — they back up the existing config to\n~/.codex/config.toml.bak before patching, so re-running is safe.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Add codex-setup scripts for both shells (Mac/Linux + Windows)",
"author_name": "vibefoundry",
"author_login": "vibefoundry",
"committed_at": "2026-05-04T08:07:05Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "59d672d8afac265a5e35a47ddcf9ca57e5c2f452",
"body": null,
"is_bot": false,
"headline": "AGENTS.md: make shell-command rule symmetric (Mac/Linux + Windows)",
"author_name": "vibefoundry",
"author_login": "vibefoundry",
"committed_at": "2026-05-04T08:00:36Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f3cdb85a0a12374f7a167a9e13d35417d8f561d0",
"body": null,
"is_bot": false,
"headline": "AGENTS.md: tell agents to match shell commands to the host OS",
"author_name": "vibefoundry",
"author_login": "vibefoundry",
"committed_at": "2026-05-04T07:59:19Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "dc0942ede4f42cdc7a6f5fec8e7285ca004180da",
"body": "…2/T3\n\nTwo related rules added to the \"How to use a template\" section:\n\n1) Track 1 templates are reference material only. The agent should\n read them to learn the pipeline pattern, then write the new task\n from scratch in app_folder/scripts/. Never `cp -r` a Track 1\n template — pipeline code i\n[…]\nresolve their data from input_folder/ exclusively;\n carrying sample_data/ is how synthetic values end up in production\n outputs.\n\nReinforced in the \"Template data is for examples only\" subsection.",
"is_bot": false,
"headline": "AGENTS.md: forbid forking Track 1; exclude sample_data when forking T…",
"author_name": "vibefoundry",
"author_login": "vibefoundry",
"committed_at": "2026-05-04T07:54:25Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "ba17ed7525373131b352b62e70ca4fb49be115d3",
"body": "…ptions\n\n- Sign-in: add a \"Signed In! Click Here to Continue\" modal that\n shows once after a fresh sign-in (gated by a localStorage\n vf_signin_pending flag set when startSignIn runs). Modal is\n dismissed by clicking the button — IDE then renders normally.\n- Revert: removed the \"+ Folder\" button n\n[…]\nw Folder\" → \"Add Folder\" and \"New File\"\n → \"Add File\" so they read consistently with the existing\n \"Add Data\" option above them.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "0.2.4: post-sign-in modal + revert + Folder button + rename context o…",
"author_name": "vibefoundry",
"author_login": "vibefoundry",
"committed_at": "2026-05-04T07:52:27Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "ef14916eacf16a2f1baae839c533de8bb43abd25",
"body": "…layout",
"is_bot": false,
"headline": "Restructure geo_dashboard + trend_analytics_dashboard into app_core/ …",
"author_name": "vibefoundry",
"author_login": "vibefoundry",
"committed_at": "2026-05-04T07:06:03Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e66b02f6a43fe09c813eb8f1d41e0539f8bcd7af",
"body": "The new-folder modal was already wired in App.jsx — it just had no\nvisible trigger. Adds a button next to Build that opens it.\n\n(In-tree right-click → New Folder also still works for creating\nnested folders inside the existing tree.)\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "0.2.3: expose \"+ Folder\" button next to Build in top bar",
"author_name": "vibefoundry",
"author_login": "vibefoundry",
"committed_at": "2026-05-04T07:04:02Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "2e76c1ce6d6e76a0849b0e9141e37ee18325df05",
"body": "Two changes to src/vibefoundry/profiler.py:\n\n1) Process chunks in parallel via ThreadPoolExecutor (2-4 workers\n based on CPU count). Polars itself uses all cores within each\n chunk, but only one chunk ran at a time previously. Pipelining\n overlaps I/O and compute across chunks.\n\n2) Eliminate t\n[…]\nmbined: scanning a multi-GB Parquet/CSV is meaningfully faster\non first open. Subsequent opens were already fast (cached profile).\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "0.2.2: 3-5× faster large-file profiling",
"author_name": "vibefoundry",
"author_login": "vibefoundry",
"committed_at": "2026-05-04T06:59:39Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "6b24fc01097b2273b0567a9e36f66001a3796a83",
"body": null,
"is_bot": false,
"headline": "Bump to 0.2.1: FileTree expand fix",
"author_name": "vibefoundry",
"author_login": "vibefoundry",
"committed_at": "2026-05-04T06:53:46Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "2b3e40fed5adeb23f88651b826e532a0801e87dd",
"body": "Bug: collapsing a folder and re-expanding it would render all\ndescendants expanded too. Caused by expandToPath (fired when files\nappear in the tree) leaving stale entries in expandedPaths for\ndescendant folders that the user never explicitly expanded.\n\nFix: every toggle (expand or collapse) of a pat\n[…]\ndescendant entries from expandedPaths. Matches standard\nfile-explorer behaviour where collapse + re-expand loses descendant\nstate.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "FileTree: clear descendant expansion state on every toggle",
"author_name": "vibefoundry",
"author_login": "vibefoundry",
"committed_at": "2026-05-04T06:52:07Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "feef87341e2bb48dfd1d9da9b8301e9fd5494a7b",
"body": "Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Update templates/AGENTS.md",
"author_name": "vibefoundry",
"author_login": "vibefoundry",
"committed_at": "2026-05-04T05:48:50Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "42960b626b3e141f823ed8a265005ac8533187b9",
"body": "When Build cascades the templates/ tree into <project>/app_folder/\ntemplates/, the file watcher fires the addedPaths handler which\nhistorically called expandToPath() on every newly-discovered file.\nThat recursively expanded every ancestor — turning templates/ into\na fully-expanded library that burie\n[…]\neta_data exclusion). Users can still click the\ntemplates/ folder to expand it manually if they want to inspect a\nspecific starter.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "FileTree: never auto-expand templates/ when files appear in it",
"author_name": "vibefoundry",
"author_login": "vibefoundry",
"committed_at": "2026-05-04T05:47:54Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "50e43e6762eac75ec0ea13c3feb6b87fb17ad7a2",
"body": "Architecture change to remove the [Development] prefix from verification\nemails (which was a Clerk Dev limitation, hard to escape on a localhost\ndesktop app). The IDE now uses the same redirect-based pattern as gh,\nvercel, wandb CLIs.\n\nFlow:\n1. User clicks \"Sign in\" → IDE backend generates a CSRF st\n[…]\n).\n\nVersion bump 0.1.310 → 0.2.0 (semver: meaningful auth architecture\nchange, not backwards compatible with old Dev-keyed users).\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "v0.2.0: replace Clerk frontend with delegated auth via vibefoundry.ai",
"author_name": "vibefoundry",
"author_login": "vibefoundry",
"committed_at": "2026-05-04T05:02:54Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "21fbe9ea0c1e067d821a29d45f827194db7a4f90",
"body": "Templates now land at <project>/app_folder/templates/<name>/ instead\nof <project>/app_folder/<name>/. Keeps the starter content visually\nand organizationally separate from scripts the user writes themselves.\nAGENTS.md continues to be hoisted to the project root after cascade.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Build: cascade templates into app_folder/templates/ subfolder",
"author_name": "vibefoundry",
"author_login": "vibefoundry",
"committed_at": "2026-05-04T04:29:34Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "0578adfd6c254acf2cd4a4fe51cfbb0db65b3ad0",
"body": "Templates added:\n- data_pipeline/ — multi-step Polars pipeline with sample parquet\n- geo_dashboard/ — Vite + Leaflet geographic dashboard starter\n- trend_analytics_dashboard/ — Vite trend analytics starter\n\nCascade behaviour change:\n- Templates now land inside <project>/app_folder/<template_na\n[…]\ns it where it expects.\n\nVersions:\n- pyproject.toml: 0.1.309 → 0.1.310\n- src/vibefoundry/__init__.py: 0.1.302 → 0.1.310 (was stale)\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Add app templates; cascade into app_folder/; bump to 0.1.310",
"author_name": "vibefoundry",
"author_login": "vibefoundry",
"committed_at": "2026-05-04T04:27:10Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "1238ac894ebd1ff7fff12e86685ff5566d2aed83",
"body": "Previously the cascade only walked the top level of templates/ and\nskipped any subfolders. Now it recurses through directories, mirroring\nthe structure into dest_root. Lets you ship app starter templates as\nfolders (e.g., templates/streamlit_dashboard/, templates/rag_app/)\nand have every Build pull them into the user's project intact.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Build: cascade templates/ recursively, preserving subfolder structure",
"author_name": "vibefoundry",
"author_login": "vibefoundry",
"committed_at": "2026-05-04T04:20:35Z",
"body_truncated": false,
"is_coding_agent": true
}
],
"releases_count": 0,
"commits_last_year": 211,
"latest_release_at": null,
"latest_release_tag": null,
"releases_from_tags": false,
"days_since_last_push": 0,
"active_weeks_last_year": 14,
"days_since_latest_release": null,
"mean_days_between_releases": null
},
"community": {
"has_readme": true,
"has_license": false,
"has_description": true,
"has_contributing": false,
"health_percentage": 28,
"has_issue_template": false,
"has_code_of_conduct": false,
"has_pull_request_template": false
},
"ecosystem": {
"packages": [
{
"name": "vibefoundry",
"exists": true,
"license": "MIT",
"keywords": [
"ide",
"data-science",
"scripts",
"codespace",
"Development Status :: 4 - Beta",
"Environment :: Web Environment",
"Intended Audience :: Developers",
"Intended Audience :: Science/Research",
"License :: OSI Approved :: MIT License",
"Operating System :: OS Independent",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.10",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
"Programming Language :: Python :: 3.9",
"Topic :: Scientific/Engineering",
"Topic :: Software Development :: User Interfaces"
],
"ecosystem": "pypi",
"matches_repo": true,
"registry_url": "https://pypi.org/project/vibefoundry/",
"is_deprecated": false,
"latest_version": "0.4.2",
"repository_url": "https://github.com/vibefoundry/vibefoundry-python-lib",
"versions_count": 253,
"total_downloads": null,
"dependents_count": null,
"deprecation_note": null,
"maintainers_count": null,
"monthly_downloads": 5422,
"first_published_at": "2026-02-09T14:16:29.073308Z",
"latest_published_at": "2026-08-01T03:23:29.175204Z",
"latest_version_yanked": null,
"days_since_latest_publish": 0
}
]
},
"popularity": {
"forks": 0,
"stars": 0,
"watchers": 0,
"fork_history": {
"days": [],
"complete": true,
"collected": 0,
"total_forks": 0
},
"star_history": {
"days": [],
"complete": true,
"collected": 0,
"total_stars": 0,
"collected_at": null
},
"open_issues_and_prs": 0
},
"ai_readiness": {
"has_nix": false,
"example_dirs": [],
"has_llms_txt": false,
"has_dockerfile": false,
"has_mcp_signal": false,
"bootstrap_files": [
"Makefile"
],
"api_schema_files": [],
"has_devcontainer": false,
"typecheck_configs": [],
"toolchain_manifests": [],
"largest_source_bytes": 105899,
"source_files_sampled": 30,
"oversized_source_files": 2,
"agent_instruction_files": [
"archived md files/AGENTS.md"
],
"agent_instruction_max_bytes": 75665
},
"dependencies": {
"manifests": [
"frontend/package.json",
"pyproject.toml"
],
"advisories": {
"error": null,
"scope": null,
"source": null,
"findings": [],
"collected": false,
"malicious": [],
"truncated": false,
"by_severity": {},
"advisory_count": 0,
"affected_count": 0,
"assessed_count": 0,
"malicious_count": 0,
"assessed_package": null,
"unassessed_count": 0,
"direct_affected_count": 0
},
"ecosystems": [
"npm",
"pypi"
],
"dependencies": [
{
"name": "@clerk/clerk-react",
"manifest": "frontend/package.json",
"ecosystem": "npm",
"version_constraint": "^5.61.6"
},
{
"name": "@codemirror/commands",
"manifest": "frontend/package.json",
"ecosystem": "npm",
"version_constraint": "^6.10.1"
},
{
"name": "@codemirror/lang-css",
"manifest": "frontend/package.json",
"ecosystem": "npm",
"version_constraint": "^6.3.1"
},
{
"name": "@codemirror/lang-html",
"manifest": "frontend/package.json",
"ecosystem": "npm",
"version_constraint": "^6.4.11"
},
{
"name": "@codemirror/lang-javascript",
"manifest": "frontend/package.json",
"ecosystem": "npm",
"version_constraint": "^6.2.4"
},
{
"name": "@codemirror/lang-json",
"manifest": "frontend/package.json",
"ecosystem": "npm",
"version_constraint": "^6.0.2"
},
{
"name": "@codemirror/lang-markdown",
"manifest": "frontend/package.json",
"ecosystem": "npm",
"version_constraint": "^6.5.0"
},
{
"name": "@codemirror/lang-python",
"manifest": "frontend/package.json",
"ecosystem": "npm",
"version_constraint": "^6.2.1"
},
{
"name": "@codemirror/language",
"manifest": "frontend/package.json",
"ecosystem": "npm",
"version_constraint": "^6.12.1"
},
{
"name": "@codemirror/state",
"manifest": "frontend/package.json",
"ecosystem": "npm",
"version_constraint": "^6.5.4"
},
{
"name": "@codemirror/theme-one-dark",
"manifest": "frontend/package.json",
"ecosystem": "npm",
"version_constraint": "^6.1.3"
},
{
"name": "@codemirror/view",
"manifest": "frontend/package.json",
"ecosystem": "npm",
"version_constraint": "^6.39.12"
},
{
"name": "@tanstack/react-table",
"manifest": "frontend/package.json",
"ecosystem": "npm",
"version_constraint": "^8.21.3"
},
{
"name": "@xterm/addon-canvas",
"manifest": "frontend/package.json",
"ecosystem": "npm",
"version_constraint": "^0.7.0"
},
{
"name": "@xterm/addon-fit",
"manifest": "frontend/package.json",
"ecosystem": "npm",
"version_constraint": "^0.10.0"
},
{
"name": "@xterm/xterm",
"manifest": "frontend/package.json",
"ecosystem": "npm",
"version_constraint": "^5.5.0"
},
{
"name": "chart.js",
"manifest": "frontend/package.json",
"ecosystem": "npm",
"version_constraint": "^4.5.1"
},
{
"name": "papaparse",
"manifest": "frontend/package.json",
"ecosystem": "npm",
"version_constraint": "^5.5.3"
},
{
"name": "react",
"manifest": "frontend/package.json",
"ecosystem": "npm",
"version_constraint": "^19.2.0"
},
{
"name": "react-dom",
"manifest": "frontend/package.json",
"ecosystem": "npm",
"version_constraint": "^19.2.0"
},
{
"name": "react-json-view-lite",
"manifest": "frontend/package.json",
"ecosystem": "npm",
"version_constraint": "^2.5.0"
},
{
"name": "react-markdown",
"manifest": "frontend/package.json",
"ecosystem": "npm",
"version_constraint": "^10.1.0"
},
{
"name": "react-syntax-highlighter",
"manifest": "frontend/package.json",
"ecosystem": "npm",
"version_constraint": "^16.1.0"
},
{
"name": "react-window",
"manifest": "frontend/package.json",
"ecosystem": "npm",
"version_constraint": "^2.2.6"
},
{
"name": "xlsx",
"manifest": "frontend/package.json",
"ecosystem": "npm",
"version_constraint": "^0.18.5"
},
{
"name": "fastapi",
"manifest": "pyproject.toml",
"ecosystem": "pypi",
"version_constraint": ">=0.100.0"
},
{
"name": "uvicorn",
"manifest": "pyproject.toml",
"ecosystem": "pypi",
"version_constraint": ">=0.23.0"
},
{
"name": "polars-lts-cpu",
"manifest": "pyproject.toml",
"ecosystem": "pypi",
"version_constraint": ">=1.0.0"
},
{
"name": "pyarrow",
"manifest": "pyproject.toml",
"ecosystem": "pypi",
"version_constraint": ">=14.0.0"
},
{
"name": "pandas",
"manifest": "pyproject.toml",
"ecosystem": "pypi",
"version_constraint": ">=2.0.0"
},
{
"name": "openpyxl",
"manifest": "pyproject.toml",
"ecosystem": "pypi",
"version_constraint": ">=3.1.0"
},
{
"name": "fastexcel",
"manifest": "pyproject.toml",
"ecosystem": "pypi",
"version_constraint": ">=0.10"
},
{
"name": "xlsx2html",
"manifest": "pyproject.toml",
"ecosystem": "pypi",
"version_constraint": ">=0.6"
},
{
"name": "websockets",
"manifest": "pyproject.toml",
"ecosystem": "pypi",
"version_constraint": ">=11.0.0"
},
{
"name": "httpx",
"manifest": "pyproject.toml",
"ecosystem": "pypi",
"version_constraint": ">=0.25.0"
},
{
"name": "xlsx2csv",
"manifest": "pyproject.toml",
"ecosystem": "pypi",
"version_constraint": ">=0.8.0"
},
{
"name": "python-multipart",
"manifest": "pyproject.toml",
"ecosystem": "pypi",
"version_constraint": ">=0.0.6"
},
{
"name": "watchdog",
"manifest": "pyproject.toml",
"ecosystem": "pypi",
"version_constraint": ">=3.0.0"
},
{
"name": "python-dateutil",
"manifest": "pyproject.toml",
"ecosystem": "pypi",
"version_constraint": ">=2.8.0"
},
{
"name": "truststore",
"manifest": "pyproject.toml",
"ecosystem": "pypi",
"version_constraint": ">=0.9"
}
],
"all_dependencies": {
"error": "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
"source": null,
"packages": [],
"collected": false,
"truncated": false,
"total_count": null,
"direct_count": null,
"indirect_count": null
}
},
"maintainership": {
"issues": {
"open_prs": 0,
"merged_prs": 0,
"open_issues": 0,
"closed_ratio": null,
"closed_issues": 0,
"closed_unmerged_prs": 0
},
"bus_factor": 1,
"bot_contributors": 0,
"top_contributors": [
{
"type": "User",
"login": "vibefoundry",
"commits": 138,
"avatar_url": "https://avatars.githubusercontent.com/u/214882911?v=4"
},
{
"type": "User",
"login": "boostergpt",
"commits": 78,
"avatar_url": "https://avatars.githubusercontent.com/u/191929723?v=4"
}
],
"contributors_sampled": 2,
"top_contributor_share": 0.639
},
"quality_signals": {
"has_ci": false,
"has_tests": false,
"ci_workflows": [],
"has_docs_dir": false,
"linter_configs": [],
"has_editorconfig": false,
"has_linter_config": false,
"has_precommit_config": false
},
"security_signals": {
"lockfiles": [
"package-lock.json"
],
"scorecard": {
"checks": [
{
"name": "Binary-Artifacts",
"score": 10,
"reason": "no binaries found in the repo",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
},
{
"name": "Branch-Protection",
"score": 0,
"reason": "branch protection not enabled on development/release branches",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
},
{
"name": "CI-Tests",
"score": null,
"reason": "no pull request found",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
},
{
"name": "CII-Best-Practices",
"score": 0,
"reason": "no effort to earn an OpenSSF best practices badge detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
},
{
"name": "Code-Review",
"score": 0,
"reason": "Found 0/30 approved changesets -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
},
{
"name": "Contributors",
"score": 0,
"reason": "project has 0 contributing companies or organizations -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
},
{
"name": "Dangerous-Workflow",
"score": null,
"reason": "no workflows found",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
},
{
"name": "Dependency-Update-Tool",
"score": 0,
"reason": "no update tool detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
},
{
"name": "Fuzzing",
"score": 0,
"reason": "project is not fuzzed",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
},
{
"name": "License",
"score": 0,
"reason": "license file not detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
},
{
"name": "Maintained",
"score": 0,
"reason": "project was created within the last 90 days. Please review its contents carefully",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
},
{
"name": "Packaging",
"score": null,
"reason": "packaging workflow not detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
},
{
"name": "Pinned-Dependencies",
"score": 0,
"reason": "dependency not pinned by hash detected -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
},
{
"name": "SAST",
"score": 0,
"reason": "no SAST tool detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
},
{
"name": "Security-Policy",
"score": 0,
"reason": "security policy file not detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
},
{
"name": "Signed-Releases",
"score": null,
"reason": "no releases found",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
},
{
"name": "Token-Permissions",
"score": null,
"reason": "No tokens found",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
},
{
"name": "Vulnerabilities",
"score": 0,
"reason": "22 existing vulnerabilities detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
}
],
"commit": "36aea3d168cd7339ac57458904bee1ae15ef1e5a",
"ran_at": "2026-08-01T03:26:02Z",
"aggregate_score": 1,
"scorecard_version": "v5.5.0"
},
"has_codeql_workflow": false,
"has_security_policy": false,
"has_dependabot_config": false
},
"contribution_flow": {
"collected": true,
"ci_last_run_at": "2026-08-01T03:23:45Z",
"oldest_open_prs": [],
"last_merged_pr_at": null,
"ci_last_conclusion": null,
"oldest_open_issues": []
}
},
"config": {
"disabled_metrics": [],
"disabled_categories": [],
"disabled_components": {}
},
"source": {
"url": "https://github.com/vibefoundry/vibefoundry-python-lib",
"host": "github.com",
"name": "vibefoundry-python-lib",
"owner": "vibefoundry"
},
"metrics": {
"overall": {
"key": "overall",
"band": "at_risk",
"name": "Overall health",
"note": "The weighted overall 28 is calibrated to 22 on the published index scale (record calibration 2026-08-02).",
"notes": [
{
"code": "overall_calibration",
"params": {
"raw": 28,
"calibrated": 22,
"calibration": "2026-08-02"
}
}
],
"value": 22,
"inputs": {
"security": 10,
"vitality": 39,
"community": 25,
"governance": 33,
"calibration": "2026-08-02",
"engineering": 21,
"ai_readiness": 57,
"weighted_overall_raw": 28
},
"components": []
},
"categories": [
{
"key": "vitality",
"band": "weak",
"name": "Vitality",
"value": 39,
"weight": 0.21,
"metrics": [
{
"key": "development_activity",
"band": "moderate",
"name": "Development activity",
"note": null,
"notes": [],
"value": 64,
"inputs": {
"commits_last_year": 211,
"human_commit_share": 1,
"days_since_last_push": 0,
"active_weeks_last_year": 14
},
"components": [
{
"key": "push_recency",
"name": "Push recency",
"detail": "last push 0 days ago",
"points": 36,
"status": "met",
"details": [
{
"code": "push_recency",
"params": {
"days": 0
}
}
],
"max_points": 36
},
{
"key": "commit_cadence",
"name": "Commit cadence",
"detail": "14/52 weeks with commits",
"points": 9.7,
"status": "partial",
"details": [
{
"code": "commit_cadence_weeks",
"params": {
"weeks": 14
}
}
],
"max_points": 36
},
{
"key": "commit_volume",
"name": "Commit volume",
"detail": "211 commits in the last year",
"points": 18,
"status": "met",
"details": [
{
"code": "commits_last_year",
"params": {
"count": 211
}
}
],
"max_points": 18
},
{
"key": "openssf_scorecard_maintained",
"name": "OpenSSF Scorecard: Maintained",
"detail": "project was created within the last 90 days. Please review its contents carefully",
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
}
]
},
{
"key": "release_discipline",
"band": "critical",
"name": "Release discipline",
"note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"openssf_scorecard_signed_releases"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 1,
"inputs": {
"releases_count": 0
},
"components": [
{
"key": "ships_releases",
"name": "Ships releases",
"detail": "no releases published",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_releases_published",
"params": {}
}
],
"max_points": 27
},
{
"key": "release_recency",
"name": "Release recency",
"detail": "no releases",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_releases",
"params": {}
}
],
"max_points": 36
},
{
"key": "release_cadence",
"name": "Release cadence",
"detail": "no releases",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_releases",
"params": {}
}
],
"max_points": 27
},
{
"key": "openssf_scorecard_signed_releases",
"name": "OpenSSF Scorecard: Signed-Releases",
"detail": "no releases found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 10
}
]
},
{
"key": "abandonment",
"band": "exceptional",
"name": "Abandonment",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"cap": null,
"state": "unverified",
"guards": [],
"signals": [],
"red_flag": false,
"multiplier_pct": 100,
"declared_reason": null,
"unverified_reason": "repository_too_young",
"unanswered_open_prs": null,
"unanswered_open_issues": null,
"days_since_last_merged_pr": null,
"days_since_last_human_commit": null,
"days_since_last_human_commit_is_floor": false
},
"components": [
{
"key": "project_is_still_maintained",
"name": "Project is still maintained",
"detail": "maintenance record not established from the collected data",
"points": 100,
"status": "met",
"details": [
{
"code": "abandonment_unverified",
"params": {}
}
],
"max_points": 100
}
]
}
],
"description": "Is the project alive — is code being written and are releases shipping?"
},
{
"key": "community",
"band": "at_risk",
"name": "Community & Adoption",
"value": 25,
"weight": 0.17,
"metrics": [
{
"key": "popularity",
"band": "critical",
"name": "Popularity & adoption",
"note": null,
"notes": [],
"value": 1,
"inputs": {
"forks": 0,
"stars": 0,
"watchers": 0,
"growth_state": "unverified",
"growth_factor_pct": 100,
"growth_unverified_reason": "no_history"
},
"components": [
{
"key": "stars",
"name": "Stars",
"detail": "0 stars",
"points": 0,
"status": "missed",
"details": [
{
"code": "stars",
"params": {
"count": 0
}
}
],
"max_points": 60
},
{
"key": "forks",
"name": "Forks",
"detail": "0 forks",
"points": 0,
"status": "missed",
"details": [
{
"code": "forks",
"params": {
"count": 0
}
}
],
"max_points": 25
},
{
"key": "watchers",
"name": "Watchers",
"detail": "0 watchers",
"points": 0,
"status": "missed",
"details": [
{
"code": "watchers",
"params": {
"count": 0
}
}
],
"max_points": 15
}
]
},
{
"key": "community_health",
"band": "at_risk",
"name": "Community health",
"note": null,
"notes": [],
"value": 25,
"inputs": {
"has_readme": true,
"has_license": false,
"readme_badges": null,
"has_contributing": false,
"has_issue_template": false,
"has_code_of_conduct": false,
"readme_badge_services": [],
"has_pull_request_template": false
},
"components": [
{
"key": "readme",
"name": "README",
"detail": null,
"points": 22.5,
"status": "met",
"details": [],
"max_points": 22.5
},
{
"key": "license",
"name": "License",
"detail": "no license file detected",
"points": 0,
"status": "missed",
"details": [
{
"code": "license_absent",
"params": {}
}
],
"max_points": 22.5
},
{
"key": "contributing_guide",
"name": "CONTRIBUTING guide",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 18
},
{
"key": "code_of_conduct",
"name": "Code of conduct",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 13.5
},
{
"key": "issue_template",
"name": "Issue template",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.2
},
{
"key": "pr_template",
"name": "PR template",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 6.3
}
]
},
{
"key": "ecosystem_adoption",
"band": "moderate",
"name": "Ecosystem adoption (downloads)",
"note": "Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"registry_dependents"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 62,
"inputs": {
"packages": [
"vibefoundry"
],
"dependents": null,
"ecosystems": "pypi",
"total_downloads": null,
"monthly_downloads": 5422
},
"components": [
{
"key": "monthly_downloads",
"name": "Monthly downloads",
"detail": "5,422 downloads/month across pypi",
"points": 49.8,
"status": "partial",
"details": [
{
"code": "downloads_monthly",
"params": {
"count": 5422,
"ecosystems": "pypi"
}
}
],
"max_points": 80
},
{
"key": "registry_dependents",
"name": "Registry dependents",
"detail": "not reported by this ecosystem",
"points": 0,
"status": "excluded",
"details": [
{
"code": "not_reported_by_this_ecosystem",
"params": {}
}
],
"max_points": 20
}
]
}
],
"description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
},
{
"key": "governance",
"band": "at_risk",
"name": "Sustainability & Governance",
"value": 33,
"weight": 0.23,
"metrics": [
{
"key": "maintainer_resilience",
"band": "at_risk",
"name": "Maintainer resilience (bus factor)",
"note": null,
"notes": [],
"value": 20,
"inputs": {
"bus_factor": 1,
"contributors_sampled": 2,
"top_contributor_share": 0.639
},
"components": [
{
"key": "bus_factor",
"name": "Bus factor",
"detail": "1 contributor(s) cover half of all commits",
"points": 9,
"status": "partial",
"details": [
{
"code": "bus_factor",
"params": {
"count": 1
}
}
],
"max_points": 54
},
{
"key": "commit_distribution",
"name": "Commit distribution",
"detail": "top contributor authored 64% of commits",
"points": 8.1,
"status": "partial",
"details": [
{
"code": "top_contributor_share",
"params": {
"share": 64
}
}
],
"max_points": 22.5
},
{
"key": "contributor_breadth",
"name": "Contributor breadth",
"detail": "2 contributors",
"points": 2.7,
"status": "partial",
"details": [
{
"code": "contributors_sampled",
"params": {
"count": 2
}
}
],
"max_points": 13.5
},
{
"key": "openssf_scorecard_contributors",
"name": "OpenSSF Scorecard: Contributors",
"detail": "project has 0 contributing companies or organizations -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
}
]
},
{
"key": "responsiveness",
"band": "critical",
"name": "Issue & PR responsiveness",
"note": "Excluded from scoring (no data or not applicable): Issue resolution, PR acceptance, Newcomer PR acceptance. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"issue_resolution",
"pr_acceptance",
"newcomer_pr_acceptance"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 1,
"inputs": {
"merged_prs": 0,
"open_issues": 0,
"closed_issues": 0,
"prs_merged_7d": null,
"prs_decided_7d": null,
"prs_merged_30d": null,
"prs_decided_30d": null,
"issue_closed_ratio": null,
"closed_unmerged_prs": 0,
"first_time_authors_30d": null,
"first_time_prs_merged_30d": null,
"first_time_prs_decided_30d": null
},
"components": [
{
"key": "issue_resolution",
"name": "Issue resolution",
"detail": "no issues or no data",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_issues_or_data",
"params": {}
}
],
"max_points": 42
},
{
"key": "pr_acceptance",
"name": "PR acceptance",
"detail": "no decided pull requests or no data",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_decided_prs_or_data",
"params": {}
}
],
"max_points": 30
},
{
"key": "newcomer_pr_acceptance",
"name": "Newcomer PR acceptance",
"detail": "no first-time contributor's PR decided in 30d",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_newcomer_prs",
"params": {
"days": 30
}
}
],
"max_points": 13
},
{
"key": "openssf_scorecard_code_review",
"name": "OpenSSF Scorecard: Code-Review",
"detail": "Found 0/30 approved changesets -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
}
]
},
{
"key": "stewardship",
"band": "at_risk",
"name": "Ownership & stewardship",
"note": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"verified_domain"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 28,
"inputs": {
"followers": 1,
"owner_type": "User",
"is_verified": null,
"owner_login": "vibefoundry",
"public_repos": 12,
"account_age_days": 422
},
"components": [
{
"key": "ownership_backing",
"name": "Ownership backing",
"detail": "personal (user) account",
"points": 10,
"status": "partial",
"details": [
{
"code": "owner_personal",
"params": {}
}
],
"max_points": 30
},
{
"key": "verified_domain",
"name": "Verified domain",
"detail": "not applicable to user accounts",
"points": 0,
"status": "excluded",
"details": [
{
"code": "not_applicable_to_user_accounts",
"params": {}
}
],
"max_points": 20
},
{
"key": "owner_reach",
"name": "Owner reach",
"detail": "1 followers of vibefoundry",
"points": 2.2,
"status": "partial",
"details": [
{
"code": "owner_followers",
"params": {
"count": 1,
"login": "vibefoundry"
}
}
],
"max_points": 25
},
{
"key": "track_record",
"name": "Track record",
"detail": "12 public repos, account ~1 yr old",
"points": 10.4,
"status": "partial",
"details": [
{
"code": "public_repos",
"params": {
"count": 12
}
},
{
"code": "account_age_years",
"params": {
"years": 1
}
}
],
"max_points": 25
}
]
},
{
"key": "package_maintenance",
"band": "exceptional",
"name": "Package maintenance",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"packages": [
"vibefoundry"
],
"ecosystems": "pypi",
"any_deprecated": false,
"min_days_since_publish": 0
},
"components": [
{
"key": "published_resolvable",
"name": "Published & resolvable",
"detail": "1 package(s) on pypi",
"points": 25,
"status": "met",
"details": [
{
"code": "packages_published",
"params": {
"count": 1,
"ecosystems": "pypi"
}
}
],
"max_points": 25
},
{
"key": "publish_recency",
"name": "Publish recency",
"detail": "latest publish 0 days ago",
"points": 35,
"status": "met",
"details": [
{
"code": "publish_recency",
"params": {
"days": 0
}
}
],
"max_points": 35
},
{
"key": "version_history",
"name": "Version history",
"detail": "253 published versions",
"points": 20,
"status": "met",
"details": [
{
"code": "published_versions",
"params": {
"count": 253
}
}
],
"max_points": 20
},
{
"key": "not_deprecated",
"name": "Not deprecated",
"detail": "active, not deprecated or yanked",
"points": 20,
"status": "met",
"details": [
{
"code": "package_not_deprecated",
"params": {}
}
],
"max_points": 20
}
]
}
],
"description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
},
{
"key": "engineering",
"band": "at_risk",
"name": "Engineering Quality",
"value": 21,
"weight": 0.19,
"metrics": [
{
"key": "engineering_practices",
"band": "critical",
"name": "Engineering practices",
"note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: CI-Tests. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"openssf_scorecard_ci_tests"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 1,
"inputs": {
"has_ci": false,
"has_tests": false,
"has_editorconfig": false,
"has_linter_config": false,
"has_precommit_config": false
},
"components": [
{
"key": "ci_workflows",
"name": "CI workflows",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 24
},
{
"key": "tests_present",
"name": "Tests present",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 24
},
{
"key": "linter_config",
"name": "Linter config",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 16
},
{
"key": "pre_commit_hooks",
"name": "Pre-commit hooks",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 9.6
},
{
"key": "editorconfig",
"name": ".editorconfig",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 6.4
},
{
"key": "openssf_scorecard_ci_tests",
"name": "OpenSSF Scorecard: CI-Tests",
"detail": "no pull request found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 20
}
]
},
{
"key": "documentation",
"band": "moderate",
"name": "Documentation",
"note": null,
"notes": [],
"value": 50,
"inputs": {
"topics": [],
"has_wiki": true,
"homepage": null,
"has_readme": true,
"has_docs_dir": false,
"has_description": true
},
"components": [
{
"key": "readme",
"name": "README",
"detail": null,
"points": 30,
"status": "met",
"details": [],
"max_points": 30
},
{
"key": "documentation_directory",
"name": "Documentation directory",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 25
},
{
"key": "documentation_homepage_site",
"name": "Documentation / homepage site",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
},
{
"key": "repository_description",
"name": "Repository description",
"detail": null,
"points": 10,
"status": "met",
"details": [],
"max_points": 10
},
{
"key": "topics",
"name": "Topics",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
},
{
"key": "wiki",
"name": "Wiki",
"detail": null,
"points": 10,
"status": "met",
"details": [],
"max_points": 10
}
]
}
],
"description": "Are baseline engineering and documentation practices in place?"
},
{
"key": "security",
"band": "critical",
"name": "Security",
"value": 10,
"weight": 0.16,
"metrics": [
{
"key": "security_posture",
"band": "critical",
"name": "Security posture",
"note": "Excluded from scoring (no data or not applicable): CI-Tests, Dangerous-Workflow, Packaging, Signed-Releases, Token-Permissions. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"ci_tests",
"dangerous_workflow",
"packaging",
"signed_releases",
"token_permissions"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 10,
"inputs": {
"source": "openssf_scorecard",
"checks_evaluated": 13,
"scorecard_version": "v5.5.0",
"checks_inconclusive": 5,
"scorecard_aggregate": 1
},
"components": [
{
"key": "binary_artifacts",
"name": "Binary-Artifacts",
"detail": "no binaries found in the repo",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
},
{
"key": "branch_protection",
"name": "Branch-Protection",
"detail": "branch protection not enabled on development/release branches",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "ci_tests",
"name": "CI-Tests",
"detail": "no pull request found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 2.5
},
{
"key": "cii_best_practices",
"name": "CII-Best-Practices",
"detail": "no effort to earn an OpenSSF best practices badge detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 2.5
},
{
"key": "code_review",
"name": "Code-Review",
"detail": "Found 0/30 approved changesets -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "contributors",
"name": "Contributors",
"detail": "project has 0 contributing companies or organizations -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 2.5
},
{
"key": "dangerous_workflow",
"name": "Dangerous-Workflow",
"detail": "no workflows found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 10
},
{
"key": "dependency_update_tool",
"name": "Dependency-Update-Tool",
"detail": "no update tool detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "fuzzing",
"name": "Fuzzing",
"detail": "project is not fuzzed",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "license",
"name": "License",
"detail": "license file not detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 2.5
},
{
"key": "maintained",
"name": "Maintained",
"detail": "project was created within the last 90 days. Please review its contents carefully",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "packaging",
"name": "Packaging",
"detail": "packaging workflow not detected",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 5
},
{
"key": "pinned_dependencies",
"name": "Pinned-Dependencies",
"detail": "dependency not pinned by hash detected -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "sast",
"name": "SAST",
"detail": "no SAST tool detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "security_policy",
"name": "Security-Policy",
"detail": "security policy file not detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "signed_releases",
"name": "Signed-Releases",
"detail": "no releases found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 7.5
},
{
"key": "token_permissions",
"name": "Token-Permissions",
"detail": "No tokens found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 7.5
},
{
"key": "vulnerabilities",
"name": "Vulnerabilities",
"detail": "22 existing vulnerabilities detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
}
]
}
],
"description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
},
{
"key": "ai_readiness",
"band": "moderate",
"name": "AI Readiness",
"value": 57,
"weight": 0.04,
"metrics": [
{
"key": "ai_agent_context",
"band": "excellent",
"name": "Agent context & guidance",
"note": null,
"notes": [],
"value": 85,
"inputs": {
"has_llms_txt": false,
"legible_history_share": 0.85,
"agent_instruction_files": [
"archived md files/AGENTS.md"
],
"agent_instruction_max_bytes": 75665
},
"components": [
{
"key": "agent_instructions",
"name": "Agent instructions",
"detail": "archived md files/AGENTS.md",
"points": 45,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "archived md files/AGENTS.md"
}
}
],
"max_points": 45
},
{
"key": "machine_readable_docs_llms_txt",
"name": "Machine-readable docs (llms.txt)",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
},
{
"key": "legible_commit_history",
"name": "Legible commit history",
"detail": "85 of 100 human commits state their intent (structured subject or explanatory body)",
"points": 40,
"status": "met",
"details": [
{
"code": "legible_history",
"params": {
"legible": 85,
"sampled": 100
}
}
],
"max_points": 40
}
]
},
{
"key": "ai_verify_loop",
"band": "weak",
"name": "Verify loop (build / test / typecheck)",
"note": null,
"notes": [],
"value": 38,
"inputs": {
"has_nix": false,
"has_tests": false,
"lockfiles": [
"package-lock.json"
],
"has_dockerfile": false,
"typed_language": false,
"bootstrap_files": [
"Makefile"
],
"has_devcontainer": false,
"has_linter_config": false,
"typecheck_configs": [],
"agent_commit_share": 0.81,
"toolchain_manifests": [],
"dependency_bot_commit_share": 0
},
"components": [
{
"key": "one_command_bootstrap",
"name": "One-command bootstrap",
"detail": "Makefile",
"points": 18,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "Makefile"
}
}
],
"max_points": 18
},
{
"key": "automated_tests",
"name": "Automated tests",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 22
},
{
"key": "lint_format_config",
"name": "Lint / format config",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 11
},
{
"key": "static_type_checking",
"name": "Static type checking",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 11
},
{
"key": "reproducible_environment",
"name": "Reproducible environment",
"detail": "lockfile",
"points": 10,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "lockfile"
}
}
],
"max_points": 10
},
{
"key": "demonstrated_agent_practice",
"name": "Demonstrated agent practice",
"detail": "81 of the last 100 commits agent-authored or agent-credited",
"points": 10,
"status": "met",
"details": [
{
"code": "agent_authored_commits",
"params": {
"count": 81,
"sampled": 100
}
}
],
"max_points": 10
},
{
"key": "automated_maintenance",
"name": "Automated maintenance",
"detail": "no automated dependency updates observed",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_dependency_automation",
"params": {}
}
],
"max_points": 8
},
{
"key": "openssf_scorecard_pinned_dependencies",
"name": "OpenSSF Scorecard: Pinned-Dependencies",
"detail": "dependency not pinned by hash detected -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
}
]
},
{
"key": "ai_code_legibility",
"band": "moderate",
"name": "Code legibility for models",
"note": null,
"notes": [],
"value": 51,
"inputs": {
"primary_language": "JavaScript",
"largest_source_bytes": 105899,
"source_files_sampled": 30,
"oversized_source_files": 2
},
"components": [
{
"key": "type_checkable_code",
"name": "Type-checkable code",
"detail": "JavaScript without a type-check config",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_typecheck_config_language",
"params": {
"language": "JavaScript"
}
}
],
"max_points": 45
},
{
"key": "manageable_file_sizes",
"name": "Manageable file sizes",
"detail": "2/30 source files over 60KB",
"points": 51.3,
"status": "partial",
"details": [
{
"code": "oversized_source_files",
"params": {
"kb": 60,
"sampled": 30,
"oversized": 2
}
}
],
"max_points": 55
}
]
}
],
"description": "How well is the repo equipped to be developed and maintained with AI coding agents? Carries a deliberately small weight: agent tooling is a real maintenance signal, but its absence must never gate the top of the scale (calibration saturates at raw 91, so 100/100 remains reachable with AI Readiness at zero)."
}
],
"classification": {
"labels": [
"library",
"network-service",
"web-ui"
],
"scores": {
"web-ui": 4,
"library": 8,
"network-service": 4
},
"primary": "library",
"evidence": [
{
"tier": "distribution",
"label": "library",
"source": "registry:pypi",
"weight": 6
},
{
"tier": "dependencies",
"label": "network-service",
"source": "dep:fastapi",
"weight": 4
},
{
"tier": "dependencies",
"label": "web-ui",
"source": "dep:react-dom",
"weight": 4
},
{
"tier": "description",
"label": "library",
"source": "description:library",
"weight": 2
}
],
"artifacts": [],
"confidence": "medium",
"host_extension": false,
"runs_as_process": true,
"consumed_by_code": true
},
"metrics_version": "2.3.1"
},
"warnings": [
"GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
"deps.dev does not index pypi:vibefoundry@0.4.2; advisories assessed against the repository dependency graph instead"
],
"report_type": "repository",
"generated_at": "2026-08-01T03:26:06.964687Z",
"schema_version": "0.27.0",
"badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/v/vibefoundry/vibefoundry-python-lib.svg",
"full_name": "vibefoundry/vibefoundry-python-lib",
"license_state": "absent",
"license_spdx": null
}