← Back to news
ZBuild News

Crea un Bookmark Manager Full-Stack con OpenCode en 30 minutos (Paso a paso)

Un tutorial de OpenCode basado en proyectos donde construirás un bookmark manager completo con tags, búsqueda y una REST API, utilizando el AI agent de OpenCode en la terminal. Cada función se introduce a medida que la necesitas, no en una lista de características.

Published
2026-03-27
Author
ZBuild Team
Reading Time
15 min read
opencode tutorialopencode guideopencode installopencode setupopencode configurationopencode ai coding agent
Crea un Bookmark Manager Full-Stack con OpenCode en 30 minutos (Paso a paso)
ZBuild Teames
XLinkedIn

Qué estamos construyendo

Olvídate de las listas de funciones. La mejor manera de aprender una herramienta es construyendo algo con ella.

En este tutorial, usarás OpenCode — el agente de codificación de AI de código abierto con más de 120K estrellas en GitHub — para construir un gestor de marcadores completo desde cero. La aplicación tendrá:

  • Una API REST con Express.js y TypeScript
  • Una base de datos SQLite con búsqueda de texto completo
  • Un sistema de etiquetas para organizar marcadores
  • Un frontend simple pero funcional
  • Unit tests

Cada función de OpenCode se presenta en el momento en que la necesitas, no en una sección de funciones abstractas. Al final, sabrás cómo instalar OpenCode, configurar modelos, usar los modos Build y Plan, configurar servidores MCP y crear agentes personalizados, todo porque los usaste para construir un proyecto real.

Tiempo: ~30 minutos Requisitos previos: Node.js 18+ instalado, una terminal (macOS, Linux o WSL en Windows) Costo: Gratis (usando los Zen models de OpenCode)


Fase 1: Instalación de OpenCode y configuración del proyecto (5 minutos)

Instalar OpenCode

Abre tu terminal y ejecuta uno de estos comandos:

# Option 1: npm (recommended)
npm i -g opencode-ai@latest

# Option 2: Homebrew (macOS/Linux)
brew install sst/tap/opencode

# Option 3: One-line installer
curl -fsSL https://opencode.ai/install.sh | bash

Verifica la instalación:

opencode --version

Deberías ver el número de versión. A partir de March 2026, la última versión estable está disponible en el repositorio de GitHub de OpenCode.

Crear el directorio del proyecto

mkdir bookmark-manager && cd bookmark-manager
git init
npm init -y

Iniciar OpenCode por primera vez

opencode

Esto abre la TUI (Terminal User Interface) de OpenCode — una interfaz interactiva de pantalla completa construida con Bubble Tea. Verás una entrada de chat en la parte inferior y un panel de conversación en el área principal.

Elegir un modelo

En el primer inicio, OpenCode te pedirá que selecciones un modelo. Tienes tres caminos:

Gratis (Zen models): Escribe /models y selecciona uno de los Zen models gratuitos. Para este tutorial, Grok Code Fast 1 o GLM 4.7 funcionan bien. Estos son gratuitos y no requieren API key.

Local (Ollama): Si tienes Ollama instalado, OpenCode lo detectará automáticamente. El modelo recomendado para Ollama es glm-4.7:cloud.

Pago (trae tu propia key): Escribe /connect para vincular tu API key de Anthropic, OpenAI o Google. Las keys se almacenan localmente en ~/.local/share/opencode/auth.json.

Para este tutorial, cualquier modelo funciona. Los modelos de mayor capacidad (Claude Sonnet 4.6, GPT-5.4) producirán mejores resultados en tareas complejas, pero los Zen models gratuitos manejan todo lo que estamos construyendo aquí.


Fase 2: Andamiaje del proyecto con Build mode (4 minutos)

OpenCode comienza en Build mode por defecto. Build mode le da al agente de AI acceso total para crear archivos, editar código y ejecutar comandos. Esto es lo que queremos para el andamiaje.

Tu primer prompt

Escribe esto en el chat de OpenCode:

Set up a TypeScript Node.js project with Express for a bookmark manager REST API.
Use SQLite via better-sqlite3 for the database. Add TypeScript, ts-node, and
nodemon as dev dependencies. Create a src/ directory with an index.ts entry point
that starts an Express server on port 3000.

OpenCode hará lo siguiente:

  1. Creará un tsconfig.json
  2. Instalará las dependencias con npm install
  3. Creará src/index.ts con la configuración del servidor Express
  4. Actualizará el package.json con los scripts de inicio

Observa la TUI — verás al agente ejecutando comandos de terminal, creando archivos y explicando lo que hace en cada paso. Esto no es generación de código en el vacío; OpenCode tiene acceso total a tu filesystem y terminal.

