{"id":1447,"date":"2026-06-18T08:26:54","date_gmt":"2026-06-18T06:26:54","guid":{"rendered":"https:\/\/programmier-workshops.de\/blog\/?page_id=1447"},"modified":"2026-06-18T09:27:28","modified_gmt":"2026-06-18T07:27:28","slug":"opencode-2","status":"publish","type":"page","link":"https:\/\/programmier-workshops.de\/blog\/opencode-2\/","title":{"rendered":"OpenCode"},"content":{"rendered":"\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_85 counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Table of Contents<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Toggle Table of Content\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-1'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/programmier-workshops.de\/blog\/opencode-2\/#Installation_Provider_Setup_and_Free_Model_Configuration\" >Installation, Provider Setup and Free Model Configuration<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-1'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/programmier-workshops.de\/blog\/opencode-2\/#1_What_is_OpenCode\" >1. What is OpenCode?<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-1'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/programmier-workshops.de\/blog\/opencode-2\/#2_Why_use_a_local_Node_environment\" >2. Why use a local Node environment?<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-1'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/programmier-workshops.de\/blog\/opencode-2\/#3_Prerequisites\" >3. Prerequisites<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-1'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/programmier-workshops.de\/blog\/opencode-2\/#4_Install_Node_in_a_localvirtual_environment\" >4. Install Node in a local\/virtual environment<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-1'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/programmier-workshops.de\/blog\/opencode-2\/#5_Install_OpenCode\" >5. Install OpenCode<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-1'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/programmier-workshops.de\/blog\/opencode-2\/#6_Verify_the_installation\" >6. Verify the installation<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-1'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/programmier-workshops.de\/blog\/opencode-2\/#7_Start_OpenCode\" >7. Start OpenCode<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-1'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/programmier-workshops.de\/blog\/opencode-2\/#8_Configure_OpenCode_Zen_as_Model_Provider\" >8. Configure OpenCode Zen as Model Provider<\/a><ul class='ez-toc-list-level-2' ><li class='ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/programmier-workshops.de\/blog\/opencode-2\/#Preparation\" >Preparation<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-11\" href=\"https:\/\/programmier-workshops.de\/blog\/opencode-2\/#Configure_provider_in_OpenCode\" >Configure provider in OpenCode<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-1'><a class=\"ez-toc-link ez-toc-heading-12\" href=\"https:\/\/programmier-workshops.de\/blog\/opencode-2\/#9_Select_a_free_model\" >9. Select a free model<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-1'><a class=\"ez-toc-link ez-toc-heading-13\" href=\"https:\/\/programmier-workshops.de\/blog\/opencode-2\/#10_Where_OpenCode_stores_configuration\" >10. Where OpenCode stores configuration<\/a><ul class='ez-toc-list-level-2' ><li class='ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-14\" href=\"https:\/\/programmier-workshops.de\/blog\/opencode-2\/#Global_configuration\" >Global configuration<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-15\" href=\"https:\/\/programmier-workshops.de\/blog\/opencode-2\/#Credentials\" >Credentials<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-16\" href=\"https:\/\/programmier-workshops.de\/blog\/opencode-2\/#Runtime_database\" >Runtime database<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-17\" href=\"https:\/\/programmier-workshops.de\/blog\/opencode-2\/#Project-local_configuration\" >Project-local configuration<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-1'><a class=\"ez-toc-link ez-toc-heading-18\" href=\"https:\/\/programmier-workshops.de\/blog\/opencode-2\/#11_Useful_OpenCode_commands\" >11. Useful OpenCode commands<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-1'><a class=\"ez-toc-link ez-toc-heading-19\" href=\"https:\/\/programmier-workshops.de\/blog\/opencode-2\/#12_Tips_and_Tricks\" >12. Tips and Tricks<\/a><ul class='ez-toc-list-level-2' ><li class='ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-20\" href=\"https:\/\/programmier-workshops.de\/blog\/opencode-2\/#Tip_1_Start_OpenCode_in_the_project_folder\" >Tip 1: Start OpenCode in the project folder<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-21\" href=\"https:\/\/programmier-workshops.de\/blog\/opencode-2\/#Tip_2_Keep_credentials_outside_Git\" >Tip 2: Keep credentials outside Git<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-22\" href=\"https:\/\/programmier-workshops.de\/blog\/opencode-2\/#Tip_3_Use_a_project-specific_config\" >Tip 3: Use a project-specific config<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-23\" href=\"https:\/\/programmier-workshops.de\/blog\/opencode-2\/#Tip_4_Add_OpenCode_notes_to_the_project_README\" >Tip 4: Add OpenCode notes to the project README<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-24\" href=\"https:\/\/programmier-workshops.de\/blog\/opencode-2\/#Tip_6_Ask_OpenCode_to_inspect_before_editing\" >Tip 6: Ask OpenCode to inspect before editing<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-25\" href=\"https:\/\/programmier-workshops.de\/blog\/opencode-2\/#Tip_7_Use_Git_before_larger_AI_changes\" >Tip 7: Use Git before larger AI changes<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-26\" href=\"https:\/\/programmier-workshops.de\/blog\/opencode-2\/#Tip_8_Use_a_clean_test_project_first\" >Tip 8: Use a clean test project first<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-1'><a class=\"ez-toc-link ez-toc-heading-27\" href=\"https:\/\/programmier-workshops.de\/blog\/opencode-2\/#13_Troubleshooting\" >13. Troubleshooting<\/a><ul class='ez-toc-list-level-2' ><li class='ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-28\" href=\"https:\/\/programmier-workshops.de\/blog\/opencode-2\/#Problem_opencode_command_not_found\" >Problem: opencode command not found<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-29\" href=\"https:\/\/programmier-workshops.de\/blog\/opencode-2\/#Problem_wrong_Node_installation_is_used\" >Problem: wrong Node installation is used<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-30\" href=\"https:\/\/programmier-workshops.de\/blog\/opencode-2\/#Problem_provider_is_missing\" >Problem: provider is missing<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-31\" href=\"https:\/\/programmier-workshops.de\/blog\/opencode-2\/#Problem_config_file_has_no_provider\" >Problem: config file has no provider<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-32\" href=\"https:\/\/programmier-workshops.de\/blog\/opencode-2\/#Problem_inspect_which_files_OpenCode_accesses\" >Problem: inspect which files OpenCode accesses<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-33\" href=\"https:\/\/programmier-workshops.de\/blog\/opencode-2\/#Problem_inspect_the_local_SQLite_database\" >Problem: inspect the local SQLite database<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-1'><a class=\"ez-toc-link ez-toc-heading-34\" href=\"https:\/\/programmier-workshops.de\/blog\/opencode-2\/#14_Recommended_project_setup\" >14. Recommended project setup<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-1'><a class=\"ez-toc-link ez-toc-heading-35\" href=\"https:\/\/programmier-workshops.de\/blog\/opencode-2\/#Final_Workflow_Summary\" >Final Workflow Summary<\/a><\/li><\/ul><\/nav><\/div>\n<h1 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Installation_Provider_Setup_and_Free_Model_Configuration\"><\/span>Installation, Provider Setup and Free Model Configuration<span class=\"ez-toc-section-end\"><\/span><\/h1>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/opencode.ai\/de\">OpenCode<\/a> is an open-source AI coding agent for the terminal. It can help you inspect code, generate files, refactor projects, explain errors, and work interactively inside your development folder.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This guide shows how to install OpenCode inside a local Node-based virtual environment and how to configure the OpenCode Zen provider with a free model.<\/p>\n\n\n\n<h1 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"1_What_is_OpenCode\"><\/span>1. What is OpenCode?<span class=\"ez-toc-section-end\"><\/span><\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">OpenCode is a terminal-based AI coding assistant. It works inside your project directory and can help with tasks such as:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>generating code<\/li>\n\n\n\n<li>explaining files<\/li>\n\n\n\n<li>debugging errors<\/li>\n\n\n\n<li>refactoring existing source code<\/li>\n\n\n\n<li>creating project structures<\/li>\n\n\n\n<li>writing documentation<\/li>\n\n\n\n<li>working with Git repositories<\/li>\n\n\n\n<li>running commands with approval<\/li>\n\n\n\n<li>using different AI providers and models<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">The important idea is simple:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">You start OpenCode inside your project folder, connect it to an AI model provider, and then work with it like an interactive coding agent.<\/p>\n<\/blockquote>\n\n\n\n<h1 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"2_Why_use_a_local_Node_environment\"><\/span>2. Why use a local Node environment?<span class=\"ez-toc-section-end\"><\/span><\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">OpenCode is installed via Node\/npm. You can <a href=\"https:\/\/nodejs.org\/en\/download\">install<\/a> it globally on your whole system, but I prefer using a local Node environment for development tools.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Advantages:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>no pollution of the global system Node installation<\/li>\n\n\n\n<li>easier cleanup<\/li>\n\n\n\n<li>project-specific tool versions<\/li>\n\n\n\n<li>better reproducibility<\/li>\n\n\n\n<li>safer experiments with beta or fast-moving tools<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">There are different ways to <a href=\"https:\/\/nodejs.org\/en\/download\">install<\/a> Node, depending on your preferences and on your operating system:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>install binary<\/li>\n\n\n\n<li>install via Node Version Manager nvm<\/li>\n\n\n\n<li>install via <a href=\"https:\/\/brew.sh\/\">Brew<\/a> (Mac OS)<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">In this guide, the local installation folder is represented as:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;VENV-FOLDER><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">~\/tmp\/opencode<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Inside that folder, Node is installed into:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;VENV-FOLDER>\/.venv\/node\/bin\/node<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">and OpenCode into:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;VENV-FOLDER>\/.venv\/node\/bin\/opencode<\/pre>\n\n\n\n<h1 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"3_Prerequisites\"><\/span>3. Prerequisites<span class=\"ez-toc-section-end\"><\/span><\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">You need:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>macOS, Linux, or Windows with a terminal<\/li>\n\n\n\n<li>Node.js\/npm available in your local environment<\/li>\n\n\n\n<li>an OpenCode Zen account<\/li>\n\n\n\n<li>an OpenCode Zen API key<\/li>\n\n\n\n<li>basic terminal knowledge<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Optional but recommended:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Git<\/li>\n\n\n\n<li>a test project folder<\/li>\n\n\n\n<li><code>jq<\/code> for inspecting JSON files<\/li>\n\n\n\n<li><code>sqlite3<\/code> for inspecting OpenCode\u2019s local database<\/li>\n\n\n\n<li>a shell like <code>zsh<\/code> or <code>bash<\/code><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">On macOS, useful tools can be installed with Homebrew:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\u276f brew install jq sqlite<\/pre>\n\n\n\n<h1 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"4_Install_Node_in_a_localvirtual_environment\"><\/span>4. Install Node in a local\/virtual environment<span class=\"ez-toc-section-end\"><\/span><\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Choose your own installation method and folder.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For the rest of this article, I use:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;VENV-FOLDER><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">as placeholder for your working folder.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\u276f mkdir -p ~\/tmp\/opencode\n\u276f cd ~\/tmp\/opencode<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Depending on your setup, your Node binary may be located here:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;VENV-FOLDER>\/.venv\/node\/bin\/node<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Check it with:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\u276f which node<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Expected result:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;VENV-FOLDER>\/.venv\/node\/bin\/node<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Also check the Node and npm versions:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\u276f node --version\n\u276f npm --version<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Example output:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">v22.x.x\n10.x.x<\/pre>\n\n\n\n<h1 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"5_Install_OpenCode\"><\/span>5. Install OpenCode<span class=\"ez-toc-section-end\"><\/span><\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Install OpenCode globally into your active Node environment:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\u276f npm install -g opencode-ai<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This installs the <code>opencode<\/code> command into the active Node binary path.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Check the result:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\u276f which opencode<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Expected result:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;VENV-FOLDER>\/.venv\/node\/bin\/opencode<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Also check:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\u276f opencode --version<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">If this command works, OpenCode is installed correctly.<\/p>\n\n\n\n<h1 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"6_Verify_the_installation\"><\/span>6. Verify the installation<span class=\"ez-toc-section-end\"><\/span><\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Run:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\u276f which node\n\u276f which npm\n\u276f which opencode<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\u276f which node\n&lt;VENV-FOLDER>\/.venv\/node\/bin\/node\n\n\u276f which opencode\n&lt;VENV-FOLDER>\/.venv\/node\/bin\/opencode<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This means OpenCode is installed inside your local Node environment, not globally in <code>\/usr\/local\/bin<\/code> or <code>\/opt\/homebrew\/bin<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You can also inspect the package:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\u276f npm list -g --depth=0\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">You should see something like:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\u276f opencode-ai\n<\/pre>\n\n\n\n<h1 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"7_Start_OpenCode\"><\/span>7. Start OpenCode<span class=\"ez-toc-section-end\"><\/span><\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Go into your project folder:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\u276f cd my-project<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Then start:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\u276f opencode<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">OpenCode opens an interactive terminal UI.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Important: Start OpenCode from the folder where your project lives. The current directory becomes the working context for the coding agent.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Good:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\u276f cd ~\/projects\/my-laravel-app\n\u276f opencode<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Less useful:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\u276f cd ~\n\u276f opencode<\/pre>\n\n\n\n<h1 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"8_Configure_OpenCode_Zen_as_Model_Provider\"><\/span>8. Configure OpenCode Zen as Model Provider<span class=\"ez-toc-section-end\"><\/span><\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">OpenCode can use many providers. For beginners, OpenCode Zen is one of the easiest options because the provider and model list are curated for OpenCode.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Preparation\"><\/span>Preparation<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Open the OpenCode Zen page:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">https:\/\/opencode.ai\/zen\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Register or sign in.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Then create an API key.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"327\" src=\"https:\/\/programmier-workshops.de\/blog\/wp-content\/uploads\/2026\/06\/image-4-1024x327.png\" alt=\"\" class=\"wp-image-1436\" srcset=\"https:\/\/programmier-workshops.de\/blog\/wp-content\/uploads\/2026\/06\/image-4-1024x327.png 1024w, https:\/\/programmier-workshops.de\/blog\/wp-content\/uploads\/2026\/06\/image-4-300x96.png 300w, https:\/\/programmier-workshops.de\/blog\/wp-content\/uploads\/2026\/06\/image-4-768x245.png 768w, https:\/\/programmier-workshops.de\/blog\/wp-content\/uploads\/2026\/06\/image-4-1536x491.png 1536w, https:\/\/programmier-workshops.de\/blog\/wp-content\/uploads\/2026\/06\/image-4-2048x654.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Keep this API key private. It is a credential and should not be committed into Git.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Configure_provider_in_OpenCode\"><\/span>Configure provider in OpenCode<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Start OpenCode:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\u276f opencode<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Inside the OpenCode UI, type:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/connect<\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"541\" src=\"https:\/\/programmier-workshops.de\/blog\/wp-content\/uploads\/2026\/06\/image-1024x541.png\" alt=\"\" class=\"wp-image-1432\" srcset=\"https:\/\/programmier-workshops.de\/blog\/wp-content\/uploads\/2026\/06\/image-1024x541.png 1024w, https:\/\/programmier-workshops.de\/blog\/wp-content\/uploads\/2026\/06\/image-300x158.png 300w, https:\/\/programmier-workshops.de\/blog\/wp-content\/uploads\/2026\/06\/image-768x406.png 768w, https:\/\/programmier-workshops.de\/blog\/wp-content\/uploads\/2026\/06\/image.png 1310w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Then select:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">OpenCode Zen<\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"572\" src=\"https:\/\/programmier-workshops.de\/blog\/wp-content\/uploads\/2026\/06\/image-1-1024x572.png\" alt=\"\" class=\"wp-image-1433\" srcset=\"https:\/\/programmier-workshops.de\/blog\/wp-content\/uploads\/2026\/06\/image-1-1024x572.png 1024w, https:\/\/programmier-workshops.de\/blog\/wp-content\/uploads\/2026\/06\/image-1-300x168.png 300w, https:\/\/programmier-workshops.de\/blog\/wp-content\/uploads\/2026\/06\/image-1-768x429.png 768w, https:\/\/programmier-workshops.de\/blog\/wp-content\/uploads\/2026\/06\/image-1.png 1270w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Copy your API Key<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"136\" src=\"https:\/\/programmier-workshops.de\/blog\/wp-content\/uploads\/2026\/06\/image-5-1024x136.png\" alt=\"\" class=\"wp-image-1437\" srcset=\"https:\/\/programmier-workshops.de\/blog\/wp-content\/uploads\/2026\/06\/image-5-1024x136.png 1024w, https:\/\/programmier-workshops.de\/blog\/wp-content\/uploads\/2026\/06\/image-5-300x40.png 300w, https:\/\/programmier-workshops.de\/blog\/wp-content\/uploads\/2026\/06\/image-5-768x102.png 768w, https:\/\/programmier-workshops.de\/blog\/wp-content\/uploads\/2026\/06\/image-5-1536x204.png 1536w, https:\/\/programmier-workshops.de\/blog\/wp-content\/uploads\/2026\/06\/image-5-2048x272.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Paste your API key when asked.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"436\" src=\"https:\/\/programmier-workshops.de\/blog\/wp-content\/uploads\/2026\/06\/image-6-1024x436.png\" alt=\"\" class=\"wp-image-1438\" srcset=\"https:\/\/programmier-workshops.de\/blog\/wp-content\/uploads\/2026\/06\/image-6-1024x436.png 1024w, https:\/\/programmier-workshops.de\/blog\/wp-content\/uploads\/2026\/06\/image-6-300x128.png 300w, https:\/\/programmier-workshops.de\/blog\/wp-content\/uploads\/2026\/06\/image-6-768x327.png 768w, https:\/\/programmier-workshops.de\/blog\/wp-content\/uploads\/2026\/06\/image-6-1536x655.png 1536w, https:\/\/programmier-workshops.de\/blog\/wp-content\/uploads\/2026\/06\/image-6.png 1558w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">After this step, OpenCode stores your provider credentials locally.<\/p>\n\n\n\n<h1 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"9_Select_a_free_model\"><\/span>9. Select a free model<span class=\"ez-toc-section-end\"><\/span><\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">After connecting OpenCode Zen, select a model.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Inside OpenCode, open the model selection:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/models<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Then search for:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">free<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Select one of the free model variants.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"433\" src=\"https:\/\/programmier-workshops.de\/blog\/wp-content\/uploads\/2026\/06\/image-7-1024x433.png\" alt=\"\" class=\"wp-image-1439\" srcset=\"https:\/\/programmier-workshops.de\/blog\/wp-content\/uploads\/2026\/06\/image-7-1024x433.png 1024w, https:\/\/programmier-workshops.de\/blog\/wp-content\/uploads\/2026\/06\/image-7-300x127.png 300w, https:\/\/programmier-workshops.de\/blog\/wp-content\/uploads\/2026\/06\/image-7-768x325.png 768w, https:\/\/programmier-workshops.de\/blog\/wp-content\/uploads\/2026\/06\/image-7.png 1396w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">The exact model list can change over time, so do not hardcode the model name unless you want a fixed setup. For experimenting, using the interactive <code>\/models<\/code> command is the easiest approach.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Then select the variant:<br><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"415\" src=\"https:\/\/programmier-workshops.de\/blog\/wp-content\/uploads\/2026\/06\/image-8-1024x415.png\" alt=\"\" class=\"wp-image-1440\" srcset=\"https:\/\/programmier-workshops.de\/blog\/wp-content\/uploads\/2026\/06\/image-8-1024x415.png 1024w, https:\/\/programmier-workshops.de\/blog\/wp-content\/uploads\/2026\/06\/image-8-300x121.png 300w, https:\/\/programmier-workshops.de\/blog\/wp-content\/uploads\/2026\/06\/image-8-768x311.png 768w, https:\/\/programmier-workshops.de\/blog\/wp-content\/uploads\/2026\/06\/image-8.png 1462w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">After selecting the model, you can start coding.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Example prompt:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">Analyze this project and explain the folder structure.<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Another useful prompt:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">Create a README.md for this project with installation and development commands.<\/pre>\n\n\n\n<h1 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"10_Where_OpenCode_stores_configuration\"><\/span>10. Where OpenCode stores configuration<span class=\"ez-toc-section-end\"><\/span><\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">OpenCode uses several storage locations.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Global_configuration\"><\/span>Global configuration<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The global config is usually here:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">~\/.config\/opencode\/opencode.json<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Some installations may also use:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">~\/.config\/opencode\/opencode.jsonc<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Check it with:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">ls -la ~\/.config\/opencode<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">cat ~\/.config\/opencode\/opencode.jsonc<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">You may see only:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">{\n  \"$schema\": \"https:\/\/opencode.ai\/config.json\"\n}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">That means no explicit provider or model is configured in the config file.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This is normal if you configured the provider interactively with <code>\/connect<\/code>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Credentials\"><\/span>Credentials<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Provider credentials are stored separately from the config file.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Typical location:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">~\/.local\/share\/opencode\/auth.json<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Check whether it exists:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">ls -la ~\/.local\/share\/opencode<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Inspect only the top-level keys, without printing secrets:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">cat ~\/.local\/share\/opencode\/auth.json | jq 'keys'<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Do not publish this file.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Do not commit it into Git.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Runtime_database\"><\/span>Runtime database<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">OpenCode may also create a local SQLite database:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">~\/.local\/share\/opencode\/opencode.db<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This database can contain local runtime\/session information.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Check it with:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\u276f file ~\/.local\/share\/opencode\/opencode.db<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Show tables:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\u276f sqlite3 ~\/.local\/share\/opencode\/opencode.db \".tables\"<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Show schema:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\u276f sqlite3 ~\/.local\/share\/opencode\/opencode.db \".schema\"<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Project-local_configuration\"><\/span>Project-local configuration<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">You can also create project-specific configuration:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">opencode.json<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">or:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">opencode.jsonc<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">inside your project root.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">my-project\/\n\u251c\u2500\u2500 opencode.json\n\u251c\u2500\u2500 README.md\n\u251c\u2500\u2500 src\/\n\u2514\u2500\u2500 package.json<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">A simple project config could look like this:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">{\n  \"$schema\": \"https:\/\/opencode.ai\/config.json\",\n  \"model\": \"opencode\/example-model\"\n}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Replace the model with the real model ID selected from <code>\/models<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The general model ID format is:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">provider\/model-id<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">For OpenCode Zen models, the provider prefix is usually:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">opencode\/<\/pre>\n\n\n\n<h1 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"11_Useful_OpenCode_commands\"><\/span>11. Useful OpenCode commands<span class=\"ez-toc-section-end\"><\/span><\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Inside the OpenCode UI:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/connect\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Connect a provider.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/models<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Select or inspect available models.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/help\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Show available commands.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/init\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Initialize useful project context if available.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">From the terminal:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\u276f opencode<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Start OpenCode.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\u276f opencode --version<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Show installed version.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\u276f opencode auth login<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Configure provider authentication from the CLI.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Depending on your installed version, available commands may differ. Use:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\u276f opencode --help<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">to inspect the exact CLI options.<\/p>\n\n\n\n<h1 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"12_Tips_and_Tricks\"><\/span>12. Tips and Tricks<span class=\"ez-toc-section-end\"><\/span><\/h1>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Tip_1_Start_OpenCode_in_the_project_folder\"><\/span>Tip 1: Start OpenCode in the project folder<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">OpenCode works best when started from the project root:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\u276f cd ~\/projects\/my-app\n\u276f opencode<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This gives the agent access to the correct files and project structure.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Tip_2_Keep_credentials_outside_Git\"><\/span>Tip 2: Keep credentials outside Git<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Never commit:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">~\/.local\/share\/opencode\/auth.json\n.env<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Also check your repository:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\u276f git status<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">and make sure no secret files appear.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Tip_3_Use_a_project-specific_config\"><\/span>Tip 3: Use a project-specific config<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">For repeatable projects, create:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">opencode.json<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">{\n  \"$schema\": \"https:\/\/opencode.ai\/config.json\",\n  \"model\": \"opencode\/YOUR-MODEL-ID\"\n}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This makes the selected model explicit for the project.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Tip_4_Add_OpenCode_notes_to_the_project_README\"><\/span>Tip 4: Add OpenCode notes to the project README<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Add a section like this:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">## OpenCode\n\nStart OpenCode from the project root:\n\n```bash\nopencode\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Provider credentials are configured locally via:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/connect<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Do not commit local credentials.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">---\n\n## Tip 5: Use clear coding prompts\n\nBad prompt:\n\n```text\nFix it.<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Better prompt:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">Analyze the current Django project. Find the reason why the frontend cannot call the API endpoint \/api\/teachers\/. Then propose the smallest code change and explain it before editing files.<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Good prompts contain:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>the goal<\/li>\n\n\n\n<li>the error<\/li>\n\n\n\n<li>relevant files<\/li>\n\n\n\n<li>constraints<\/li>\n\n\n\n<li>expected output<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Tip_6_Ask_OpenCode_to_inspect_before_editing\"><\/span>Tip 6: Ask OpenCode to inspect before editing<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A good workflow:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">First inspect the project structure. Do not modify files yet. Explain what you found.<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Then:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">Now implement the smallest working change.<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This reduces unwanted large edits.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Tip_7_Use_Git_before_larger_AI_changes\"><\/span>Tip 7: Use Git before larger AI changes<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Before asking OpenCode to change many files:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\u276f git status\n\u276f git add .\n\u276f git commit -m \"Before OpenCode changes\"<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Then you can review changes:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\u276f git diff<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">or revert if needed:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\u276f git restore .<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Tip_8_Use_a_clean_test_project_first\"><\/span>Tip 8: Use a clean test project first<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Before using OpenCode on important production code, test it in a small demo project:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\u276f mkdir opencode-test\n\u276f cd opencode-test\n\u276f git init\n\u276f echo \"# OpenCode Test\" > README.md\n\u276f opencode<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Try prompts like:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">Create a small Python CLI app with tests.<\/pre>\n\n\n\n<h1 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"13_Troubleshooting\"><\/span>13. Troubleshooting<span class=\"ez-toc-section-end\"><\/span><\/h1>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Problem_opencode_command_not_found\"><\/span>Problem: <code>opencode<\/code> command not found<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Check your PATH:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\u276f echo $PATH<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Check where npm installs global packages:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\u276f npm root -g\n\u276f npm bin -g<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Check whether OpenCode is installed:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\u276f npm list -g --depth=0<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">If necessary, reinstall:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\u276f npm install -g opencode-ai<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Problem_wrong_Node_installation_is_used\"><\/span>Problem: wrong Node installation is used<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Check:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\u276f which node\n\u276f which npm\n\u276f which opencode<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">If <code>node<\/code> points to the wrong location, activate your local environment again.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Expected:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;VENV-FOLDER>\/.venv\/node\/bin\/node\n&lt;VENV-FOLDER>\/.venv\/node\/bin\/opencode<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Problem_provider_is_missing\"><\/span>Problem: provider is missing<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Run OpenCode:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\u276f opencode<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Then use:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/connect<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Select the provider again and paste the API key.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Also inspect:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\u276f ls -la ~\/.local\/share\/opencode<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Credentials should usually be stored in:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">~\/.local\/share\/opencode\/auth.json<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Problem_config_file_has_no_provider\"><\/span>Problem: config file has no provider<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">This is normal if the provider was configured interactively.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Example config:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">{\n  \"$schema\": \"https:\/\/opencode.ai\/config.json\"\n}\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The provider credentials may still exist in:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">~\/.local\/share\/opencode\/auth.json<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The selected model or runtime state may also be represented in OpenCode\u2019s local data directory.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Problem_inspect_which_files_OpenCode_accesses\"><\/span>Problem: inspect which files OpenCode accesses<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">On macOS, you can monitor filesystem access with:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\u276f sudo fs_usage -w -f pathname opencode<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">If OpenCode runs as Node process, also try:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\u276f sudo fs_usage -w -f pathname node<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Filter for OpenCode files:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\u276f sudo fs_usage -w -f pathname node \\\n  | grep --line-buffered -iE \"opencode|auth\\.json|opencode\\.db|opencode\\.json|\\.config|\\.local\"<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Problem_inspect_the_local_SQLite_database\"><\/span>Problem: inspect the local SQLite database<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Check tables:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\u276f sqlite3 ~\/.local\/share\/opencode\/opencode.db \".tables\"<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Dump the database:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\u276f sqlite3 ~\/.local\/share\/opencode\/opencode.db \".dump\" > \/tmp\/opencode.sql<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Search for model or provider names:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\u276f sqlite3 ~\/.local\/share\/opencode\/opencode.db \".dump\" \\\n  | grep -iE \"provider|model|opencode|openai|anthropic|google|free\"<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Be careful: do not publish database dumps without checking for secrets.<\/p>\n\n\n\n<h1 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"14_Recommended_project_setup\"><\/span>14. Recommended project setup<span class=\"ez-toc-section-end\"><\/span><\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">For a clean project, I recommend:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">my-project\/\n\u251c\u2500\u2500 opencode.json\n\u251c\u2500\u2500 README.md\n\u251c\u2500\u2500 .gitignore\n\u2514\u2500\u2500 src\/<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Example <code>.gitignore<\/code>:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">.env\n.env.*\n*.log\n.DS_Store\nnode_modules\/<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Do not add global OpenCode credential files to your repository.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Optional project-local <code>opencode.json<\/code>:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">{\n  \"$schema\": \"https:\/\/opencode.ai\/config.json\",\n  \"model\": \"opencode\/YOUR-FREE-MODEL-ID\"\n}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Replace:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">YOUR-FREE-MODEL-ID<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">with the actual model selected via:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/models<\/pre>\n\n\n\n<h1 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Final_Workflow_Summary\"><\/span>Final Workflow Summary<span class=\"ez-toc-section-end\"><\/span><\/h1>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># 1. Create project folder\nmkdir -p ~\/tmp\/opencode\ncd ~\/tmp\/opencode\n\n# 2. Check Node\nwhich node\nnode --version\nnpm --version\n\n# 3. Install OpenCode\nnpm install -g opencode-ai\n\n# 4. Verify installation\nwhich opencode\nopencode --version\n\n# 5. Start OpenCode\nopencode\n\n# 6. Inside OpenCode\n\/connect\n\n# 7. Select OpenCode Zen\n# 8. Paste API key\n# 9. Run \/models\n# 10. Search for free\n# 11. Select a free model\n# 12. Start coding\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Example first prompt:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">Analyze this project and create a short technical overview. Do not change files yet.<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Then:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">Create a README.md with setup, development, and troubleshooting instructions.<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Installation, Provider Setup and Free Model Configuration OpenCode is an open-source AI coding agent for the terminal. It can help you inspect code, generate files, refactor projects, explain errors, and work interactively inside your development folder. This guide shows how to install OpenCode inside a&hellip;<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-1447","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/programmier-workshops.de\/blog\/wp-json\/wp\/v2\/pages\/1447","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/programmier-workshops.de\/blog\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/programmier-workshops.de\/blog\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/programmier-workshops.de\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/programmier-workshops.de\/blog\/wp-json\/wp\/v2\/comments?post=1447"}],"version-history":[{"count":5,"href":"https:\/\/programmier-workshops.de\/blog\/wp-json\/wp\/v2\/pages\/1447\/revisions"}],"predecessor-version":[{"id":1457,"href":"https:\/\/programmier-workshops.de\/blog\/wp-json\/wp\/v2\/pages\/1447\/revisions\/1457"}],"wp:attachment":[{"href":"https:\/\/programmier-workshops.de\/blog\/wp-json\/wp\/v2\/media?parent=1447"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}