<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Yunsoft</title>
    <description>The latest articles on DEV Community by Yunsoft (@yunsoft).</description>
    <link>https://dev.to/yunsoft</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3791376%2F53fbcca7-c563-444e-bad6-a0a9ab1b759e.png</url>
      <title>DEV Community: Yunsoft</title>
      <link>https://dev.to/yunsoft</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/yunsoft"/>
    <language>en</language>
    <item>
      <title>Run YunCMS with Docker Compose: MySQL 8.4 Included</title>
      <dc:creator>Yunsoft</dc:creator>
      <pubDate>Sat, 12 Sep 2026 15:22:45 +0000</pubDate>
      <link>https://dev.to/yunsoft/run-yuncms-with-docker-compose-mysql-84-included-4hlb</link>
      <guid>https://dev.to/yunsoft/run-yuncms-with-docker-compose-mysql-84-included-4hlb</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Disclosure:&lt;/strong&gt; YunCMS is developed and maintained by Yunsoft Software. This guide covers our own open-source project. It was verified against &lt;code&gt;yunsoftofficial/yuncms:0.1.22&lt;/code&gt; on September 12, 2026. The YunCMS &lt;code&gt;0.1.x&lt;/code&gt; line is pre-stable, so interfaces and behavior may change between releases.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You may not want to prepare the right Node.js version, npm and a separate MySQL server just to evaluate a CMS/backend. The YunCMS Docker Compose path shortens that first step: a constrained YunCMS container, MySQL 8.4 and persistent volumes arrive in one maintained project definition.&lt;/p&gt;

&lt;p&gt;This guide takes the official Compose files from an empty directory to a working YunCMS Studio. It also explains which data persists, why production deployments should pin an image version and how to approach updates safely.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2FYunsoft-Software%2Fyuncms%2Fmain%2Fdocs%2Fassets%2Fscreenshots%2Fstudio-content.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2FYunsoft-Software%2Fyuncms%2Fmain%2Fdocs%2Fassets%2Fscreenshots%2Fstudio-content.png" alt="YunCMS Studio content workspace running with Docker Compose" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;
Docker and npm distributions run the same YunCMS Studio and REST API.



&lt;h2&gt;What does the Compose stack include?&lt;/h2&gt;

&lt;p&gt;The official stack creates two services and two persistent volumes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;MySQL 8.4:&lt;/strong&gt; stores YunCMS metadata and project collections.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;YunCMS:&lt;/strong&gt; runs the CLI, REST API and built React Studio from the same image.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;mysql-data&lt;/code&gt;:&lt;/strong&gt; keeps MySQL tables independent of container lifetime.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;yuncms-data&lt;/code&gt;:&lt;/strong&gt; stores the project environment, local Files, extensions, AI settings key and local backups.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The YunCMS image also includes the MySQL client tools required by the &lt;code&gt;backup&lt;/code&gt; and &lt;code&gt;restore&lt;/code&gt; commands. It supports &lt;code&gt;linux/amd64&lt;/code&gt; and &lt;code&gt;linux/arm64&lt;/code&gt;, so the same workflow can run on common servers and ARM-based development machines.&lt;/p&gt;

&lt;h2&gt;1. Check the requirements&lt;/h2&gt;

&lt;p&gt;For local use, you only need Docker Engine with the Compose plugin or Docker Desktop. An internet-facing production deployment additionally needs persistent storage suitable for its database and Files plus a reverse proxy that terminates TLS.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;docker --version
docker compose version&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The Docker path does not require a separate Node.js or npm installation on the host; the required runtime is already inside the YunCMS image.&lt;/p&gt;

&lt;h2&gt;2. Download the official Compose files&lt;/h2&gt;

&lt;p&gt;Create an empty deployment directory and download the maintained configuration:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;mkdir my-yuncms
cd my-yuncms
curl -fsSLO https://raw.githubusercontent.com/Yunsoft-Software/yuncms/main/compose.yaml
curl -fsSL https://raw.githubusercontent.com/Yunsoft-Software/yuncms/main/docker.env.example -o .env&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Open &lt;code&gt;.env&lt;/code&gt; and replace these two example values with different strong passwords:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;YUNCMS_DB_PASSWORD=replace-with-a-strong-database-password
YUNCMS_DB_ROOT_PASSWORD=replace-with-a-different-strong-root-password&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;Never commit the &lt;code&gt;.env&lt;/code&gt; file.&lt;/strong&gt; It contains database passwords and deployment configuration and should be readable only by people and processes that need it.&lt;/p&gt;