Verificar que funcione

Una vez que OpenCode termine, dile:

Run the server and verify it starts correctly on port 3000.

OpenCode ejecutará npx nodemon src/index.ts y confirmará que el servidor está escuchando. Deberías ver una salida como Server running on http://localhost:3000.

Qué acaba de suceder (Función: Build mode)

Build mode es el agente predeterminado de OpenCode. Tiene acceso a todas las herramientas: lectura/escritura de archivos, ejecución en terminal y edición de código. Según la documentación de OpenCode, puedes pensarlo como un programador de par de AI con acceso total a tu entorno de desarrollo.


Fase 3: Creación del modelo de datos y la base de datos (4 minutos)

Diseñar el esquema

Escribe este prompt:

Create a database module at src/db.ts that:
1. Initializes a SQLite database at ./data/bookmarks.db
2. Creates a bookmarks table with: id (auto-increment), url (text, unique),
   title (text), description (text, nullable), created_at (datetime),
   updated_at (datetime)
3. Creates a tags table with: id (auto-increment), name (text, unique)
4. Creates a bookmark_tags junction table for many-to-many relationships
5. Enables WAL mode for concurrent read performance
6. Creates an FTS5 virtual table for full-text search on title and description
Export a function to get the database instance.

OpenCode generará el módulo de base de datos completo. Presta atención a cómo maneja la configuración de FTS5 (Full-Text Search 5) — esta es una función de SQLite que potenciará nuestra funcionalidad de búsqueda más adelante.

Inicializar la base de datos al iniciar el servidor

Import the database module in index.ts and initialize it when the server starts.
Log a confirmation message.

Crear la configuración opencode.json

Este es un buen momento para introducir la configuración del proyecto. Crea un archivo diciéndole a OpenCode:

Create an opencode.json file in the project root with the project name
"bookmark-manager" and a rule that says "This is a TypeScript Express API
using better-sqlite3. Follow RESTful conventions. Use async/await. Return
JSON responses with consistent error formatting."

Esto crea el archivo de configuración del proyecto que OpenCode lee al iniciarse. Le da a la AI un contexto persistente sobre tu proyecto — estándares de codificación, decisiones de arquitectura y restricciones — para que no tengas que repetirlos en cada prompt.


Fase 4: Construcción de los endpoints de la API REST (5 minutos)

Generar las rutas

Create a routes module at src/routes/bookmarks.ts with these endpoints:
- POST /api/bookmarks — create a bookmark (validate url and title are present)
- GET /api/bookmarks — list all bookmarks with pagination (page, limit params)
- GET /api/bookmarks/:id — get a single bookmark with its tags
- PUT /api/bookmarks/:id — update a bookmark
- DELETE /api/bookmarks/:id — delete a bookmark and its tag associations
Use proper HTTP status codes. Return JSON with a consistent shape:
{ success: boolean, data: any, error?: string }

Registrar las rutas

Import the bookmark routes in index.ts and register them. Also add
express.json() middleware and a global error handler.

Probar con curl

Start the server, then create a test bookmark using curl:
curl -X POST http://localhost:3000/api/bookmarks \
  -H "Content-Type: application/json" \
  -d '{"url": "https://opencode.ai", "title": "OpenCode - AI Coding Agent"}'
Then fetch all bookmarks to verify it was saved.

OpenCode ejecutará estos comandos en tu terminal y te mostrará las respuestas. Aquí es donde la herramienta brilla — nunca sales de la terminal y la AI verifica su propio trabajo.


Fase 5: Adición de búsqueda con FTS5 (4 minutos)

Introducir Plan mode

Antes de construir la búsqueda, usemos el Plan mode para pensar en la implementación. Cambia de modo:

/plan

Ahora estás en Plan mode. La AI puede leer tu código y analizarlo, pero no puede modificar ningún archivo. Esto es útil para planificar antes de realizar cambios.

Analyze my current database schema and FTS5 table. Plan how to implement a
search endpoint that queries the FTS5 table and returns bookmarks ranked by
relevance. Consider edge cases: empty queries, special characters, partial
matches.

OpenCode examinará tu código, escribirá un plan en .opencode/plans/ y explicará su enfoque sin tocar ningún archivo. Lee el plan, ajústalo si es necesario y luego vuelve a cambiar:

/build

Implementar la búsqueda

Based on the plan, implement a GET /api/bookmarks/search?q=query endpoint
that uses the FTS5 virtual table for full-text search. Include snippet
highlighting and relevance ranking. Handle edge cases from the plan.

Probar la búsqueda

