<?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: hongsheng yang</title>
    <description>The latest articles on DEV Community by hongsheng yang (@hongsheng_yang_0b463d934e).</description>
    <link>https://dev.to/hongsheng_yang_0b463d934e</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%2F3963214%2F24bd43d7-8968-4b9e-8251-5ba217886b27.jpg</url>
      <title>DEV Community: hongsheng yang</title>
      <link>https://dev.to/hongsheng_yang_0b463d934e</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/hongsheng_yang_0b463d934e"/>
    <language>en</language>
    <item>
      <title>Install a forum on $2 shared hosting in 2 minutes: no Composer, no Docker, no build step</title>
      <dc:creator>hongsheng yang</dc:creator>
      <pubDate>Fri, 04 Sep 2026 14:37:21 +0000</pubDate>
      <link>https://dev.to/hongsheng_yang_0b463d934e/install-a-forum-on-2-shared-hosting-in-2-minutes-no-composer-no-docker-no-build-step-g7k</link>
      <guid>https://dev.to/hongsheng_yang_0b463d934e/install-a-forum-on-2-shared-hosting-in-2-minutes-no-composer-no-docker-no-build-step-g7k</guid>
      <description>&lt;p&gt;Most forum software today assumes you have a build pipeline. Discourse wants Ruby, Docker, Redis and Postgres. Flarum is PHP but still needs Composer and a terminal. That is fine for a company running a big community, but it rules out the hosting most small communities actually have: a $2 shared plan with a file manager and a MySQL database.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.flatbb.com" rel="noopener noreferrer"&gt;Flatbb&lt;/a&gt; is a flat, lightweight forum I wrote for exactly that case. Plain PHP 8, no framework, no Composer, no build step, MIT licensed. This post is the whole installation, then the part I find more interesting: writing plugins for it with an AI assistant.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you need
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Any host with PHP 8.1 or newer (&lt;code&gt;pdo_sqlite&lt;/code&gt; or &lt;code&gt;pdo_mysql&lt;/code&gt;, &lt;code&gt;mbstring&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;A MySQL 5.7+ database, or nothing at all if you use SQLite&lt;/li&gt;
&lt;li&gt;A way to put files on the server: FTP, the hosting file manager, or &lt;code&gt;unzip&lt;/code&gt; over SSH if you have it&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 1: download and unzip
&lt;/h2&gt;

&lt;p&gt;Get the zip from &lt;a href="https://www.flatbb.com/download" rel="noopener noreferrer"&gt;https://www.flatbb.com/download&lt;/a&gt; and unzip it. You get one folder, &lt;code&gt;flatbb-0.1.10/&lt;/code&gt;. Rename it to whatever you like or put its contents straight into your web root.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public_html/
  index.php
  core/
  app/
  assets/
  plugins/
  data/        &amp;lt;- config and SQLite file live here, must be writable
  uploads/     &amp;lt;- attachments and avatars, must be writable
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If your host lets you set the document root, point it at the folder. If not, the root works too; &lt;code&gt;data/&lt;/code&gt; and &lt;code&gt;uploads/&lt;/code&gt; are protected by the bundled &lt;code&gt;.htaccess&lt;/code&gt; (Apache) and the nginx rules in the docs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: open the URL
&lt;/h2&gt;

&lt;p&gt;Visit your domain. The installer appears:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Choose the language.&lt;/li&gt;
&lt;li&gt;Choose MySQL (enter host, database, user, password) or SQLite (nothing to enter).&lt;/li&gt;
&lt;li&gt;Create the admin account.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That is the deployment. There is no step 3. The whole thing took under two minutes on a cheap shared plan when I timed it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you get
&lt;/h2&gt;

&lt;p&gt;Categories, tags, flat topics with replies, markdown with mentions and attachments, notifications, full-text search (FTS5 on SQLite, FULLTEXT on MySQL), dark mode, a three-column layout that collapses to one on a phone, and an admin panel for users, groups, categories, layout blocks and plugins. Seven language packs ship in the box.&lt;/p&gt;

&lt;p&gt;Upgrades are one click: Admin, Tools, Check for updates. The core is a handful of small PHP files you can read in an afternoon, which matters when something breaks on a host you cannot SSH into.&lt;/p&gt;

&lt;h2&gt;
  
  
  Plugins: one folder, one manifest
&lt;/h2&gt;

&lt;p&gt;Everything beyond the core is a plugin. A plugin is a folder with a &lt;code&gt;plugin.php&lt;/code&gt; that returns a manifest: routes, hooks, settings, admin pages, scheduled jobs, and its own tables through helpers that work on both SQLite and MySQL.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;
&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="s1"&gt;'id'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'hello'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'name'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'Hello'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'version'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'1.0.0'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'description'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'Shows a greeting above the topic list.'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'hooks'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="s1"&gt;'region.home.top'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'hello_banner'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;hello_banner&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$html&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;array&lt;/span&gt; &lt;span class="nv"&gt;$ctx&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$html&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="s1"&gt;'&amp;lt;div class="hello-banner"&amp;gt;'&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nf"&gt;h&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;t&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Welcome!'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="s1"&gt;'&amp;lt;/div&amp;gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You install a plugin by uploading the zipped folder in Admin, Plugins, or in one click from the marketplace at &lt;a href="https://www.flatbb.com/market" rel="noopener noreferrer"&gt;https://www.flatbb.com/market&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Writing plugins with an AI assistant
&lt;/h2&gt;

&lt;p&gt;Because the plugin API is small, it fits in a single text file: &lt;a href="https://www.flatbb.com/dev/plugins.md" rel="noopener noreferrer"&gt;https://www.flatbb.com/dev/plugins.md&lt;/a&gt;. That file is the spec, the hook list and the helper reference in one.&lt;/p&gt;

&lt;p&gt;The workflow I use:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Paste the URL above into Claude Code, Codex or Cursor.&lt;/li&gt;
&lt;li&gt;Describe the plugin: what it does, where it shows up, its settings, who may use it.&lt;/li&gt;
&lt;li&gt;Ask for the finished folder as a zip.&lt;/li&gt;
&lt;li&gt;Upload it under Admin, Plugins.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The assistant gets the naming rules (&lt;code&gt;hello_*&lt;/code&gt; functions, &lt;code&gt;plugin_hello_*&lt;/code&gt; tables, &lt;code&gt;.hello-*&lt;/code&gt; CSS), the security rules (escape with &lt;code&gt;h()&lt;/code&gt;, never read superglobals, POST plus CSRF for every state change) and the portability rules (no engine-specific SQL) from the same document, so the result usually passes &lt;code&gt;php flatbb plugin:check&lt;/code&gt; first time. Every bundled plugin was built this way.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Download: &lt;a href="https://www.flatbb.com/download" rel="noopener noreferrer"&gt;https://www.flatbb.com/download&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Source on GitHub: &lt;a href="https://github.com/nwnuyhs/flatbb" rel="noopener noreferrer"&gt;https://github.com/nwnuyhs/flatbb&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Plugin marketplace: &lt;a href="https://www.flatbb.com/market" rel="noopener noreferrer"&gt;https://www.flatbb.com/market&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Plugin docs for AI assistants: &lt;a href="https://www.flatbb.com/dev/plugins" rel="noopener noreferrer"&gt;https://www.flatbb.com/dev/plugins&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you try it, tell me where it breaks. The support forum runs on Flatbb itself, which is the best test I know.&lt;/p&gt;

</description>
      <category>php</category>
      <category>opensource</category>
      <category>webdev</category>
      <category>selfhosted</category>
    </item>
  </channel>
</rss>