&lt;p&gt;For production, pin &lt;code&gt;YUNCMS_IMAGE&lt;/code&gt; to a specific version you have verified:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;YUNCMS_IMAGE=yunsoftofficial/yuncms:0.1.22&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;code&gt;latest&lt;/code&gt; is convenient for evaluation, but it is not an unattended production update policy.&lt;/p&gt;

&lt;h2&gt;3. Start MySQL first&lt;/h2&gt;

&lt;pre&gt;&lt;code&gt;docker compose up -d mysql
docker compose ps&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The stack does not consider YunCMS ready before MySQL becomes healthy. Wait for the MySQL service to report healthy in &lt;code&gt;docker compose ps&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The official configuration does not publish the MySQL port to the host. Keep that boundary in an internet-facing deployment; YunCMS only needs database access over the private Compose network.&lt;/p&gt;

&lt;h2&gt;4. Initialize YunCMS once&lt;/h2&gt;

&lt;p&gt;Run the interactive &lt;code&gt;init&lt;/code&gt; command for the first schema preparation and Administrator account:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;docker compose run --rm yuncms init&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Use these Compose values for the database prompts:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;&lt;tr&gt;
&lt;th&gt;Prompt&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;MySQL host&lt;/td&gt;
&lt;td&gt;&lt;code&gt;mysql&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MySQL port&lt;/td&gt;
&lt;td&gt;&lt;code&gt;3306&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MySQL database&lt;/td&gt;
&lt;td&gt;&lt;code&gt;yuncms&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MySQL user&lt;/td&gt;
&lt;td&gt;&lt;code&gt;yuncms&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MySQL password&lt;/td&gt;
&lt;td&gt;the &lt;code&gt;YUNCMS_DB_PASSWORD&lt;/code&gt; value from &lt;code&gt;.env&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Use MySQL TLS&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;false&lt;/code&gt; for the private Compose network&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Then enter the first Administrator email and a strong password. &lt;code&gt;init&lt;/code&gt; applies the required migrations and prepares the project environment inside the &lt;code&gt;yuncms-data&lt;/code&gt; volume.&lt;/p&gt;

&lt;h2&gt;5. Start YunCMS and verify readiness&lt;/h2&gt;

&lt;pre&gt;&lt;code&gt;docker compose up -d yuncms
docker compose ps
curl http://localhost:3008/health
curl http://localhost:3008/ready&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Open &lt;code&gt;http://localhost:3008&lt;/code&gt; in a browser. Studio and the REST API share the same port. &lt;code&gt;/health&lt;/code&gt; confirms that the HTTP process is alive; &lt;code&gt;/ready&lt;/code&gt; confirms that the application can reach MySQL and the required shared state and is ready to accept work.&lt;/p&gt;

&lt;p&gt;The image health check uses &lt;code&gt;/ready&lt;/code&gt;, so Compose marks the YunCMS container healthy only when the real dependencies are available.&lt;/p&gt;

&lt;h2&gt;6. Removing a container is not the same as removing data&lt;/h2&gt;

&lt;p&gt;Stopping containers or running a normal &lt;code&gt;docker compose down&lt;/code&gt; does not remove named volumes. MySQL and the YunCMS project state remain available when the stack starts again.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Be careful:&lt;/strong&gt; &lt;code&gt;docker compose down -v&lt;/code&gt; removes both volumes. That can irreversibly destroy the database, uploaded local Files, extensions and local YunCMS state. Use it only when you intentionally want to discard the complete installation.&lt;/p&gt;

&lt;p&gt;If you use S3-compatible storage, its objects are not inside either Compose volume. Configure provider-side versioning, snapshots or backups separately.&lt;/p&gt;

&lt;h2&gt;7. Create a backup before real content arrives&lt;/h2&gt;

&lt;p&gt;Stop the normal YunCMS service before maintenance:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;docker compose stop yuncms
docker compose run --rm yuncms backup&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Copy the completed backup out of the volume and store it independently:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;docker compose cp yuncms:/data/.yuncms/backups ./backups&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;A single backup inside the same host or volume is not independent protection against host or volume loss. Test the MySQL and storage recovery plan separately for production.&lt;/p&gt;

&lt;h2&gt;8. Update a container installation safely&lt;/h2&gt;