Create three more test bookmarks with different titles and descriptions,
then test the search endpoint with a query that should match two of them.

Qué acaba de suceder (Función: Plan mode)

El flujo de trabajo Plan/Build es cómo los desarrolladores experimentados usan OpenCode en tareas complejas. Primero planificar, revisar el enfoque y luego construir. Los archivos de plan se guardan en .opencode/plans/ y pueden ser referenciados más tarde por el agente de construcción. Esto evita que la AI tome decisiones estructurales importantes sobre la marcha.


Fase 6: Implementación del sistema de etiquetas (4 minutos)

Crear endpoints de etiquetas

Create a routes module at src/routes/tags.ts with:
- POST /api/tags — create a new tag
- GET /api/tags — list all tags with bookmark counts
- POST /api/bookmarks/:id/tags — add a tag to a bookmark
- DELETE /api/bookmarks/:id/tags/:tagId — remove a tag from a bookmark
- GET /api/bookmarks?tag=tagname — filter bookmarks by tag (update existing
  list endpoint to support this query parameter)
Register the tag routes in index.ts.

Probar el flujo de etiquetas

Create two tags: "dev-tools" and "tutorials". Add the "dev-tools" tag to
the OpenCode bookmark. Then fetch bookmarks filtered by the "dev-tools" tag.

Fase 7: Construcción de un frontend sencillo (5 minutos)

Generar el frontend

Create a public/ directory with a single-page frontend:
- index.html with a clean, minimal design (no framework, just HTML/CSS/JS)
- A form to add bookmarks (url, title, description)
- A search bar that queries the search endpoint with debounced input
- A list of bookmarks showing title, url, tags, and a delete button
- A tag filter sidebar that shows all tags with counts
- Use fetch() for API calls. Mobile responsive. No build step needed.
Serve the public/ directory as static files from Express.

OpenCode generará el frontend completo — estructura HTML, estilos CSS y JavaScript para interacciones con la API — en una sola pasada. La ventaja de construir esto en la terminal con un agente de AI es que puede probar inmediatamente si el frontend se conecta a la API.

Probar el stack completo

Start the server, open http://localhost:3000 in a description, and verify
that adding a bookmark from the form, searching, and filtering by tag all
work correctly.

Fase 8: Adición de pruebas con un agente personalizado (5 minutos)

Crear un agente de pruebas personalizado

Aquí es donde entra la función de agentes personalizados de OpenCode. En lugar de usar el agente Build genérico para las pruebas, crearemos uno especializado.

Agrega esto a tu opencode.json:

{
  "agents": {
    "test": {
      "name": "Test Writer",
      "instructions": "You are a testing specialist. Write comprehensive tests using Vitest. Focus on edge cases and error paths. Never modify source code — only create and edit test files.",
      "tools": ["read", "write", "terminal"]
    }
  }
}

Ahora cambia al agente de pruebas:

/agent test

Generar pruebas

Write comprehensive tests for the bookmark API using Vitest and supertest.
Cover:
- Creating a bookmark with valid data
- Creating a bookmark with missing required fields
- Fetching all bookmarks with pagination
- Searching with FTS5 (matching and non-matching queries)
- Adding and removing tags
- Deleting a bookmark removes its tag associations
Use an in-memory SQLite database for test isolation.

Ejecutar las pruebas

Install vitest and supertest as dev dependencies, add a test script to
package.json, then run the test suite.

Qué acaba de suceder (Función: Agentes personalizados)

Los agentes personalizados te permiten crear personas enfocadas con instrucciones específicas y acceso a herramientas. El agente de pruebas que creamos solo puede leer archivos, escribir archivos de prueba y ejecutar comandos de terminal — no puede modificar el código fuente. Esta restricción evita el problema común de que la AI "arregle" tu código fuente cuando las pruebas fallan en lugar de arreglar las pruebas.

Puedes crear agentes para cualquier flujo de trabajo especializado: revisión de código, documentación, migraciones de bases de datos, scripts de DevOps. La documentación de agentes de OpenCode tiene más ejemplos.


Bonus: Conexión de un servidor MCP para una funcionalidad mejorada

Si deseas extender tu gestor de marcadores, puedes conectar herramientas externas a través de servidores MCP (Model Context Protocol).

Ejemplo: Adición de un servidor MCP de vista previa de enlaces

Imagina que quieres que OpenCode obtenga automáticamente metadatos (título, descripción, favicon) de las URLs al crear marcadores. Puedes conectar un servidor MCP que realice la obtención HTTP:

Agrega esto a tu opencode.json:

{
  "mcp": {
    "link-preview": {
      "type": "local",
      "command": ["npx", "link-preview-mcp-server"]
    }
  }
}

