{
  "source_file": "0930",
  "source_platform": "Ghost",
  "author": "Peng Qian / Data Leads Future",
  "title_listed": "How I Use OpenCode, Oh-My-OpenCode-Slim, and OpenSpec to Build My Own AI Coding Environment",
  "keywords": "",
  "domain": "大模型算法",
  "content_type": "工程实践",
  "is_paid_flag": "否",
  "url": "https://www.dataleadsfuture.com/how-i-use-opencode-oh-my-opencode-slim-and-openspec-to-build-my-own-ai-coding-environment/",
  "publish_date": "2026-04",
  "corpus_stage": "",
  "notes": "",
  "id": "9c0ecf8916e4",
  "collected_at": "2026-10-02T12:26:44",
  "title": "How I Use OpenCode, Oh-My-OpenCode-Slim, and OpenSpec to Build My Own AI Coding Environment",
  "body_markdown": "Harness Engineering\nHow I Use OpenCode, Oh-My-OpenCode-Slim, and OpenSpec to Build My Own AI Coding Environment\nRide the wave of AI coding, don't get swept away by it\nPeng Qian\n15 Apr 2026\n—\n23 min read\nShare\nHow I Use OpenCode, Oh-My-OpenCode-Slim, and OpenSpec to Build My Own AI Coding Environment. Image by DALL-E-3\nThis article was last updated on July 23, 2026.\nIntroduction\nI have never used Claude Code. The reason is simple. Claude Code is too expensive. Even with a subscription, the cost-to-value ratio does not work for my research.\nSo I have been building my own AI coding environment using OpenCode as the foundation, combined with\nOh-My-OpenCode-Slim\n(multi-agent orchestration) and\nOpenSpec (SDD)\n.\nMy take is this: if you understand what you want to build, and you know how to use coding tools properly, especially with well-written Spec files as constraints, frontier open-source models like\nQwen3.6-Plus\n,\nKimi-k2.5\n, and\nGLM-5\ncan handle your daily coding tasks just fine.\nThere is another huge advantage to open-source software: community power. The community can tune system prompts and model parameters to fit different models well, and get the most out of open-source models.\nIn this article, I want to share what I have learned from using OpenCode and its surrounding tools.\nI will skip the generic tutorials you find everywhere online and focus only on the details I think actually matter.\nI hope this helps you make better choices.\nTool Installation and Environment Setup\nI will cover my experience in two parts: installing and configuring OpenCode and its related plugins, and my AI coding workflow.\nLet's start with tool installation and environment setup, beginning with OpenCode itself.\nInstalling OpenCode\nUnlike most coding agents that only offer a TUI-based command-line tool, OpenCode also comes with a desktop app with a graphical interface. I use the desktop app for my daily coding work. It is clearly much more efficient than the TUI version.\nThat said, you still need to install the command-line program first. From my testing, some plugins need a command-line environment to check whether OpenCode is installed on your machine during project initialization.\nWhy does the installation fail\nOpenCode relies on\nbun\nas its only runtime. But in a lot of workplace environments, restrictions can prevent\nbun\nfrom being installed automatically. In that case, you just need to install\nbun\nmanually:\nnpm install -g bun\nConfiguring OpenCode\nAfter installing OpenCode Desktop, open the app. Once you select your project directory, you will land on the main OpenCode interface. The features are fairly intuitive, so I will not walk through each one. But before you type your first\nHello World\n, you should check your terminal configuration first.\nConfiguring the terminal\nI use Windows 11. On Windows, OpenCode Desktop defaults to PowerShell as its terminal. Many companies, though, do not allow PowerShell. If you are in a non-English locale, OpenCode may run into character encoding issues when running shell commands through PowerShell, causing those commands to fail.\nIn that case, you need to change your default terminal.\nOpenCode uses the\nSHELL\nenvironment variable to determine which terminal to use. You can configure Windows Command Prompt (\ncmd.exe\n), WSL, or\ngit bash\n. Personally, I prefer\ncmd.exe\nbecause I had already installed a lot of CLI tools before setting up OpenCode. Using\ncmd.exe\ndirectly saves me from reinstalling everything.\nSET SHELL=\"%windir%\\system32\\cmd.exe\"\nConfiguring model providers\nNext, let's talk about how to configure model providers.\nOpen the settings window and select \"Providers\". You will see a list of the most popular model providers and API relays. If you want to use open-source models, though, they probably will not be on that list.\nAt that point, you might click \"Custom provider\" and manually fill in the\nmodel id\n,\nbase url\n,\napi key\n, and so on. The problem is that OpenCode then has no idea about your model's context window size or pricing, which causes features like automatic context compression to stop working correctly.\nThe right approach is to click the \"Show more providers\" link at the bottom, find the provider you want to add, and enter that provider's\napi key\n.\nClick the show more providers link and pick a provider for your open-source model. Image by Author\nOnce configured, all models from that provider will appear in the model list. These models come with metadata like context size and pricing, so context management plugins can work correctly.\nBy setting up your provider correctly, you'll get all kinds of metadata about your models. Image by Author\nThe downside is that you cannot directly see your provider ID this way, which makes it tricky to configure\nOh-My-OpenCode-Slim\nlater.\nNo worries. OpenCode already saved your provider configuration when you selected your provider. You can find it at\n~/.local/share/opencode/auth.json\n. Your provider ID and API key are both there.\nYou can find your provider ID in the\nauth.json\nfile. Image by Author\nEnable workspaces\nThe biggest difference between AI coding and traditional coding is that while you wait for the AI to work, you can actually work on another requirement at the same time. If you use git for version control, you would normally need to create a separate directory and check out a new branch.\nOr you can use git's worktree feature to create a new worktree on top of your current branch. When you are doing parallel development, using worktrees is much more convenient than creating new branches.\nCompared to OpenCode CLI, the desktop app has a clear advantage here: it natively supports the worktree feature. In OpenCode Desktop, this feature is called \"workspace\".\nThe way to open a workspace is a bit hidden. Right-click the project icon in the top-left corner of the window, then select \"Enable Workspace\" from the menu. From there, you can create multiple workspaces in the conversation list and work on them simultaneously. The corresponding branches and code directories will be created automatically.\nRight-click on your project to enable the workspace. Image by Author\nWhen the coding work in a workspace is done, you can ask the AI to submit a PR for the current code, then close the workspace. The branch and code directory that were created for it will be cleaned up automatically. Very convenient.\nChoosing the right agent\nIf you want to use OpenCode without any extra plugins, pay attention to how you use agents.\nOpenCode has two types of agents: primary agents, which you choose yourself, and sub-agents, which the primary agent calls on its own when needed.\nWithout any plugins installed, OpenCode only provides two primary agents:\nBuild\nand\nPlan\n: The\nBuild\nagent has full tool access and is the default choice. The\nPlan\nagent has no editing permissions. Its job is to ask you clarifying questions when you describe a requirement, and eventually produce an execution plan.\nWhen you first try this, you might go straight to the\nBuild\nagent. But for complex tasks,\nBuild\ntends to just start coding based on its own interpretation. That is like looking through a straw. It fixes things locally without thinking through the overall architecture and design patterns.\nThe right approach is to start every new requirement with the\nPlan\nagent for requirement clarification, and get a solid execution plan first. Only then should you hand things off to\nBuild\nto start development.\nBut even that is not enough. Model context is limited. As coding progresses, the execution plan from earlier in the conversation can get pushed out of the context window.\nA better approach is to ask\nBuild\nto save the execution plan as a Markdown file before starting to code. Review that file, confirm everything looks good, then start a fresh session and have\nBuild\nload the execution plan document back in before executing.\nThe Plan agent generates a tasks file, and the Build agent executes them. Image by Author\nOnce you start working this way, you will feel how much value comes from planning before executing. It also sets you up well for SDD coding later, which I will cover when we get to OpenSpec.\nAlways start a new session\nI just mentioned that after forming a development plan, you should create a new session before continuing with coding. Why?\nBecause anyone familiar with LLMs knows that even though context windows are long today, and OpenCode does offer context compression, context rot is still a real problem. LLMs pay more attention to the beginning and end of the context window, and less to the middle. I call this positional bias.\nSo to make sure the LLM follows instructions accurately based on the conversation context, especially after forming an execution plan where you need precise execution, start a new session after each major milestone. Do not keep working in the same session forever.\nEnable the Plan Agent's Planning Workflow Mode\nBy default, the\nPlan\nagent runs in a pure read-only analysis mode. In this mode, it just has a back-and-forth with you about requirements and how to implement them through heuristic reasoning, but it can't edit any files.\nThis creates a real problem: everything discussed in\nPlan\nmode gets scattered across the current session's chat history. Over time, the context starts to rot, and once you switch to a new session, all that discussion is just gone.\nAs spec-driven development has proven its value, starting from v1.15.0, OpenCode introduced an experimental planning workflow mode for the\nPlan\nagent. This workflow follows 5 phases:\nExplore. When a new task comes in, the\nPlan\nagent spins up to 3\nexplore\nagents in parallel to analyze the codebase. (I'd recommend configuring the\nexplore\nagents with the\ndeepseek-v4-flash\nmodel here, otherwise the token costs can get pretty painful.)\nDesign. Once the codebase is understood,\nPlan\ncalls a general sub-agent to design the development approach.\nReview.\nPlan\nagent checks the development plan against your original task intent to make sure it actually holds up.\nWrite the plan file. The final plan gets written to a\n.md\nfile. This is the only file type the\nPlan\nagent is allowed to write to.\nExit Plan mode. It calls the\nplan_exit\ntool and lets you know it's time to leave\nPlan\nmode and start writing actual code.\nPlanning workflow mode sequence diagram. Image by Author\nWhere\nPlan\nagent stores its plan files:\nWhen a\ngit\nrepo is present:\n<project_dir>/.opencode/plans/<timestamp>-<slug>.md\nWhen there's no\ngit\nrepo:\n~/.local/share/opencode/plans/<timestamp>-<slug>.md\nTo enable the planning workflow mode for the\nPlan\nagent, set the following environment variable:\nSET OPENCODE_EXPERIMENTAL_PLAN_MODE=true\nIf you want a quick taste of OpenCode's native SDD development experience, just flip this environment variable on. No extra plugins needed.\nBut if you're looking to use SDD for production-level AI Coding, I'd suggest checking out the OpenSpec configuration covered later in this article, paired with the\nReflection SDD workflow\nI put together, to get truly top-tier development quality.\nFollow Data Leads Future\nOne practical story every month, sharing my hard-learned experiences in the enterprise AI space.\nSubscribe\nEmail sent! Check your inbox to complete your signup.\nNo spam, No ads, you can unsubscribe anytime.\nDo not forget to create\nAGENTS.md\nThe\nAGENTS.md\nfile is called \"rules\" in OpenCode. You can create it automatically with the\n/init\ncommand. It tells the LLM what rules to follow during coding.\nYou may ask: if this file is created by the LLM, does that not mean the LLM already knows all these rules internally? Is saving them to a file redundant?\nNot at all.\nAGENTS.md\nis a file written specifically for the LLM to read. In my view, it serves three important purposes:\nFirst,\nAGENTS.md\nacts as long-term memory for the project. It locks in facts and choices. For example, after asking the LLM to set up the project structure or create a new module, run\n/init\nonce. The project architecture gets locked into\nAGENTS.md\n. Without this, the LLM will scan the entire project from scratch every time you start a new session, wasting a huge number of tokens.\nAnother example: if you use\nuv\nto manage your project and use\nuv sync --prerelease=allow\nto sync prerelease dependencies, write that clearly in\nAGENTS.md\n. This prevents the LLM from making errors with dependency management.\nSecond,\nAGENTS.md\nnarrows the probability distribution and reduces hallucinations. LLMs are probability models. When facing a question, an LLM generates several possible answers with associated probabilities, then picks one based on the\ntemperature\nparameter.\nFor example, when a method parameter can accept multiple types, the LLM might consider these options:\nUse\nOptional[int]\n(40% chance)\nUse\nint | None\n(40% chance)\nUse no type annotation at all (20% chance)\nAt that point, the LLM will randomly pick\nOptional[int]\nor\nint | None\n.\nBut once you explicitly require\nstr | None\nsyntax in\nAGENTS.md\n, the probability distribution shifts to:\nUse\nint | None\n(100% chance)\nUse\nOptional[int]\n(0% chance)\nAt this point, the LLM will just go ahead and pick\nint | None\nas the final answer.\nThird,\nAGENTS.md\nserves a harness engineering purpose. You can give the LLM direct instructions through\nAGENTS.md\nthat it must follow. For example, you can tell the LLM to communicate with you in Chinese, or require that during the spec-driven process, it cannot create new proposals without your approval.\nImprove the success rate of Skills loading\nBy now, most people in the AI coding space have heard of Skills. But many find that Skills do not load reliably under normal conditions.\nThere are two reasons for this. On one hand, the\ndescription\nin a Skill's front matter is often unclear. We need to write the front matter carefully, especially the\ndescription\npart. It should clearly explain when the Skill applies and what it provides, so the LLM can load the right Skill for the situation.\nOn the other hand, for common coding scenarios, LLMs have learned so much during pretraining that they do not feel the need to load a Skill for extra guidance.\nFor this, there is a simple and proven fix. Just add this line to\nAGENTS.md\n:\nPrioritize retrieval-led reasoning over pretrained-knowledge-led reasoning.\nThat is all. After receiving this instruction, the LLM will load the relevant Skill for a given coding scenario instead of falling back on its internal pretrained knowledge. From my testing, the Skill loading success rate jumps from around 60% to 90%.\nOn top of that, with this instruction in place, the LLM will use tools like\nglob/grep\nto check existing code structure before starting, and will use\nwebsearch\nmore often to look things up online. It follows a \"search first, verify after\" approach instead of relying on its own instincts. Definitely worth trying.\nInstalling and Configuring Oh-My-OpenCode-Slim\nNow that we have covered the key details of OpenCode itself, let's move on to\nOh-My-OpenCode-Slim\n.\nOh-My-OpenCode-Slim\nis a multi-agent orchestration plugin. It provides six types of agents, each focused on a specific coding scenario.\nAgent\nScenario\nOrchestrator\nCoordinates other agents to complete tasks together.\nExplorer\nExplores the project codebase to understand what has been done.\nOracle\nFixes complex bugs or provides architecture-level advice.\nLibrarian\nSearches GitHub repositories and framework API documentation online.\nDesigner\nUI design and user experience.\nFixer\nHandles coding work in parallel.\nYou might ask: why\nOh-My-OpenCode-Slim\ninstead of\nOh-My-OpenCode\n? Because at this stage of AI coding, multi-agent orchestration workflows have become too heavy and less important than they used to be.\nA lightweight multi-agent plugin like\nOh-My-OpenCode-Slim\nfits much better here. Each agent's\nsystem prompt\nis concise. The main value comes from the efficiency of parallel execution across agents, and the context isolation that sub-agents provide, which helps the primary agent stay focused. It does not add much to your token costs.\nInstalling the plugin\nLet's start with what to watch out for when installing\nOh-My-OpenCode-Slim\n.\nEven if you use OpenCode Desktop, you need to install OpenCode CLI first. Otherwise, the installation of\nOh-My-OpenCode-Slim\nwill fail. This is because\nOh-My-OpenCode-Slim\nchecks for the OpenCode CLI to determine whether OpenCode is installed on your machine.\nDue to a series of recent npm package poisoning incidents, OpenCode removed the feature that auto-installs plugins through\nopencode.json\nconfiguration. You now need to install the latest version of\nOh-My-OpenCode-Slim\nusing this command:\nbunx oh-my-opencode-slim@latest install --no-tui --tmux=yes --skills=yes\nThis command installs the\nOh-My-OpenCode-Slim\nagents and also installs two Skills:\nsimplify\nand\nagent-browser\n. The former simplifies and cleans up unnecessary code. The latter helps agents inspect the frontend page styling.\nYou will also notice that in the\nopencode.json\nconfig file, the\nOh-My-OpenCode-Slim\nplugin points to a local entry file instead of an npm package. So for future updates, you will need to update it manually.\nConfiguring the plugin\nNow let's talk about provider config. The official documentation covers this in reasonable detail, so just follow the configuration for your model.\nIf you configured your model through the provider list, you cannot directly see the Provider ID. No worries. As I mentioned earlier,\n~/.local/share/opencode/auth.json\nstores all the providers you have configured, including the provider IDs.\n{\n  \"preset\": \"kimi\",\n  \"presets\": {\n    \"kimi\": {\n      \"orchestrator\": {\"model\": \"kimi-for-coding/k3-256k\", \"skills\": [\"*\"], \"mcps\": [\"*\"]},\n      \"oracle\": {\"model\": \"kimi-for-coding/k3\", \"variant\": \"max\", \"skills\": [\"simplify\"], \"mcps\": []},\n      \"librarian\": {\"model\": \"kimi-for-coding/k3-256k\", \"variant\": \"low\", \"skills\": [], \"mcps\": [\"websearch\",\"context7\",\"grep_app\"]},\n      \"explorer\": {\"model\": \"kimi-for-coding/k3-256k\", \"variant\": \"low\", \"skills\": [], \"mcps\": []},\n      \"designer\": {\"model\": \"kimi-for-coding/k3-256k\", \"variant\": \"high\", \"skills\": [\"agent-browser\"], \"mcps\": []},\n      \"fixer\": { \"model\": \"kimi-for-coding/k3-256k\", \"variant\": \"low\", \"skills\": [], \"mcps\": []}\n    }\n  }\n}\nAfter configuring, remember to run\nopencode auth login\n. Even if you already filled in your\nAPI KEY\nthrough the provider list earlier, the agents will not connect properly unless you run this CLI command.\nTrying out the Council feature\nOh-My-OpenCode-Slim\nintroduced a\nCouncil\nagent in its latest version. More accurately,\nCouncil\nis a collection of agents. It sends the same task to several different agents that make up the\nCouncil\n, calculates a confidence interval from their responses, and synthesizes a final answer.\nIt is a bit like ensemble learning in machine learning. \"Two heads are better than one,\" and by using this parliamentary discussion approach, even a few different open-source models working together can match or even exceed the capability of\nOpus 4.6\n. This makes it a great fit for solving complex architecture design problems or tracking down tricky bugs.\nCouncil\nconfiguration is straightforward. Just follow the official example. For best results, pick a few different agents as\nCouncil\nmembers to make the most of the ensemble learning approach:\n{\n  \"council\": {\n    \"master\": { \"model\": \"alibaba-cn/glm-5\" },\n    \"presets\": {\n      \"default\": {\n        \"alpha\":  { \"model\": \"kimi-for-coding/k2p6\" },\n        \"beta\": { \"model\": \"alibaba-cn/qwen3.6-plus\" },\n        \"gamma\": { \"model\": \"alibaba-cn/MiniMax-M2.5\" }\n      }\n    }\n  }\n}\nOpenCode's UI was not designed for this parliamentary-style interaction, so the\nCouncil\ndiscussion process is not very transparent. If something goes wrong in the configuration, you cannot tell from the interface. We need a way to debug\nCouncil\n.\nThe method is simple. Since\nCouncil\nitself is a primary agent you can select from the agent list, just select\nCouncil\n, then type \"test Council connectivity\" in the chat. OpenCode will send a test task to each\nCouncil\nmember and list the results from each one in detail. Very handy.\nOnce you've got Council set up, you can test the connectivity of each sub-agent. Image by Author\nYou can use this same approach to test other OpenCode features. For example, type \"test\ncontext7\navailability\" or \"test\nOracle\nagent connectivity.\"\nWhy isn't your LSP tool working anymore?\nIn the earlier versions, the omo-slim agent used to run a tool called\nlsp_diagnostics\nafter writing or editing code to check for syntax issues, making sure there were no unused imports or dead code and stuff like that.\nI really liked that tool, it was pretty handy.\nBut after the latest omo-slim plugin update, you might notice the agent no longer calls\nlsp_diagnostics\nto check the code.\nThat's because the old omo-slim used its own built-in LSP tool, while the new omo-slim is going to use the LSP tool provided by opencode. However, opencode has the LSP tool disabled by default, since the author thinks it uses up too much memory and doesn't really pay off in most situations.\nIf you still want the agent to use\nlsp_diagnostics\n, you can manually add the\n\"lsp\": true\nsetting in the opencode.json config file, and that'll turn it back on.\nAlso, opencode offers other LSP tools like\ngoToDefinition\n,\nfindReferences\n,\nhover\n,\nworkspaceSymbol\n,\ngoToImplementation\n, and so on, which are useful for code searching and debugging. You can enable them by setting the environment variable\nOPENCODE_EXPERIMENTAL_LSP_TOOL = true\nand give them a try.\nBut even with those tools enabled, the agent will still prefer using\ngrep\nfor text based code searches. That's because the LLM was trained on data that heavily uses\ngrep\nduring the pretraining phase. So from my own testing, turning on the LSP tools didn't make a big difference.\nOpenSpec and SDD\nFinally, let's look at another key piece of the AI coding puzzle: the\nOpenSpec\nplugin and the SDD coding workflow.\nWhy do we need SDD? The reason is pretty simple.\nA lot of articles that benchmark model coding ability use prompts like \"build a 3D web demo from this one-sentence description,\" then compare results and conclude that open-source LLMs still have a long way to go.\nBut is that really true? Think back to how software development worked before AI coding. Before writing a single line of code, did we not always ask the business side for detailed requirements, write design documents, plan the coding schedule and testing plan, and only then start writing code?\nSo why would anyone think you can skip the documentation phase when asking an AI to write code?\nThink things through with the docs first, then roll up your sleeves and get to work. Image by Author\nThe ability to write coding specs that make an LLM work with precision is one of the golden standards for evaluating a programmer's skills in the AI era.\nNo need to stress about it, though. There are plenty of AI tools today that help you do SDD development.\nSuperpowers\n,\nBMAD\n, and\nOpenSpec\nare among the best.\nCompared to\nSuperpowers\nor\nBMAD\n,\nOpenSpec\nis much lighter. For most everyday projects,\nOpenSpec\nis more than enough to get the job done. Let's look at how to install and configure it.\nEven though we use OpenCode and\nOpenSpec\ntogether,\nOpenSpec\nis not a plugin for OpenCode. It is a completely independent tool.\nConfiguring the workflow\nThe default\nOpenSpec\nworkflow has three phases:\nopsx-propose\n,\nopsx-apply\n, and\nopsx-archive\n. These correspond to creating a proposal, implementing the proposal, and archiving the proposal.\nJust like I recommended using the\nPlan\nagent to plan things out before implementing any changes, I also want you to have a thorough discussion with the AI about your requirements before creating a proposal. Make sure both you and the AI clearly understand what you want to build.\nSince\nOpenSpec\ndoes not have the concept of agents, the responsibility for requirement clarification falls on a command called\nopsx-explorer\n.\nCompared to the\nPlan\nagent, the\nopsx-explorer\ncommand uses a Skill to strengthen the ability to guide users through their requirements in an exploratory way, helping them think things through more completely.\nopsx-explorer\nis also great at using charts to compare the pros and cons of different implementation options, making decisions easier for the user.\nopsx-explorer\nis not included in the default workflow, so you need to configure\nOpenSpec\nto add it. After installing\nOpenSpec\n, run\nopenspec config profile\nin the command line, then select\nWorkflows only\nin the configuration screen, as shown below:\nYou just need to set up the Workflow, that's it. Image by Author\nUse the spacebar to select\nExplorer ideas\nand\nVerify change\n. These correspond to\nopsx-explorer\nand\nopsx-verify\n. Then press\nEnter\nto confirm.\nJust use the Space key to select the workflow nodes you like. Image by Author\nAfter configuration, go to your project root directory and run\nopenspec init\nto set up a new\nOpenSpec\nenvironment, or run\nopenspec update\nto update an existing\nOpenSpec\nconfiguration.\nI will walk through the full\nOpenSpec\ndevelopment workflow in the next section.\nConfiguring multi-language support\nIf you try creating rule files with\nOpenSpec\n, you will notice they are written in English by default. That is inconvenient for non-English users. So we need to configure\nOpenSpec\nto write files in a specific language.\nA simple approach is to add a language instruction directly in\nAGENTS.md\n, but that causes a problem.\nspec.md\nfiles use a lot of English keywords. If you tell\nOpenSpec\nto use another language, those keywords get translated too, and the LLM can no longer follow the spec constraints correctly.\nThe right approach is to configure the language in the\nconfig.yaml\nfile inside the\nOpenSpec\ndirectory:\nschema: spec-driven\ncontext: |\n  Language: Chinese\n  Write in Chinese, but:\n  - Keep technical terms like \"API\", \"REST\", \"GraphQL\" in English\n  - Code examples and file paths remain in English\n  \n  Tech stack: Python 3.13\n  \n  Rules:\n    proposal:\n       - Keep proposals under 1500 words\n       - Always include a \"Non-goals\" section\n    \n    tasks:\n       - Break tasks into chunks of max 2 hours\nBesides language, you can also configure other settings here, such as your tech stack and specific requirements for\nproposal.md\nand\ntasks.md\nfiles.\nChoosing the right agent\nSince\nOpenSpec\nneeds to write spec-related files, the agent must have file editing permissions. If you use the original\nOpenCode\ntools, you should go with the\nBuild\nagent, since the\nPlan\nagent has no editing capability.\nIn this tutorial, though, we have integrated the multi-agent orchestration from\nOh-My-OpenCode-Slim\n. So you should use the\nOrchestrator\nagent. Beyond basic editing, the\nOrchestrator\ncan call\nExplorer\nand\nLibrarian\nagents during the planning phase to analyze project structure and search API documentation. During execution,\nOrchestrator\ncan also call multiple\nFixer\nagents to work in parallel, which speeds up development significantly.\nFrom now on, just default to the\nOrchestrator\nagent. It will call other agents when it needs to.\nDaily OpenCode Development Workflow\nNow that we have covered installation and configuration, let me walk you through my daily\nOpenCode\nworkflow using\nOpenCode\n,\nOh-My-OpenCode-Slim\n, and\nOpenSpec\ntogether.\nProject Initialization\nUnlike traditional coding workflows, the development process in the AI era should center on building for AI. All configuration and documentation should be written in a way that AI can understand and follow. The AI then translates human ideas into code. Let me walk you through this from project initialization.\nAfter creating the project, first run\ngit init\nin the project root directory. If the project has a remote repository, remember to link it with\ngit remote add\n. At that point, you can start using OpenCode's code review and workspace (worktree) features.\nNext, if your project is a Python project, use\nuv init\nto initialize dependencies and project structure. If needed, also add lint and code review tools with\nuv add --dev ruff\nand\nuv add --dev mypy\n.\nThis gives the LLM a clear anchor for understanding the project.\npyproject.toml\nis the standardized build protocol introduced by\nPEP 518\n, and most build tools use this file. Without running\nuv init\nupfront to establish a basic project structure, the LLM will randomly pick\npip\n,\npoetry\n, or something else. Fixing that later is a pain.\nNext, initialize the\nOpenSpec\nplugin. Still in the project root, run\nopenspec init\n. In the command-line interface that appears, select the\nOpenCode\nagent and press Enter.\nFinally, go into the\nopenspec\ndirectory and edit\nconfig.yaml\nto add your rules, as described earlier.\nOnce everything is configured, run the\n/init\ncommand and ask OpenCode to generate the\nAGENTS.md\nfile to lock in all these configuration choices.\nThe Development Workflow\nWith the project initialized, you can now move into the actual development flow.\nAs I described earlier, you should have already configured the\nOpenSpec\nworkflow using\nopenspec config profile\nand selected\nopsx-explorer\nand\nopsx-verify\n.\nSo the best way to start is to open a new session and begin with\n/opsx-explorer\n. No matter how clear your idea feels, use\n/opsx-explorer\nto flesh it out, fill in the details, and help the AI clear up any questions.\nI know you want to just tell the AI to build a Facebook. But I recommend starting small, one small requirement at a time.\nFor example: \"I want to build a budgeting app. For step one, let's start by setting up the project structure and adding dependencies.\" This keeps things focused. The AI completes a small amount of work at a time, which avoids context limitations,  causing the AI to go off track after a long run.\nOnce the requirement discussion is mostly done, run\n/opsx-propose\nto create a proposal. This locks down the discussion and development plan as spec documents.\nOpenSpec\nwill break things down into one or more changes based on complexity, then generate\nproposal.md\n,\ndesign.md\n, and\ntasks.md\n.\nReview these three files carefully. The LLM-generated tasks might have gaps or misunderstandings. If you find errors, you have two options:\nTalk to the LLM, add details, and ask\nOpenSpec\nto regenerate the documents.\nOr edit the rule files directly, then ask\nOpenSpec\nto regenerate the documents.\nOnce the documents look good, I strongly recommend starting a new session with a fresh context. Then run\n/opsx-apply\nto enter the implementation phase.\nThe agent will load the spec documents from the previous session and start coding. With\nOh-My-OpenCode-Slim\n's multi-agent system and various Skills helping out, this process mostly runs on autopilot. Go grab a coffee or read another one of my articles while you wait.\nAfter coding is done,\nOpenSpec\nwill prompt you to run\n/opsx-archive\nto archive the proposal. But before archiving, I recommend switching to a different model. For example, if you were using\nkimi k2.5\n, switch to\nGLM-5\n, then run\n/opsx-verify\nto verify that all tasks were completed. You can also run\n/review\nor\n/simplify\nto review and clean up the code and make sure the project quality is solid.\nA typical SSD development cycle. Image by Author\nFinally, run\n/opsx-archive\nto archive the changes. One standard AI development cycle is now complete. When the next new requirement arrives, start fresh with a new session and\n/opsx-explorer\n.\nConclusion\nIn this tutorial, I covered how to use OpenCode, Oh-My-OpenCode-Slim, and OpenSpec to build your own AI coding workflow.\nWith this open-source combination, paired with the latest open-source models, you can get coding performance that rivals top-tier models, at a much better price.\nThis tutorial draws from my real-world experience. It focuses on the practical details of AI coding with OpenCode and walks through each step of the SDD-based development cycle. By the end of this tutorial, you should have a solid edge in the AI coding space.\nDue to space and my own limitations, I could not cover every detail. I am still working on improving this article. If anything is unclear as you read through it, leave me a comment, and I will get back to you as soon as I can.\nThanks for subscribing. Feel free to share this article with your friends. You never know who it might help.\nFollow Data Leads Future\nOne practical story every month, sharing my hard-learned experiences in the enterprise AI space.\nSubscribe\nEmail sent! Check your inbox to complete your signup.\nNo spam, No ads, you can unsubscribe anytime.\nFurther reading\nReflection SDD: Use a Reflection Harness to Level Up Your OpenSpec Workflow\nStop letting bad spec files tank your code quality\nData Leads Future\nPeng Qian\nDeepSeek-V4 Can’t Read Images? I Made It Read\nDon’t wait for a multimodal model, you can use it now\nData Leads Future\nPeng Qian\nNo Plugins Needed, I Built a Fully Automated Coding Loop in OpenCode\nUsing DeepSeek-V4 for low-cost Loop Engineering\nData Leads Future\nPeng Qian\nHow I Cut Kimi K3 Costs in OpenCode\nBetter code quality, but spend less money\nData Leads Future\nPeng Qian\nFrom OpenSpec to AIDLC: How I Improved My Team’s AI Code Quality\nNo new commands to learn, just pick it up and use it\nData Leads Future\nPeng Qian",
  "metadata": {
    "title": "How I Use OpenCode, Oh-My-OpenCode-Slim, and OpenSpec to Build My Own AI Coding Environment",
    "description": "Build your own AI coding environment with OpenCode, Oh-My-OpenCode-Slim, and OpenSpec. Learn practical tips on vibe coding and SDD workflows using open-source coding agents.",
    "keywords": null,
    "author": null,
    "og:site_name": "Data Leads Future",
    "og:type": "article",
    "og:title": "How I Use OpenCode, Oh-My-OpenCode-Slim, and OpenSpec to Build My Own AI Coding Environment",
    "og:description": "Ride the wave of AI coding, don't get swept away by it",
    "og:url": "https://www.dataleadsfuture.com/how-i-use-opencode-oh-my-opencode-slim-and-openspec-to-build-my-own-ai-coding-environment/",
    "og:image": "https://storage.ghost.io/c/33/67/33678c00-2c15-4961-93e9-497b427e2006/content/images/size/w1200/2026/04/opencode_cover_3-1.webp",
    "og:image:width": "1200",
    "og:image:height": "686",
    "twitter:card": "summary_large_image",
    "twitter:title": "How I Use OpenCode, Oh-My-OpenCode-Slim, and OpenSpec to Build My Own AI Coding Environment",
    "twitter:description": "Ride the wave of AI coding, don't get swept away by it",
    "twitter:url": "https://www.dataleadsfuture.com/how-i-use-opencode-oh-my-opencode-slim-and-openspec-to-build-my-own-ai-coding-environment/",
    "twitter:image": "https://storage.ghost.io/c/33/67/33678c00-2c15-4961-93e9-497b427e2006/content/images/size/w1200/2026/04/opencode_cover_3-1.webp",
    "twitter:label1": "Written by",
    "twitter:data1": "Peng Qian",
    "twitter:label2": "Filed under",
    "twitter:data2": "Harness Engineering, Career Growth, Generative AI",
    "twitter:site": "@qtalen",
    "twitter:creator": "@qtalen",
    "article:published_time": "2026-04-15T11:34:05.000Z",
    "article:modified_time": "2026-09-01T12:22:55.000Z",
    "article:tag": "Generative AI"
  },
  "paywall": {
    "listed_paid": false,
    "detected": false,
    "marker": "",
    "public_only": false,
    "policy": "付费/会员内容只保留页面公开可见部分，不绕过付费墙"
  },
  "crawl": {
    "success": true,
    "status_code": 200,
    "error": ""
  },
  "code_blocks": [
    {
      "file": "attachments/9c0ecf8916e4/code/body-000.txt",
      "chars": 18,
      "language": "text"
    },
    {
      "file": "attachments/9c0ecf8916e4/code/body-001.txt",
      "chars": 37,
      "language": "text"
    },
    {
      "file": "attachments/9c0ecf8916e4/code/body-002.txt",
      "chars": 40,
      "language": "text"
    },
    {
      "file": "attachments/9c0ecf8916e4/code/body-003.txt",
      "chars": 72,
      "language": "text"
    },
    {
      "file": "attachments/9c0ecf8916e4/code/body-004.txt",
      "chars": 704,
      "language": "text"
    },
    {
      "file": "attachments/9c0ecf8916e4/code/body-005.txt",
      "chars": 286,
      "language": "text"
    },
    {
      "file": "attachments/9c0ecf8916e4/code/body-006.txt",
      "chars": 398,
      "language": "text"
    }
  ],
  "images": [
    {
      "status": "ok",
      "url": "https://storage.ghost.io/c/33/67/33678c00-2c15-4961-93e9-497b427e2006/content/images/size/w1200/2026/04/opencode_cover_3-1.webp",
      "bytes": 118782,
      "reused": true,
      "local_path": "attachments/9c0ecf8916e4/images/000.webp",
      "src": "https://storage.ghost.io/c/33/67/33678c00-2c15-4961-93e9-497b427e2006/content/images/size/w1200/2026/04/opencode_cover_3-1.webp",
      "alt": "How I Use OpenCode, Oh-My-OpenCode-Slim, and OpenSpec to Build My Own AI Coding Environment.",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://storage.ghost.io/c/33/67/33678c00-2c15-4961-93e9-497b427e2006/content/images/2026/04/image.png",
      "bytes": 29187,
      "reused": true,
      "local_path": "attachments/9c0ecf8916e4/images/005.png",
      "src": "https://storage.ghost.io/c/33/67/33678c00-2c15-4961-93e9-497b427e2006/content/images/2026/04/image.png",
      "alt": "Click the show more providers link and pick a provider for your open-source model.",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://storage.ghost.io/c/33/67/33678c00-2c15-4961-93e9-497b427e2006/content/images/2026/04/image-1.png",
      "bytes": 18777,
      "reused": true,
      "local_path": "attachments/9c0ecf8916e4/images/007.png",
      "src": "https://storage.ghost.io/c/33/67/33678c00-2c15-4961-93e9-497b427e2006/content/images/2026/04/image-1.png",
      "alt": "By setting up your provider correctly, you'll get all kinds of metadata about your models. ",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://storage.ghost.io/c/33/67/33678c00-2c15-4961-93e9-497b427e2006/content/images/2026/04/image-2.png",
      "bytes": 3985,
      "reused": true,
      "local_path": "attachments/9c0ecf8916e4/images/009.png",
      "src": "https://storage.ghost.io/c/33/67/33678c00-2c15-4961-93e9-497b427e2006/content/images/2026/04/image-2.png",
      "alt": "You can find your provider ID in the auth.json file.",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://storage.ghost.io/c/33/67/33678c00-2c15-4961-93e9-497b427e2006/content/images/2026/04/image-3.png",
      "bytes": 7983,
      "reused": true,
      "local_path": "attachments/9c0ecf8916e4/images/011.png",
      "src": "https://storage.ghost.io/c/33/67/33678c00-2c15-4961-93e9-497b427e2006/content/images/2026/04/image-3.png",
      "alt": "Right-click on your project to enable the workspace.",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://storage.ghost.io/c/33/67/33678c00-2c15-4961-93e9-497b427e2006/content/images/2026/04/image-4.png",
      "bytes": 13155,
      "reused": true,
      "local_path": "attachments/9c0ecf8916e4/images/012.png",
      "src": "https://storage.ghost.io/c/33/67/33678c00-2c15-4961-93e9-497b427e2006/content/images/2026/04/image-4.png",
      "alt": "The Plan agent generates a tasks file, and the Build agent executes them.",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://storage.ghost.io/c/33/67/33678c00-2c15-4961-93e9-497b427e2006/content/images/2026/07/opencode-plan_workflow.drawio.png",
      "bytes": 14726,
      "reused": true,
      "local_path": "attachments/9c0ecf8916e4/images/014.png",
      "src": "https://storage.ghost.io/c/33/67/33678c00-2c15-4961-93e9-497b427e2006/content/images/2026/07/opencode-plan_workflow.drawio.png",
      "alt": "Planning workflow mode sequence diagram.",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://storage.ghost.io/c/33/67/33678c00-2c15-4961-93e9-497b427e2006/content/images/2026/04/image-5.png",
      "bytes": 17749,
      "reused": true,
      "local_path": "attachments/9c0ecf8916e4/images/016.png",
      "src": "https://storage.ghost.io/c/33/67/33678c00-2c15-4961-93e9-497b427e2006/content/images/2026/04/image-5.png",
      "alt": "Once you've got Council set up, you can test the connectivity of each sub-agent.",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://storage.ghost.io/c/33/67/33678c00-2c15-4961-93e9-497b427e2006/content/images/2026/04/image-6.png",
      "bytes": 20394,
      "reused": true,
      "local_path": "attachments/9c0ecf8916e4/images/017.png",
      "src": "https://storage.ghost.io/c/33/67/33678c00-2c15-4961-93e9-497b427e2006/content/images/2026/04/image-6.png",
      "alt": "Think things through with the docs first, then roll up your sleeves and get to work.",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://storage.ghost.io/c/33/67/33678c00-2c15-4961-93e9-497b427e2006/content/images/2026/04/image-7.png",
      "bytes": 16845,
      "reused": true,
      "local_path": "attachments/9c0ecf8916e4/images/018.png",
      "src": "https://storage.ghost.io/c/33/67/33678c00-2c15-4961-93e9-497b427e2006/content/images/2026/04/image-7.png",
      "alt": "You just need to set up the Workflow, that's it.",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://storage.ghost.io/c/33/67/33678c00-2c15-4961-93e9-497b427e2006/content/images/2026/04/image-8.png",
      "bytes": 14677,
      "reused": true,
      "local_path": "attachments/9c0ecf8916e4/images/020.png",
      "src": "https://storage.ghost.io/c/33/67/33678c00-2c15-4961-93e9-497b427e2006/content/images/2026/04/image-8.png",
      "alt": "Just use the Space key to select the workflow nodes you like.",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://storage.ghost.io/c/33/67/33678c00-2c15-4961-93e9-497b427e2006/content/images/2026/04/image-9.png",
      "bytes": 19096,
      "reused": true,
      "local_path": "attachments/9c0ecf8916e4/images/021.png",
      "src": "https://storage.ghost.io/c/33/67/33678c00-2c15-4961-93e9-497b427e2006/content/images/2026/04/image-9.png",
      "alt": "A typical SSD development cycle.",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://storage.ghost.io/c/33/67/33678c00-2c15-4961-93e9-497b427e2006/content/images/icon/color_192_192-8e64abbc-0abf-4933-9510-28270569186f.png",
      "bytes": 17519,
      "reused": false,
      "local_path": "attachments/9c0ecf8916e4/images/body-10c5530e7b9af1a10e11.png",
      "src": "https://storage.ghost.io/c/33/67/33678c00-2c15-4961-93e9-497b427e2006/content/images/icon/color_192_192-8e64abbc-0abf-4933-9510-28270569186f.png",
      "alt": "",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://storage.ghost.io/c/33/67/33678c00-2c15-4961-93e9-497b427e2006/content/images/thumbnail/9f04a900-aa9a-4fd2-bd70-6f3fe3783129-4b663419-d8b8-475a-994c-ee00fb661600.webp",
      "bytes": 150196,
      "reused": true,
      "local_path": "attachments/9c0ecf8916e4/images/022.webp",
      "src": "https://storage.ghost.io/c/33/67/33678c00-2c15-4961-93e9-497b427e2006/content/images/thumbnail/9f04a900-aa9a-4fd2-bd70-6f3fe3783129-4b663419-d8b8-475a-994c-ee00fb661600.webp",
      "alt": "",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://storage.ghost.io/c/33/67/33678c00-2c15-4961-93e9-497b427e2006/content/images/icon/color_192_192-ab31ee0f-a18e-47c3-a30a-dbbb78204849.png",
      "bytes": 17519,
      "reused": false,
      "local_path": "attachments/9c0ecf8916e4/images/body-c14abfae5de4da33642f.png",
      "src": "https://storage.ghost.io/c/33/67/33678c00-2c15-4961-93e9-497b427e2006/content/images/icon/color_192_192-ab31ee0f-a18e-47c3-a30a-dbbb78204849.png",
      "alt": "",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://storage.ghost.io/c/33/67/33678c00-2c15-4961-93e9-497b427e2006/content/images/thumbnail/cover-c75bbbb4-131d-440a-94e6-2f766a866d4f.webp",
      "bytes": 100484,
      "reused": true,
      "local_path": "attachments/9c0ecf8916e4/images/023.webp",
      "src": "https://storage.ghost.io/c/33/67/33678c00-2c15-4961-93e9-497b427e2006/content/images/thumbnail/cover-c75bbbb4-131d-440a-94e6-2f766a866d4f.webp",
      "alt": "",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://storage.ghost.io/c/33/67/33678c00-2c15-4961-93e9-497b427e2006/content/images/icon/color_192_192-403fd322-1bcf-485f-b099-965b43d45c2d.png",
      "bytes": 17519,
      "reused": false,
      "local_path": "attachments/9c0ecf8916e4/images/body-249096913ded72589159.png",
      "src": "https://storage.ghost.io/c/33/67/33678c00-2c15-4961-93e9-497b427e2006/content/images/icon/color_192_192-403fd322-1bcf-485f-b099-965b43d45c2d.png",
      "alt": "",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://storage.ghost.io/c/33/67/33678c00-2c15-4961-93e9-497b427e2006/content/images/thumbnail/cover-3-comprass-32a4ac57-5d2c-475a-a8f8-6a0a837dae5b.webp",
      "bytes": 156130,
      "reused": true,
      "local_path": "attachments/9c0ecf8916e4/images/024.webp",
      "src": "https://storage.ghost.io/c/33/67/33678c00-2c15-4961-93e9-497b427e2006/content/images/thumbnail/cover-3-comprass-32a4ac57-5d2c-475a-a8f8-6a0a837dae5b.webp",
      "alt": "",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://storage.ghost.io/c/33/67/33678c00-2c15-4961-93e9-497b427e2006/content/images/icon/color_192_192-dba613f8-0702-422d-a175-81be6d1e073a.png",
      "bytes": 17519,
      "reused": false,
      "local_path": "attachments/9c0ecf8916e4/images/body-b1e44a1b6c69d57366c1.png",
      "src": "https://storage.ghost.io/c/33/67/33678c00-2c15-4961-93e9-497b427e2006/content/images/icon/color_192_192-dba613f8-0702-422d-a175-81be6d1e073a.png",
      "alt": "",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://storage.ghost.io/c/33/67/33678c00-2c15-4961-93e9-497b427e2006/content/images/thumbnail/cover_tiny-a88bc7d5-d4cd-4249-9378-7a6eaf0073c6.webp",
      "bytes": 216802,
      "reused": true,
      "local_path": "attachments/9c0ecf8916e4/images/025.webp",
      "src": "https://storage.ghost.io/c/33/67/33678c00-2c15-4961-93e9-497b427e2006/content/images/thumbnail/cover_tiny-a88bc7d5-d4cd-4249-9378-7a6eaf0073c6.webp",
      "alt": "",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://storage.ghost.io/c/33/67/33678c00-2c15-4961-93e9-497b427e2006/content/images/icon/color_192_192-d6bf4d07-af90-4c54-ad73-5e7217ef3c41.png",
      "bytes": 17519,
      "reused": false,
      "local_path": "attachments/9c0ecf8916e4/images/body-3f56718dbe7710e51945.png",
      "src": "https://storage.ghost.io/c/33/67/33678c00-2c15-4961-93e9-497b427e2006/content/images/icon/color_192_192-d6bf4d07-af90-4c54-ad73-5e7217ef3c41.png",
      "alt": "",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://storage.ghost.io/c/33/67/33678c00-2c15-4961-93e9-497b427e2006/content/images/thumbnail/aidlc-cover-ecdc87d8-46bd-4062-bd1d-db38e0bfb584.webp",
      "bytes": 138124,
      "reused": true,
      "local_path": "attachments/9c0ecf8916e4/images/026.webp",
      "src": "https://storage.ghost.io/c/33/67/33678c00-2c15-4961-93e9-497b427e2006/content/images/thumbnail/aidlc-cover-ecdc87d8-46bd-4062-bd1d-db38e0bfb584.webp",
      "alt": "",
      "downloaded": true
    }
  ],
  "audio": [],
  "videos": [],
  "links": [
    {
      "href": "https://www.dataleadsfuture.com/tag/harness-engineering/",
      "label": "Harness Engineering",
      "type": "a"
    },
    {
      "href": "https://www.dataleadsfuture.com/author/peng/",
      "label": "",
      "type": "a"
    },
    {
      "href": "https://www.dataleadsfuture.com/reflection-sdd-use-a-reflection-harness-to-level-up-your-openspec-workflow/",
      "label": "Reflection SDD workflow",
      "type": "a"
    },
    {
      "href": "https://www.dataleadsfuture.com/deepseek-v4-cant-read-images-i-made-it-read/",
      "label": "DeepSeek-V4 Can’t Read Images? I Made It Read Don’t wait for a multimodal model, you can use it now Data Leads Future Pe",
      "type": "a"
    },
    {
      "href": "https://www.dataleadsfuture.com/no-plugins-needed-i-built-a-fully-automated-coding-loop-in-opencode/",
      "label": "No Plugins Needed, I Built a Fully Automated Coding Loop in OpenCode Using DeepSeek-V4 for low-cost Loop Engineering Dat",
      "type": "a"
    },
    {
      "href": "https://www.dataleadsfuture.com/how-i-cut-kimi-k3-costs-in-opencode/",
      "label": "How I Cut Kimi K3 Costs in OpenCode Better code quality, but spend less money Data Leads Future Peng Qian",
      "type": "a"
    },
    {
      "href": "https://www.dataleadsfuture.com/from-openspec-to-aidlc-how-i-improved-my-teams-ai-code-quality/",
      "label": "From OpenSpec to AIDLC: How I Improved My Team’s AI Code Quality No new commands to learn, just pick it up and use it Da",
      "type": "a"
    }
  ],
  "repair_version": 2,
  "repaired_at": "2026-10-14T10:47:46Z",
  "source_url": "https://www.dataleadsfuture.com/how-i-use-opencode-oh-my-opencode-slim-and-openspec-to-build-my-own-ai-coding-environment/",
  "papers": [],
  "actual_video_files": [],
  "body_chars": 33243,
  "expected_body_images": 22,
  "discovery_status": "ok",
  "delivery_status": "ok",
  "missing_reason": "",
  "raw_html": "attachments/9c0ecf8916e4/pages/source.html",
  "local_html": "attachments/9c0ecf8916e4/pages/article.html",
  "body_base_path": "attachments/9c0ecf8916e4/pages/",
  "body_markdown_path": "attachments/9c0ecf8916e4/pages/article.md"
}