&lt;p&gt;Container deployments update by replacing the pinned image, not by running &lt;code&gt;yuncms update&lt;/code&gt; inside an immutable image:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Stop the service and create a verified backup with the current image.&lt;/li&gt;
&lt;li&gt;Change &lt;code&gt;YUNCMS_IMAGE&lt;/code&gt; in &lt;code&gt;.env&lt;/code&gt; to the target version.&lt;/li&gt;
&lt;li&gt;Pull the new image and run &lt;code&gt;bootstrap&lt;/code&gt; once.&lt;/li&gt;
&lt;li&gt;Start the service and verify &lt;code&gt;/ready&lt;/code&gt;, Administrator login, representative permissions and Files.&lt;/li&gt;
&lt;/ol&gt;

&lt;pre&gt;&lt;code&gt;docker compose stop yuncms
docker compose run --rm yuncms backup
# Pin YUNCMS_IMAGE in .env to the target version
docker compose pull yuncms
docker compose run --rm yuncms bootstrap
docker compose up -d yuncms
curl http://localhost:3008/ready&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Remember that YunCMS is still in the &lt;code&gt;0.1.x&lt;/code&gt; line. Read the target release notes, test in staging and do not update production without a verified recovery path.&lt;/p&gt;

&lt;h2&gt;9. Before exposing the installation to the internet&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Set &lt;code&gt;YUNCMS_PUBLIC_URL&lt;/code&gt; to the real HTTPS origin.&lt;/li&gt;
&lt;li&gt;Match &lt;code&gt;YUNCMS_TRUST_PROXY_HOPS&lt;/code&gt; to the actual reverse-proxy chain.&lt;/li&gt;
&lt;li&gt;Do not publish the MySQL port.&lt;/li&gt;
&lt;li&gt;Replace every example Administrator and database password.&lt;/li&gt;
&lt;li&gt;Design the Public role from a deny-by-default starting point.&lt;/li&gt;
&lt;li&gt;Test Files, backup/restore, permissions and sessions with representative users.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The official Compose stack runs the YunCMS container read-only, drops Linux capabilities and uses &lt;code&gt;no-new-privileges&lt;/code&gt;. These are useful starting boundaries; they do not replace application permissions, proxy/TLS, secret management or monitoring.&lt;/p&gt;

&lt;h2&gt;Where do AI and MCP fit?&lt;/h2&gt;

&lt;p&gt;The optional AI workspace inside Studio can connect to an OpenAI-compatible provider. Schema and content operations run under the signed-in user’s current role, field and row permissions; AI does not receive an Administrator bypass.&lt;/p&gt;

&lt;p&gt;The optional MCP endpoint for external AI tools uses the same service and RBAC layer. MCP starts disabled, authenticated and read-only by default. This gives an AI tool a defined backend contract instead of asking it to recreate authentication, CRUD and permission code for every project.&lt;/p&gt;

&lt;h2&gt;Docker or npm?&lt;/h2&gt;

&lt;p&gt;Docker Compose is the shortest path when you want a repeatable self-hosted stack that includes MySQL. If you need YunCMS inside an existing Node.js deployment model, want to manage it in &lt;code&gt;package.json&lt;/code&gt; or prefer the npm-based managed update flow, follow the &lt;a href="https://yunsoft.com/blog/yuncms-getting-started-15-minute-guide" rel="noopener noreferrer"&gt;npm getting-started guide&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;Links&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://hub.docker.com/r/yunsoftofficial/yuncms" rel="noopener noreferrer"&gt;YunCMS on Docker Hub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Yunsoft-Software/yuncms/blob/main/docs/docker.md" rel="noopener noreferrer"&gt;Official Docker guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Yunsoft-Software/yuncms" rel="noopener noreferrer"&gt;YunCMS source code and issue tracker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Yunsoft-Software/yuncms/blob/main/docs/production-readiness.md" rel="noopener noreferrer"&gt;Production readiness checklist&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Try the stack with a real project and report any blocked step as a reproducible GitHub issue. We will continue shaping YunCMS around concrete use cases rather than an abstract feature checklist.&lt;/p&gt;

</description>
      <category>docker</category>
      <category>opensource</category>
      <category>backend</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Introducing YunCMS 0.1.14: a focused, programmable MySQL CMS/backend</title>
      <dc:creator>Yunsoft</dc:creator>
      <pubDate>Fri, 04 Sep 2026 14:48:10 +0000</pubDate>
      <link>https://dev.to/yunsoft/introducing-yuncms-0114-a-focused-programmable-mysql-cmsbackend-3m9e</link>
      <guid>https://dev.to/yunsoft/introducing-yuncms-0114-a-focused-programmable-mysql-cmsbackend-3m9e</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Disclosure: YunCMS is developed and maintained by Yunsoft Software. This post introduces our own open-source project. Version 0.1.14 belongs to the pre-stable 0.1.x series, so interfaces and behavior may change between releases.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Many projects need the same backend building blocks: configurable collections and fields, relational data, a usable administration interface, permissions, file handling, and a clean way to extend the system. We built YunCMS to provide those pieces in a small reusable platform, without trying to reproduce every feature of a much larger CMS.&lt;/p&gt;