Ahora OpenCode tiene una nueva herramienta disponible: puede obtener metadatos de URL como parte de su flujo de trabajo. Cuando le pidas que "agregue un marcador para https://example.com y complete automáticamente el título y la descripción", usará el servidor MCP para obtener esos datos.

Servidores MCP remotos

Para servicios en la nube, usa servidores MCP remotos con manejo automático de OAuth:

{
  "mcp": {
    "cloud-storage": {
      "type": "remote",
      "url": "https://mcp.example.com/storage",
      "headers": {
        "Authorization": "Bearer ${STORAGE_TOKEN}"
      }
    }
  }
}

OpenCode detecta respuestas 401 e inicia el flujo OAuth automáticamente si el servidor admite Dynamic Client Registration.


Bonus: Uso de OpenCode en CI/CD

OpenCode tiene un CLI mode que se ejecuta sin la TUI — perfecto para la automatización. Puedes usarlo en GitHub Actions o en cualquier pipeline de CI:

# Run a single prompt and exit
opencode -p "Review the changes in the last commit for security issues" --no-tui

# Use a specific model
opencode -m "claude-sonnet-4-6" -p "Generate a changelog entry for this release" --no-tui

Para nuestro gestor de marcadores, podrías agregar un paso de CI que ejecute OpenCode para revisar los PR automáticamente. La integración con GitHub de OpenCode proporciona una versión más optimizada de este flujo de trabajo.


Estructura completa del proyecto

Después de seguir este tutorial, tu proyecto debería verse así:

bookmark-manager/
  opencode.json          # OpenCode project config + custom agents + MCP
  package.json
  tsconfig.json
  src/
    index.ts             # Express server entry point
    db.ts                # SQLite database module with FTS5
    routes/
      bookmarks.ts       # CRUD + search endpoints
      tags.ts            # Tag management endpoints
  public/
    index.html           # Single-page frontend
  tests/
    bookmarks.test.ts    # API test suite
  data/
    bookmarks.db         # SQLite database (gitignored)
  .opencode/
    plans/               # Plans from Plan mode sessions

Qué aprendiste

Al construir un proyecto real, practicaste estas capacidades de OpenCode:

FunciónDónde la usaste
InstalaciónFase 1 — npm, Homebrew o curl
Zen models (gratis)Fase 1 — elegir un modelo sin una API key
Build modeFases 2-7 — desarrollo completo con acceso a archivos y terminal
Plan modeFase 5 — análisis de código y planificación de búsqueda antes de implementar
opencode.jsonFase 3 — configuración del proyecto con reglas para un comportamiento de AI consistente
Agentes personalizadosFase 8 — un agente de escritura de pruebas que no puede modificar el código fuente
Servidores MCPBonus — extensión de OpenCode con herramientas externas
CLI modeBonus — ejecución de OpenCode en CI/CD sin la TUI

La diferencia clave entre OpenCode y otras herramientas de codificación de AI es que es completamente de código abierto, se ejecuta en tu terminal y no almacena tu código ni tus datos de contexto. Tú controlas los modelos, los datos permanecen locales y la comunidad de más de 800 colaboradores lo mantiene evolucionando rápidamente.

Para los equipos que usan múltiples herramientas de AI, OpenCode funciona bien como el complemento basado en terminal para los asistentes de IDE. En ZBuild, a menudo lo usamos junto con herramientas basadas en editores para diferentes partes del flujo de trabajo de desarrollo.


Pasos siguientes

Ahora que tienes un gestor de marcadores en funcionamiento y una comprensión sólida de OpenCode, aquí hay algunas direcciones para explorar:

  1. Agregar autenticación — Usa el agente Build para agregar autenticación basada en JWT con cuentas de usuario
  2. Desplegar a producción — Pide a OpenCode que genere un Dockerfile y lo despliegue en Fly.io o Railway
  3. Construir una extensión de navegador — Crea una extensión de Chrome que agregue marcadores a través de la API
  4. Explorar más Zen models — Prueba Big Pickle, MiniMax M2.1, o ejecuta un modelo local a través de Ollama
  5. Crear más agentes personalizados — Un agente de "refactorización", un agente de "documentación" o un agente de "auditoría de seguridad"

La documentación de OpenCode y el repositorio awesome-opencode tienen más plugins, temas y configuraciones de la comunidad para explorar.


Fuentes

Back to all news
Enjoyed this article?
FAQ

Common questions

