The world of AIs is sometimes a bit silly. In my "little program," I decided to store all conversations with AI agents in markdown format with certain specific formatting, but since there's a file sanitization process, some "html" terms are suppressed, like <think> , so I challenge the AI to write exactly <think> and it finds the challenge easy and actually generates the token, but the file is sanitized, when I ask it to reread what it wrote it starts to glitch and tries again...🤣🤣🤣
- 16084 FOLLOWERS
- 918 FOLLOWING
- MEMBER OF 36 CLUBS
I didn't expect building a disk file manager to be so complicated... but the learning experience is great, even if I deleted all the "user's" files in the process. 🤣😬
---fix(files): decouple move modal, fix conflict replacement, and enforce root directory immunity* Extract Move and Move Conflict modals from context-menu into dedicated moveModal component (static/move-modal.js + templates/components/move_modal.html)* Enforce strict root immunity (assertnotprotecteddirectory) in files.py to block deletion or renaming of knowledge, .user, .app, .agents, and workspace root* Fix query string parameter formatting in explorer-api.js (deleteFile and deleteFolder)* Fix target path construction during move conflict replacement to strictly delete the conflicting item instead of the destination folder* Slim down context-menu.js to a lightweight dropdown popover orchestrator* Document root directory immunity and decoupled modal architecture in frontend-state-ui.md, filesystem.md, and gotchas-and-pitfalls.md
I found out that it is possible to use the crypto wallet signature algorithm to create a deterministically secret, i.e. you can encrypt local files that can be opened only with your wallet signature.... or something... 😆 💡
I didn't expect building a disk file manager to be so complicated... but the learning experience is great, even if I deleted all the "user's" files in the process. 🤣😬
---fix(files): decouple move modal, fix conflict replacement, and enforce root directory immunity* Extract Move and Move Conflict modals from context-menu into dedicated moveModal component (static/move-modal.js + templates/components/move_modal.html)* Enforce strict root immunity (assertnotprotecteddirectory) in files.py to block deletion or renaming of knowledge, .user, .app, .agents, and workspace root* Fix query string parameter formatting in explorer-api.js (deleteFile and deleteFolder)* Fix target path construction during move conflict replacement to strictly delete the conflicting item instead of the destination folder* Slim down context-menu.js to a lightweight dropdown popover orchestrator* Document root directory immunity and decoupled modal architecture in frontend-state-ui.md, filesystem.md, and gotchas-and-pitfalls.md
Another step forward: a search system based on real-time database indexing that supports advanced filters—including semantic ones—and allows for user-defined vocabulary. And, like every other tool in the app, it is fully available for use by AI agents.
In fact, even resizing or hiding a panel is an action an AI agent can perform, though that is mostly for cosmetic presentation purposes 😁 or perhaps for accessibility needs 🤔
Another step forward: a search system based on real-time database indexing that supports advanced filters—including semantic ones—and allows for user-defined vocabulary. And, like every other tool in the app, it is fully available for use by AI agents.
In fact, even resizing or hiding a panel is an action an AI agent can perform, though that is mostly for cosmetic presentation purposes 😁 or perhaps for accessibility needs 🤔
Started as an MCP server.
Evolved into a LangGraph app.Now I can barely get back to building the AI agents because I keep falling in love with perfecting the OS foundation...Before an agent can think, the system must breathe: deterministic UUIDs, ontology validation, universal tool engines.A pleasantly challenging and endless loop of solidifying the bedrock. :-)
Started as an MCP server.
Evolved into a LangGraph app.Now I can barely get back to building the AI agents because I keep falling in love with perfecting the OS foundation...Before an agent can think, the system must breathe: deterministic UUIDs, ontology validation, universal tool engines.A pleasantly challenging and endless loop of solidifying the bedrock. :-)
While developing my project, I realized something: in a world with integrated AI, software needs to be AI-friendly. I decided to isolate the entire text/language layer so that if a user says "I speak Portuguese," a limited local AI can likely deliver the entire interface in the chosen language in under a minute. Or even handle preferences like "I don't like the term 'SAVE'—I prefer 'RECORD'—and I want the 'X' icon for button 'Y'"; your interface quickly adapts to exactly how you want it. The same applies to the UI theme: "I want a green theme"... and—voilà!—it's done.
While developing my project, I realized something: in a world with integrated AI, software needs to be AI-friendly. I decided to isolate the entire text/language layer so that if a user says "I speak Portuguese," a limited local AI can likely deliver the entire interface in the chosen language in under a minute. Or even handle preferences like "I don't like the term 'SAVE'—I prefer 'RECORD'—and I want the 'X' icon for button 'Y'"; your interface quickly adapts to exactly how you want it. The same applies to the UI theme: "I want a green theme"... and—voilà!—it's done.
First quick quality check and, yes, the code was rubbish...heheheh. Less crap now 😅 I'm a conscious vibe-coder 🤣---refactor(core): optimize filesystem I/O, security boundaries, and plugin execution* Refactor security.py to pure Python with SafePathError and Security-First boundary checks before disk touch* Register global SafePathError exception handler in main.py returning HTTP 403* Refactor filesystem.py to use os.scandir kernel enumeration and prune runtime noise (.venv, .git)* Add fast-path string check in find_backlinks before executing regex parsers* Support compound file extensions (.tar.gz, .d.ts) and 2-second mtime stat throttling in file_types.py* Make ToolsRegistry.execute_tool thread-safe with parameter binding and async def run() support* Add signature-based keyword argument filtering against LLM parameter hallucinations* Optimize config.py path resolution and convert ALLOWED_TAGS to immutable frozenset* Update backend API, tools, and gotchas documentation
For those who find the UX ugly and boring... Feel free and create your own UX. 🤣feat(api): implement Headless Dual-Mode engine via @html_template decorator* Create app/core/decorators.py with @html_template decorator and wants_json content negotiation helper* Convert route handlers in explorer, files, render, threads, and chat routers to return pure data dicts* Return JSONResponse for Headless clients (?format=json or Accept: application/json)* Render Jinja2 TemplateResponse for HTMX Web UI requests with zero regressions* Update backend API documentation and pitfall solutions
For those who find the UX ugly and boring... Feel free and create your own UX. 🤣feat(api): implement Headless Dual-Mode engine via @html_template decorator* Create app/core/decorators.py with @html_template decorator and wants_json content negotiation helper* Convert route handlers in explorer, files, render, threads, and chat routers to return pure data dicts* Return JSONResponse for Headless clients (?format=json or Accept: application/json)* Render Jinja2 TemplateResponse for HTMX Web UI requests with zero regressions* Update backend API documentation and pitfall solutions
A few more steps 😁---feat(tools): migrate native scripts to self-contained Plugin System v1.0.0* Define USERDATADIR (.user/data/) in config.py for writable plugin
storage* Create official JSON Schema file .app/schemas/plugin.1.0.0.json* Refactor ToolsRegistry to discover folder-based plugins with plugin.json manifests* Inject PLUGINROOT and PLUGINDATA paths into plugin execution context* Convert built-in system tools (readvaultfile, listvaultdirectory, getcontextrules, find_backlinks) to self contained plugin folders* Maintain 100% backwards compatibility for legacy flat .py scriptsfeat(threads): implement atomic Markdown chat persistence and Thread Spaces engine* Add SYSTEMTHREADSDIR (.app/settings/threads/) and USERTHREADSDIR (.user/threads/)* Implement additive space discovery with factory default fallbacks (General and Kith OS spaces)* Implement atomic 2-step Markdown turn persistence in chatservice and threadspaces* Record attached context files (CONTEXTFILES) and tool execution metadata (TOOLSUSED) per turn* Add REST endpoints to list, create, update spaces and load/render saved .md threads* Update system documentation across core specsfeat: backend infrastructure for Threads Spacesfeat: initial UI structure to accommodate thread spaces
A few more steps 😁---feat(tools): migrate native scripts to self-contained Plugin System v1.0.0* Define USERDATADIR (.user/data/) in config.py for writable plugin
storage* Create official JSON Schema file .app/schemas/plugin.1.0.0.json* Refactor ToolsRegistry to discover folder-based plugins with plugin.json manifests* Inject PLUGINROOT and PLUGINDATA paths into plugin execution context* Convert built-in system tools (readvaultfile, listvaultdirectory, getcontextrules, find_backlinks) to self contained plugin folders* Maintain 100% backwards compatibility for legacy flat .py scriptsfeat(threads): implement atomic Markdown chat persistence and Thread Spaces engine* Add SYSTEMTHREADSDIR (.app/settings/threads/) and USERTHREADSDIR (.user/threads/)* Implement additive space discovery with factory default fallbacks (General and Kith OS spaces)* Implement atomic 2-step Markdown turn persistence in chatservice and threadspaces* Record attached context files (CONTEXTFILES) and tool execution metadata (TOOLSUSED) per turn* Add REST endpoints to list, create, update spaces and load/render saved .md threads* Update system documentation across core specsfeat: backend infrastructure for Threads Spacesfeat: initial UI structure to accommodate thread spaces
Criando... :-)