&lt;p&gt;YunCMS is an independent implementation inspired by the developer ergonomics of tools such as Directus. It is not a Directus fork and does not aim for compatibility for its own sake. The goal is a focused core that grows only when a real project needs a capability.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvedlevbved6q8e8we8rm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvedlevbved6q8e8we8rm.png" alt="YunCMS React Studio content interface" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  What is included today?
&lt;/h4&gt;

&lt;p&gt;The current release includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;dynamic MySQL collections, fields, and relations;&lt;/li&gt;
&lt;li&gt;a schema-driven React Studio for content, files, data models, users, roles, and settings;&lt;/li&gt;
&lt;li&gt;a documented REST API with filtering, sorting, pagination, field selection, and relation expansion;&lt;/li&gt;
&lt;li&gt;explicit role-based access control with action, field, row-filter, and validation boundaries;&lt;/li&gt;
&lt;li&gt;local and S3-compatible file storage;&lt;/li&gt;
&lt;li&gt;trusted server extensions with endpoint and hook helpers;&lt;/li&gt;
&lt;li&gt;an optional Studio AI assistant that works through the current user's permissions; and&lt;/li&gt;
&lt;li&gt;an optional MCP endpoint that uses the same services and accountability model.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The MCP endpoint is disabled, authenticated, and read-only by default. Enabling a feature never turns a caller into an administrator: normal YunCMS permissions remain authoritative.&lt;/p&gt;

&lt;h4&gt;
  
  
  A deliberately straightforward stack
&lt;/h4&gt;

&lt;p&gt;YunCMS V1 uses Node.js 24 LTS, JavaScript/ESM, Express 5, and MySQL through &lt;code&gt;mysql2/promise&lt;/code&gt;. Studio uses React 19.2 and Vite 8. There is no ORM, GraphQL layer, or second database driver in the current contract.&lt;/p&gt;

&lt;p&gt;HTTP routes stay thin while business behavior lives in services such as &lt;code&gt;ItemsService&lt;/code&gt;, &lt;code&gt;CollectionsService&lt;/code&gt;, &lt;code&gt;FieldsService&lt;/code&gt;, &lt;code&gt;RelationsService&lt;/code&gt;, &lt;code&gt;UsersService&lt;/code&gt;, and &lt;code&gt;FilesService&lt;/code&gt;. Extensions and internal code call these services directly instead of making local HTTP requests back into YunCMS.&lt;/p&gt;

&lt;h4&gt;
  
  
  Try it locally
&lt;/h4&gt;

&lt;p&gt;You need Node.js 24 LTS, npm 11 or newer, and a MySQL 8-compatible server. Then run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx &lt;span class="nt"&gt;--yes&lt;/span&gt; @yunsoft/yuncms init
npx &lt;span class="nt"&gt;--yes&lt;/span&gt; @yunsoft/yuncms start
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The same listener serves Studio and the REST API. The 15-minute getting-started guide covers database setup, the first administrator, a sample collection, permissions, and a first API request.&lt;/p&gt;

&lt;h4&gt;
  
  
  Current status and scope
&lt;/h4&gt;

&lt;p&gt;YunCMS is open source under the MIT License and is actively developed. The current &lt;code&gt;0.1.x&lt;/code&gt; line should be treated as pre-stable. It is suitable for evaluation and feedback, but adopters should test against the exact release they use and review the documented operational checks before relying on it in production.&lt;/p&gt;

&lt;p&gt;The current scope is intentionally specific: MySQL only for V1, REST only, and self-hosted deployment. YunCMS does not currently claim Docker support, a hosted SaaS edition, GraphQL, or general production stability.&lt;/p&gt;