¿Qué vamos a construir en este tutorial?+
Un bookmark manager full-stack con una REST API de Node.js/Express, base de datos SQLite, sistema de tags, búsqueda de texto completo y un frontend simple de HTML/CSS/JS. Toda la aplicación se construye usando OpenCode como el AI coding agent en la terminal, demostrando workflows reales en lugar de listar características.
¿Necesito una API key para seguir este tutorial?+
No. OpenCode ofrece Zen models gratuitos que incluyen Grok Code Fast, GLM 4.7 y Big Pickle que funcionan sin API keys. También puedes ejecutarlo completamente offline con modelos locales vía Ollama. Si tienes una API key de Claude, GPT o Gemini, puedes usarlas para obtener resultados de mayor calidad.
¿Cuánto tiempo toma construir el proyecto completo?+
Aproximadamente 30 minutos si sigues el paso a paso. El tutorial está estructurado en 7 fases: project setup, data model, API endpoints, search, tags, frontend y testing. Cada fase toma de 3 a 5 minutos con OpenCode encargándose de la generación de código.
¿Puedo usar OpenCode en VS Code o Cursor?+
Sí. OpenCode se ejecuta en cualquier terminal integrada. Abre una terminal dividida en VS Code (Cmd+Esc en Mac) o Cursor e inicia OpenCode desde allí. Comparte automáticamente tu selección y el contexto de los archivos abiertos con el AI agent.
¿Cuál es la diferencia entre Build mode y Plan mode?+
El Build mode le da al AI agent acceso total para leer, escribir y ejecutar código. El Plan mode lo restringe a un análisis de solo lectura; el agente puede examinar tu código y crear archivos de plan, pero no puede modificar nada. Usamos el Plan mode en este tutorial antes de los pasos importantes de refactorización.
¿Cómo añado servidores MCP a OpenCode?+
Añádelos en tu configuración opencode.json bajo la clave mcp. Cada servidor MCP necesita un nombre único, un tipo (local o remoto) y detalles de conexión. Los servidores locales usan un campo command; los servidores remotos usan un campo url con encabezados opcionales. OpenCode gestiona el OAuth para servidores MCP remotos automáticamente.
Recommended Tools

Useful follow-ups related to this article.

Browse All Tools

Construir con ZBuild

Convierte tu idea en una app funcional — sin programar.

Más de 46.000 desarrolladores construyeron con ZBuild este mes

Pruébalo tú mismo

Describe lo que quieres — ZBuild lo construye por ti.

Más de 46.000 desarrolladores construyeron con ZBuild este mes
More Reading

Related articles

Las 8 mejores alternativas a OpenCode en 2026: Desde Claude Code hasta Cursor y opciones gratuitas
2026-03-27T00:00:00.000Z

Las 8 mejores alternativas a OpenCode en 2026: Desde Claude Code hasta Cursor y opciones gratuitas

¿Buscas una alternativa a OpenCode? Comparamos 8 herramientas de codificación con AI en benchmarks, precios y flujos de trabajo de desarrolladores reales. Encuentra la mejor opción para desarrollo terminal-first, basado en IDE y no-code en 2026.

OpenCode bloqueado por Anthropic: Qué pasó, por qué y cómo están respondiendo los desarrolladores en 2026
2026-03-27T00:00:00.000Z

OpenCode bloqueado por Anthropic: Qué pasó, por qué y cómo están respondiendo los desarrolladores en 2026

Un desglose completo sobre el bloqueo de Anthropic a OpenCode para acceder a los modelos de Claude en 2026. Conoce qué desencadenó la prohibición, los detalles legales y técnicos, las reacciones de la comunidad de DHH y otros, las soluciones alternativas disponibles y qué significa esto para el futuro de las herramientas de codificación de AI de código abierto.

OpenCode vs Claude Code vs Cursor en 2026: Análisis honesto de un desarrollador
2026-03-27T00:00:00.000Z

OpenCode vs Claude Code vs Cursor en 2026: Análisis honesto de un desarrollador

Probamos OpenCode, Claude Code y Cursor frente a frente en proyectos reales. Aquí comparamos su velocidad, costo, eficiencia de tokens y experiencia del desarrollador, con datos de benchmarks independientes.

Mejor AI para Coding 2026: Ranking completo de 15 herramientas por rendimiento en el mundo real
2026-03-27T00:00:00.000Z

Mejor AI para Coding 2026: Ranking completo de 15 herramientas por rendimiento en el mundo real

Un ranking basado en datos de cada herramienta principal de AI coding en 2026. Cubre puntuaciones de SWE-bench, precios, satisfacción del desarrollador y rendimiento en el mundo real para Claude Code, Cursor, GitHub Copilot, Windsurf, Devin, OpenCode, Aider, Cline y más.