&lt;h4&gt;
  
  
  Links
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Website: &lt;a href="https://yunsoft.com" rel="noopener noreferrer"&gt;https://yunsoft.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/Yunsoft-Software/yuncms" rel="noopener noreferrer"&gt;https://github.com/Yunsoft-Software/yuncms&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;npm: &lt;a href="https://www.npmjs.com/package/@yunsoft/yuncms" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/@yunsoft/yuncms&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Getting started: &lt;a href="https://github.com/Yunsoft-Software/yuncms/blob/main/docs/getting-started.md" rel="noopener noreferrer"&gt;https://github.com/Yunsoft-Software/yuncms/blob/main/docs/getting-started.md&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Studio guide: &lt;a href="https://github.com/Yunsoft-Software/yuncms/blob/main/docs/studio.md" rel="noopener noreferrer"&gt;https://github.com/Yunsoft-Software/yuncms/blob/main/docs/studio.md&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;REST API guide: &lt;a href="https://github.com/Yunsoft-Software/yuncms/blob/main/docs/rest-api.md" rel="noopener noreferrer"&gt;https://github.com/Yunsoft-Software/yuncms/blob/main/docs/rest-api.md&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;MCP guide: &lt;a href="https://github.com/Yunsoft-Software/yuncms/blob/main/docs/mcp.md" rel="noopener noreferrer"&gt;https://github.com/Yunsoft-Software/yuncms/blob/main/docs/mcp.md&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If this direction matches a backend problem you have, try the release, open an issue, or tell us which missing capability blocks a real project. That feedback is what will shape the core.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>webdev</category>
      <category>node</category>
      <category>backend</category>
    </item>
    <item>
      <title>I Started Testing Free SEO Tools on My Site, Early Results and What I’m Expecting</title>
      <dc:creator>Yunsoft</dc:creator>
      <pubDate>Fri, 10 Apr 2026 16:57:58 +0000</pubDate>
      <link>https://dev.to/yunsoft/i-started-testing-free-seo-tools-on-my-site-early-results-and-what-im-expecting-110a</link>
      <guid>https://dev.to/yunsoft/i-started-testing-free-seo-tools-on-my-site-early-results-and-what-im-expecting-110a</guid>
      <description>&lt;p&gt;I’ve been working on growing traffic for my software company website, and like most people, I kept hearing the same advice:&lt;/p&gt;

&lt;p&gt;"Create free tools. They attract organic traffic."&lt;/p&gt;

&lt;p&gt;So I decided to test it myself.&lt;/p&gt;

&lt;p&gt;Instead of writing more blog posts or chasing backlinks all day, I launched a simple tools section on my website:&lt;br&gt;
👉 &lt;a href="https://yunsoft.com/tools" rel="noopener noreferrer"&gt;https://yunsoft.com/tools&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Nothing fancy. Just useful tools that people might actually search for and use.&lt;/p&gt;

&lt;p&gt;Why Tools?&lt;/p&gt;

&lt;p&gt;The logic is pretty simple:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;People actively search for tools&lt;/li&gt;
&lt;li&gt;Tools get bookmarked and reused&lt;/li&gt;
&lt;li&gt;They have higher engagement than blog content&lt;/li&gt;
&lt;li&gt;They can naturally attract backlinks over time&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Compared to standard content, tools feel more “useful” and less like marketing.&lt;/p&gt;




&lt;h2&gt;
  
  
  Current Situation (Week 1)
&lt;/h2&gt;

&lt;p&gt;Right now, the traffic is very small.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Around &lt;strong&gt;10 daily clicks&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Almost no backlinks yet&lt;/li&gt;
&lt;li&gt;Very limited indexing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But honestly, that’s expected.&lt;/p&gt;

&lt;p&gt;This is not a short-term strategy.&lt;/p&gt;




&lt;h3&gt;
  
  
  What I’m Testing
&lt;/h3&gt;

&lt;p&gt;I’m focusing on a few things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Indexing speed of tool pages&lt;/li&gt;
&lt;li&gt;Whether tools rank faster than blog posts&lt;/li&gt;
&lt;li&gt;If users actually stay and interact&lt;/li&gt;
&lt;li&gt;Organic impressions growth over time&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Also, I’m internally linking these tools from other pages to boost visibility.&lt;/p&gt;




&lt;h3&gt;
  
  
  Why I Think This Might Work
&lt;/h3&gt;

&lt;p&gt;From what I’ve seen across multiple SEO case studies:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tool pages often rank easier for long-tail keywords&lt;/li&gt;
&lt;li&gt;They can scale better than blog content&lt;/li&gt;
&lt;li&gt;Once they start ranking, they bring consistent traffic&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And most importantly:&lt;br&gt;
They don’t feel like content spam.&lt;/p&gt;




&lt;h3&gt;
  
  
  Plan Going Forward
&lt;/h3&gt;

&lt;p&gt;I’m not expecting immediate results.&lt;/p&gt;

&lt;p&gt;This is more like a 30–60 day experiment.&lt;/p&gt;

&lt;p&gt;If things go well, I’ll:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add more tools&lt;/li&gt;
&lt;li&gt;Improve UX&lt;/li&gt;
&lt;li&gt;Push them through communities (Reddit, forums, etc.)&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Final Thoughts
&lt;/h3&gt;

&lt;p&gt;Right now, it’s too early to say anything definitive.&lt;/p&gt;

&lt;p&gt;But I’ll keep this experiment running and share updates after a month.&lt;/p&gt;

&lt;p&gt;If you're also struggling with traffic, this might be worth testing instead of writing another 50 blog posts.&lt;/p&gt;

</description>
      <category>buildinpublic</category>
      <category>marketing</category>
      <category>saas</category>
      <category>startup</category>
    </item>
    <item>
      <title>What is Clawwork (hkuds)? The Browser Agent That Finally Understands the Web</title>
      <dc:creator>Yunsoft</dc:creator>
      <pubDate>Mon, 09 Mar 2026 10:14:19 +0000</pubDate>
      <link>https://dev.to/yunsoft/what-is-clawwork-hkuds-the-browser-agent-that-finally-understands-the-web-2dhh</link>
      <guid>https://dev.to/yunsoft/what-is-clawwork-hkuds-the-browser-agent-that-finally-understands-the-web-2dhh</guid>
      <description>&lt;p&gt;I hate Selenium. There, I said it.&lt;/p&gt;

&lt;p&gt;I spent last Saturday night debugging a scraper that had been running perfectly for six months. The target website didn't even do a major redesign. They just changed a single CSS class name on their login button. One tiny change, and my entire script exploded.&lt;/p&gt;

&lt;p&gt;If you write automation scripts, you know this feeling. It is the absolute worst part of the job. We have been building bots that are "blind" for years. We tell them to click coordinate X or find ID Y. They do exactly what they are told, which is usually the problem.&lt;/p&gt;

&lt;p&gt;That is why I stopped scrolling when I saw a repository called hkuds/clawwork popping up all over my GitHub feed recently. It promised to fix the one thing that makes browser automation a nightmare: fragility.&lt;/p&gt;

&lt;p&gt;I decided to dig into it because I kept seeing people search for "what is Clawwork" or specifically looking for the hkuds version. I pulled the repo, burned through a bunch of API credits, and gave it a spin.&lt;/p&gt;

&lt;p&gt;Here is the honest breakdown of what this thing actually is and if it is worth your time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why We Are All Tired of "Dumb" Bots
&lt;/h2&gt;

&lt;p&gt;The problem with tools like Puppeteer or Playwright isn't that they are bad tools. They are amazing. The problem is that they rely on the DOM.&lt;/p&gt;

&lt;p&gt;You are basically playing a game of "Where's Waldo" with HTML tags. You write a script that says "Find the blue button." But tomorrow, the button might be green. Or it might be inside a strictly positioned div that blocks the click.&lt;/p&gt;

&lt;p&gt;Traditional bots crash when things change. They have no intuition.&lt;/p&gt;

&lt;p&gt;Clawwork is different. It is part of this new wave of "Agentic AI." Instead of looking at the code, it uses Large Language Models and computer vision to look at the actual pixels. It sees the page like you do.&lt;/p&gt;

&lt;h2&gt;
  
  
  So, What is Clawwork (hkuds)?
&lt;/h2&gt;

&lt;p&gt;Okay, let's get technical for a second. Clawwork is an open-source browser automation agent. There are a bunch of versions floating around, but the hkuds/clawwork repo is the one everyone is talking about right now because it is clean and it actually works.&lt;/p&gt;

&lt;p&gt;Think of it as a wrapper around Playwright. But instead of you writing the steps, you hook it up to a brain like GPT-4o or Claude 3.5 Sonnet.&lt;/p&gt;

&lt;p&gt;You don't write: await page.click('#submit-btn');&lt;/p&gt;

&lt;p&gt;You write: "Go to Amazon, search for a mechanical keyboard under $100, and add the one with the best reviews to the cart."&lt;/p&gt;

&lt;p&gt;The agent takes a screenshot. It sends that image to the AI. The AI looks at it and says, "Okay, the search bar is at the top. I need to click there."&lt;/p&gt;

&lt;p&gt;It is weirdly human. It calculates coordinates based on what it sees, not just what is in the code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the "hkuds" Repo Specifically?
&lt;/h2&gt;

&lt;p&gt;I was wondering this too. Why this specific fork?&lt;/p&gt;

&lt;p&gt;It comes down to control. Most "AI Agent" tools right now are expensive SaaS products. You have to pay a monthly fee and you don't really know what they are doing with your data.&lt;/p&gt;

&lt;p&gt;The hkuds version is open source. You can clone it. You can run it on your own laptop. You bring your own API keys. It handles the messy stuff like managing the browser context and the vision processing so you don't have to build that from scratch.&lt;/p&gt;

&lt;h2&gt;
  
  
  I Tried to Break It (And It Kinda Surprised Me)
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flehmdp4gg8awvtqwry8u.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flehmdp4gg8awvtqwry8u.webp" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I didn't want to give it an easy test. I sent it to a travel booking site. You know the kind. Popups everywhere, dynamic date pickers, weird overlays.&lt;/p&gt;

&lt;p&gt;My prompt was simple: "Find a non-stop flight from New York to London for next Tuesday."&lt;/p&gt;

&lt;p&gt;I watched the browser open on my second monitor.&lt;/p&gt;

&lt;p&gt;It sat there for a few seconds. That is the "thinking" phase. Then the mouse moved. It didn't jump instantly like a robot usually does. It slid over to the "One Way" toggle. Clicked it. Then it opened the calendar.,&lt;/p&gt;

&lt;p&gt;Clawwork Hkuds Vision Grid Terminal Logs Example&lt;/p&gt;

&lt;p&gt;This is the part where my Selenium scripts usually die. The calendar date for "next Tuesday" changes every week. You can't hard code it easily.&lt;/p&gt;

&lt;p&gt;Clawwork looked at the calendar, figured out what today's date was, calculated next Tuesday, and clicked the right number. It was slow, sure. But it worked. It felt a little ghostly seeing the mouse move by itself based on visual cues.&lt;/p&gt;

&lt;h2&gt;
  
  
  Under the Hood
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5zppgywnn7w12wvrk1az.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5zppgywnn7w12wvrk1az.webp" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;br&gt;
If you are a dev, you probably want to know how the sausage is made. The architecture in the hkuds repo is actually pretty smart.&lt;/p&gt;

&lt;p&gt;It has three main layers:&lt;/p&gt;

&lt;p&gt;Clawwork architecture diagram driver perception reasoning layer AI workflow&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;The Driver (The Hands) This is standard Playwright. It handles the actual clicking, typing, and scrolling. Nothing new here.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The Perception (The Eyes) This is the cool part. It captures the viewport state. Early agents tried to turn the HTML into text, which was messy. This version leans on Vision. It overlays a grid or numeric tags on interactive elements. So the AI sees a button labeled "42" and just tells the driver "Click 42."&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The Brain ( The Wallet) This is where your API key comes in. The agent sends the state to OpenAI or Anthropic. The model decides what to do next. "I see a popup, I should close it."&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The Real Talk: Pros and Cons
&lt;/h2&gt;

&lt;p&gt;I am not going to sell you a dream here. This tech is new and it has some rough edges.&lt;/p&gt;

&lt;p&gt;The Good Stuff It heals itself. If the website moves the login button to the left, Clawwork sees it and clicks it anyway. You don't have to update your code. That is huge. It handles logic that is hard to code, like "Choose the best looking option."&lt;/p&gt;

&lt;p&gt;The Pain Points It is not cheap. Every single step is an API call with image data. If you are scraping ten thousand pages, you are going to burn through your wallet fast. It is also slow. The "Observe -&amp;gt; Think -&amp;gt; Act" loop takes a few seconds. You are not going to use this for high-frequency trading.&lt;/p&gt;

&lt;h2&gt;
  
  
  When Should You Use It?
&lt;/h2&gt;

&lt;p&gt;Don't use this to scrape Wikipedia. That is overkill.&lt;/p&gt;

&lt;p&gt;Use it for the stuff that makes you want to pull your hair out. Use it for QA testing where you need to simulate a confused user. Use it for complex workflows that involve multi-step forms. Use it for legacy internal tools that have terrible code structures.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting It Running
&lt;/h2&gt;

&lt;p&gt;I am not going to lie, the setup can be a bit tricky if you haven't messed with Node or Docker environments before. You need to get your environment variables right or the browser will just close immediately.&lt;/p&gt;

&lt;p&gt;I spent a few hours banging my head against the wall getting the Docker container to play nice with my local network.&lt;/p&gt;

&lt;p&gt;Clawwork installation guide step by step tutorial setup success terminal&lt;/p&gt;

&lt;p&gt;Since I already went through that pain, I wrote a specific guide just for the installation.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://yunsoft.com/blog/clawwork-installation-guide-ai-coworker" rel="noopener noreferrer"&gt;Click here to read my full ClawWork Installation Guide&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I break down exactly how to configure the .env file and how to avoid the common errors I ran into.&lt;/p&gt;

&lt;p&gt;The web is changing. We are moving away from rigid scripts to autonomous agents. hkuds/clawwork is one of the first tools that actually makes this accessible to normal developers. It is messy, it is fun, and honestly, it is probably the future.&lt;/p&gt;

&lt;p&gt;Check out the repo, but definitely grab my guide first so you don't waste your evening debugging config files like I did.&lt;/p&gt;

</description>
      <category>agents</category>
      <category>ai</category>
      <category>automation</category>
      <category>webscraping</category>
    </item>
    <item>
      <title>Stop Treating Clawdbot (OpenClaw) Like a Plug-and-Play Solution</title>
      <dc:creator>Yunsoft</dc:creator>
      <pubDate>Wed, 25 Feb 2026 09:09:17 +0000</pubDate>
      <link>https://dev.to/yunsoft/stop-treating-clawdbot-openclaw-like-a-plug-and-play-solution-fo0</link>
      <guid>https://dev.to/yunsoft/stop-treating-clawdbot-openclaw-like-a-plug-and-play-solution-fo0</guid>
      <description>&lt;p&gt;Clawdbot (now OpenClaw) isn’t exactly the type of tool that tip-toes into the room. It tends to crash the party all at once. One day it’s a mention in a random thread, the next it’s a blog post link, and suddenly there’s a 30-second “how-to” video making it look like child’s play.&lt;/p&gt;

&lt;p&gt;Before anyone actually understands the mechanics, it feels like everyone is already using it. And that’s the problem: expectations usually outpace reality.&lt;/p&gt;

&lt;p&gt;From what I’ve seen, Clawdbot sits in a tricky middle ground. It’s powerful enough to be useful, but limited enough to frustrate anyone expecting it to solve problems it was never built for.&lt;/p&gt;

&lt;p&gt;What’s Actually Happening Under the Hood?&lt;br&gt;
Strip away the marketing, and at its core, Clawdbot is a scraping bot. It hits a page, reads the structure, and grabs data based on the rules you set. Simple enough on paper, right? In practice, it’s rarely that clean.&lt;/p&gt;

&lt;p&gt;The thing is, Clawdbot doesn’t “understand” intent. It doesn’t know which data point is the gold mine and which is just noise. It just follows a pattern. If that pattern shifts even slightly, your output breaks. Period.&lt;/p&gt;

&lt;p&gt;A Finished Product or Just a Gear in the Machine?&lt;br&gt;
Most people get disappointed because they treat Clawdbot like a “plug-and-play” solution. Clawdbot shines when it’s treated as one part of a larger ecosystem, not the whole show. It needs to be wrapped in:&lt;/p&gt;

&lt;p&gt;Validation layers (is the data actually correct?)&lt;/p&gt;

&lt;p&gt;Storage logic (where does it go?)&lt;/p&gt;

&lt;p&gt;Monitoring (is the site down or did our logic break?)&lt;/p&gt;

&lt;p&gt;Where Expectations Usually Break Down&lt;br&gt;
Scraping projects usually fail for the same boring reasons:&lt;/p&gt;

&lt;p&gt;The Stability Myth: Websites are living things. There is no such thing as “set it and forget it.”&lt;/p&gt;

&lt;p&gt;The “Garbage In, Garbage Out” Rule: No tool can magically fix a broken data structure without extra logic.&lt;/p&gt;

&lt;p&gt;The Scaling Wall: Once you move past small tests, rate limits and error handling start to matter. A lot.&lt;/p&gt;

&lt;p&gt;The Bottom Line&lt;br&gt;
Clawdbot starts to make sense the moment you stop looking for a shortcut and start looking at it as infrastructure. If you approach it with a plan and a bit of skepticism, it’s a massive leverage point.&lt;/p&gt;

&lt;p&gt;Let's Connect&lt;br&gt;
I share regular notes on automation, data systems, and the reality of implementation here:&lt;/p&gt;

&lt;p&gt;X (Twitter): &lt;a href="https://x.com/yunsoftofficial" rel="noopener noreferrer"&gt;Yunsoft&lt;/a&gt;&lt;br&gt;
LinkedIn: &lt;a href="https://www.linkedin.com/company/yunsoft/?viewAsMember=true" rel="noopener noreferrer"&gt;Yunsoft&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>database</category>
      <category>automation</category>
      <category>webscraping</category>
    </item>
  </channel>
</rss>
