<?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: Ketut Dana</title>
    <description>The latest articles on DEV Community by Ketut Dana (@ketutdana).</description>
    <link>https://dev.to/ketutdana</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F483655%2Fbaf23e70-d511-42d5-acd7-ee4b94ae0625.jpg</url>
      <title>DEV Community: Ketut Dana</title>
      <link>https://dev.to/ketutdana</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ketutdana"/>
    <language>en</language>
    <item>
      <title>XtermChat | A Terminal Chat App With a Built-in Server Monitoring Bot</title>
      <dc:creator>Ketut Dana</dc:creator>
      <pubDate>Sun, 15 Mar 2026 13:28:24 +0000</pubDate>
      <link>https://dev.to/ketutdana/xtermchat-a-terminal-chat-app-with-a-built-in-server-monitoring-bot-nde</link>
      <guid>https://dev.to/ketutdana/xtermchat-a-terminal-chat-app-with-a-built-in-server-monitoring-bot-nde</guid>
      <description>&lt;p&gt;A few months ago I got tired of giving my team's conversations to third-party servers. So I built XtermChat — a self-hosted chat system that runs entirely in the terminal.&lt;/p&gt;

&lt;p&gt;Since then, it has grown into something I didn't originally plan: a full &lt;strong&gt;client-server chat system&lt;/strong&gt; with a terminal TUI, a web admin panel, and a bot that monitors your VPS and sends alerts directly into your chat rooms.&lt;/p&gt;

&lt;p&gt;This post is about what it became.&lt;/p&gt;




&lt;h2&gt;
  
  
  What XtermChat Is Now
&lt;/h2&gt;

&lt;p&gt;At its core, XtermChat is still simple: a Python Flask server, a SQLite database, and a CLI client. But it now ships with three ways to use it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Terminal TUI&lt;/strong&gt; — the original interface. Run &lt;code&gt;xtc start:chat @general&lt;/code&gt; and you get a full terminal UI with three panels, dual-focus mode, emoji shortcuts, link detection, and clipboard copy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Web Admin Panel&lt;/strong&gt; — run &lt;code&gt;xtc start:web&lt;/code&gt; and open &lt;code&gt;localhost:5000&lt;/code&gt;. Full admin panel with dashboard, room management, chat with link previews (OG image, title, description), and bot management.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Bot System&lt;/strong&gt; — run &lt;code&gt;xtc start:bot&lt;/code&gt; and a setup wizard walks you through configuring a monitoring bot that runs as a background process on your VPS.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Bot System
&lt;/h2&gt;

&lt;p&gt;This is the part I'm most excited about. The idea is simple: instead of setting up a separate alerting tool, XtermChat already has rooms and messaging — so why not use that infrastructure for server monitoring too?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;xtc start:bot
&lt;span class="go"&gt;
┌──────────────────────────────────────┐
│   XTERMCHAT  ·  BOT SETUP            │
└──────────────────────────────────────┘

▸ SELECT ROOM
  1. @general    OPEN   by KETUT
  2. @alerts     OPEN   by KETUT

▸ Bot name: MONITOR

▸ SELECT BOT TASKS
  1.  Resource Monitor     CPU, RAM, Disk usage
  2.  Process Monitor      Watch if a service dies
  3.  Uptime Watchdog      Ping a URL every N minutes
  4.  Port Checker         Verify ports are open
  5.  SSL Cert Checker     Alert before cert expires
  6.  Log Watcher          Tail a log for keywords
&lt;/span&gt;&lt;span class="c"&gt;  ...
&lt;/span&gt;&lt;span class="go"&gt;
▸ Select tasks: 1,3

✓ Config saved  (bot_id: 1)
✓ Bot started on server  (PID: 24891)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The bot runs as a background process on the VPS. It reads its config from the database, checks at the configured interval, and sends alerts as normal messages to any room you choose.&lt;/p&gt;

&lt;p&gt;An alert looks like this in your chat:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;⚠️ RESOURCE ALERT on srv1260384 [15 Mar 2026 08:30:00]
  CPU   85%  (limit 80%)
  RAM   91%  (limit 85%)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Because it's just a message in a room, you can see it from the terminal TUI, the web admin, or any client connected to the server.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Architecture
&lt;/h2&gt;

&lt;p&gt;The whole thing is two repos.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;xtc-server&lt;/strong&gt; — lives on your VPS:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;xtc-server/
├── server.py       Flask app, all API + bot routes
├── db.py           SQLite init (users, rooms, messages, bots)
├── room.py         Room CRUD, bcrypt passwords
├── connection.py   Message save/retrieval
└── bot_runner.py   Bot background process
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;xtc-client&lt;/strong&gt; — lives on your machine:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;xtc-client/
├── xtc.py          CLI entry point, command dispatcher
├── utils.py        Hardware UUID identity
├── commands/
│   ├── chat.py     Terminal TUI
│   ├── bot.py      Bot setup wizard
│   ├── bot_stop.py Stop/list bots
│   ├── listBots.py List all registered bots
│   └── deleteBot.py Delete bots
└── web/
    ├── app.py      Flask web server (port 5000)
    └── html/       5 admin pages
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The client sends a &lt;code&gt;POST /bot/start&lt;/code&gt; to the server, which spawns &lt;code&gt;bot_runner.py&lt;/code&gt; as a background process. The bot reads its config from the database and starts monitoring. Stop it with &lt;code&gt;xtc stop:bot 1&lt;/code&gt; which sends &lt;code&gt;POST /bot/kill&lt;/code&gt; — the server kills the PID and updates the database.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Web Admin
&lt;/h2&gt;

&lt;p&gt;The web admin surprised me with how useful it turned out. I built it for team members who don't use the terminal, but I ended up using it myself because the chat bubble UI with link previews is genuinely nicer for long conversations.&lt;/p&gt;

&lt;p&gt;The chat page fetches Open Graph metadata for any URL shared in a message — image, title, description, favicon. It's cached per session so the same URL isn't fetched twice.&lt;/p&gt;

&lt;p&gt;One thing worth noting: the web admin uses a &lt;strong&gt;5-digit PIN&lt;/strong&gt; you choose at login, while the CLI uses a &lt;strong&gt;hardware UUID&lt;/strong&gt; auto-generated from your machine. Both work with the same server and the same rooms. The difference is that CLI identity is device-bound (if you reinstall your OS, your PIN changes), while web identity is portable.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I Learned
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;SQLite is underrated.&lt;/strong&gt; The entire server state — users, rooms, messages, bot configs — lives in one file. Backup is &lt;code&gt;cp xtc.db backup.db&lt;/code&gt;. For a team of 2–50 people on a $5 VPS, it's more than enough.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;REST over WebSocket was the right call.&lt;/strong&gt; Polling every 2 seconds is fine for this use case and dramatically simpler to implement, debug, and extend. The bot just makes HTTP requests too — same pattern everywhere.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hardware UUID as identity is surprisingly clean.&lt;/strong&gt; No passwords to remember. Your machine is your identity. The tradeoff is that switching devices requires an admin to reset your entry, but for a small team that's a non-issue.&lt;/p&gt;




&lt;h2&gt;
  
  
  Try It
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Server:&lt;/strong&gt; &lt;a href="https://github.com/dnysaz/xtc-server" rel="noopener noreferrer"&gt;github.com/dnysaz/xtc-server&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Client:&lt;/strong&gt; &lt;a href="https://github.com/dnysaz/xtc-client" rel="noopener noreferrer"&gt;github.com/dnysaz/xtc-client&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Docs:&lt;/strong&gt; &lt;a href="https://xtermchat.vercel.app" rel="noopener noreferrer"&gt;xtermchat.vercel.app&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Setup takes about 10 minutes. The docs cover everything from server setup to HTTPS to the full bot task reference.&lt;/p&gt;

&lt;p&gt;If you run a small team, manage a homelab, or just want your chat data to stay on your own infrastructure — give it a try. And if you find something broken or have a feature idea, issues and pull requests are very welcome.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Built with Python · Runs on a $5 VPS · MIT License&lt;/em&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>flask</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>Try XtermChat | Self Hosted Terminal Chat App</title>
      <dc:creator>Ketut Dana</dc:creator>
      <pubDate>Sat, 14 Mar 2026 05:16:19 +0000</pubDate>
      <link>https://dev.to/ketutdana/try-xtermchat-self-hosted-terminal-chat-app-2njh</link>
      <guid>https://dev.to/ketutdana/try-xtermchat-self-hosted-terminal-chat-app-2njh</guid>
      <description>&lt;p&gt;I got tired of my team's messages living on someone else's server.&lt;/p&gt;

&lt;p&gt;Not because I'm paranoid. Just because I could do better. Slack logs everything. Discord has its own rules. Matrix is powerful but setting it up feels like a weekend project. Mattermost is great — if you have an afternoon and enjoy reading YAML.&lt;/p&gt;

&lt;p&gt;So I built something simpler.&lt;/p&gt;




&lt;h2&gt;
  
  
  What is XtermChat?
&lt;/h2&gt;

&lt;p&gt;XtermChat is a self-hosted chat system that runs entirely in the terminal. You deploy the server on your own VPS, your team connects with a CLI client, and that's it. No accounts, no dashboards, no third-party anything.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌──────────────────────────────────────────────────────────────┐
│                      X T E R M  C H A T                      │
│               For Those Who Speak Terminal.                  │
└──────────────────────────────────────────────────────────────┘

  ▸ COMMANDS
    connect          Connect client to a server
    disconnect       Remove saved server config
    status           Check server connection
    list:rooms       List all available rooms
    create:room      Create a new room
    delete:room      Delete a room permanently
    start:chat       Open interactive chat
    start:web        Open web interface
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Why another chat tool?
&lt;/h2&gt;

&lt;p&gt;Fair question. Here's my honest comparison:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;XtermChat&lt;/th&gt;
&lt;th&gt;Matrix&lt;/th&gt;
&lt;th&gt;Mattermost&lt;/th&gt;
&lt;th&gt;Slack&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Self-hosted&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Open source&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;⚠️ partial&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Setup time&lt;/td&gt;
&lt;td&gt;~5 min&lt;/td&gt;
&lt;td&gt;~2 hrs&lt;/td&gt;
&lt;td&gt;~30 min&lt;/td&gt;
&lt;td&gt;instant&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RAM usage&lt;/td&gt;
&lt;td&gt;~30 MB&lt;/td&gt;
&lt;td&gt;~1–2 GB&lt;/td&gt;
&lt;td&gt;~300 MB&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Terminal-first&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Your data&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The gap I wanted to fill: something that's &lt;strong&gt;self-hosted, lightweight, and actually fast to set up&lt;/strong&gt; — especially for developers who live in the terminal anyway.&lt;/p&gt;




&lt;h2&gt;
  
  
  The setup is genuinely fast
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Server side (your VPS)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/dnysaz/xtc-server.git
&lt;span class="nb"&gt;cd &lt;/span&gt;xtc-server
pip &lt;span class="nb"&gt;install &lt;/span&gt;flask flask-cors
&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw allow 8080
python3 server.py start
&lt;span class="c"&gt;# [*] Server started in background (PID: 12345)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. No database configuration. No config files to edit. SQLite handles everything automatically on first run.&lt;/p&gt;

&lt;h3&gt;
  
  
  Client side (your machine)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/dnysaz/xtc-client.git
&lt;span class="nb"&gt;cd &lt;/span&gt;xtc-client
make &lt;span class="nb"&gt;install
&lt;/span&gt;xtc connect @your-server-ip:8080
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now you're connected. Create a room and start chatting:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;xtc create:room @general
xtc start:chat @general
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Total time from zero to chatting: under 10 minutes, including the time it takes to spin up a VPS.&lt;/p&gt;




&lt;h2&gt;
  
  
  The chat UI
&lt;/h2&gt;

&lt;p&gt;When you run &lt;code&gt;xtc start:chat&lt;/code&gt;, you get a full terminal UI — not just a scrolling log. There's a left sidebar showing your identity and connection info, a right sidebar with room details, and a chat area in the middle.&lt;/p&gt;

&lt;p&gt;A few things I'm particularly happy with:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tab to switch modes.&lt;/strong&gt; Press Tab to move focus from the input box into the chat history. From there you can scroll, select text, and copy it — just like a normal text editor.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Links are clickable.&lt;/strong&gt; URLs in messages show up with underline formatting. Move your cursor to a link and press &lt;code&gt;Ctrl+L&lt;/code&gt; to open it in your browser.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Emoji shortcuts.&lt;/strong&gt; Type &lt;code&gt;:fire&lt;/code&gt; and it converts to 🔥 when you send. Type &lt;code&gt;:e&lt;/code&gt; to see all available shortcuts in a floating panel.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  XtermChat-CLI  |  NODE: mac-dana  |  103.45.67.89  |  [ INPUT ]

  ┌─────────────┬──────────────────────────────────┬─────────────┐
  │ ID          │                                  │ CHANNEL     │
  │  KETUT      │  now  You   ❯  hey everyone!     │  #GENERAL   │
  │             │  2m   John  ❯  hello!            │             │
  │ GATEWAY     │  5m   You   ❯  https://github.com│ CREATOR     │
  │  103.45.7   │                                  │  KETUT      │
  └─────────────┴──────────────────────────────────┴─────────────┘
  ✏️  INPUT MODE  │  ENTER: SEND  │  TAB: → CHAT  │  Ctrl+X: EXIT
   Message ❯❯❯ _
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  How identity works
&lt;/h2&gt;

&lt;p&gt;There's no signup. Your username comes from your system user (&lt;code&gt;whoami&lt;/code&gt;), and your identity is tied to your machine's hardware UUID. First time you send a message, you're automatically registered on the server. If someone else tries to use the same username from a different machine, the server rejects it.&lt;/p&gt;

&lt;p&gt;This means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No passwords to remember for your identity&lt;/li&gt;
&lt;li&gt;No accounts to create&lt;/li&gt;
&lt;li&gt;Your identity is device-bound — which is actually the right behavior for a team tool&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Room passwords are hashed with bcrypt. Only the room creator (verified by hardware PIN) can delete a room or wipe its message history.&lt;/p&gt;




&lt;h2&gt;
  
  
  Web interface included
&lt;/h2&gt;

&lt;p&gt;Not everyone on a team lives in the terminal. So there's also a web UI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;xtc start:web
&lt;span class="c"&gt;# URL: http://localhost:5000&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open it in a browser, enter your server IP, a username, and a 5-digit PIN — that's your identity for the web client. It talks to the same server API as the CLI, so everyone sees the same messages regardless of which client they're using.&lt;/p&gt;




&lt;h2&gt;
  
  
  The stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Backend:&lt;/strong&gt; Python + Flask, SQLite3&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CLI:&lt;/strong&gt; Python with &lt;code&gt;prompt_toolkit&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Web:&lt;/strong&gt; Flask serving plain HTML + vanilla JS&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Auth:&lt;/strong&gt; Hardware UUID (CLI) or user-chosen PIN (web)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Protocol:&lt;/strong&gt; REST API over HTTP or HTTPS&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No Docker required. No Postgres. No Redis. No node_modules. The entire server runs on Python with two pip packages.&lt;/p&gt;




&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;p&gt;A few things I'm thinking about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;End-to-end encryption for messages&lt;/li&gt;
&lt;li&gt;File sharing (small files, inline in chat)&lt;/li&gt;
&lt;li&gt;Webhook support for notifications from CI/CD pipelines&lt;/li&gt;
&lt;li&gt;Federation — connecting multiple servers so teams on different VPS instances can chat&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But honestly the current version already does exactly what I need day to day. Sometimes simple is the right call.&lt;/p&gt;




&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Server: &lt;a href="https://github.com/dnysaz/xtc-server" rel="noopener noreferrer"&gt;github.com/dnysaz/xtc-server&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Client: &lt;a href="https://github.com/dnysaz/xtc-client" rel="noopener noreferrer"&gt;github.com/dnysaz/xtc-client&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is the documentation : &lt;a href="https://xtermchat.vercel.app/" rel="noopener noreferrer"&gt;https://xtermchat.vercel.app/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you're running a small team, managing a homelab, or just want your chat data to stay on your own infrastructure — give it a shot. The setup is fast enough that there's really no reason not to try.&lt;/p&gt;

&lt;p&gt;And if you find something broken or have a feature idea, issues and pull requests are very welcome.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Built with Python. Runs on a $5 VPS. Your data stays yours.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>terminal</category>
      <category>python</category>
      <category>chat</category>
      <category>hosting</category>
    </item>
    <item>
      <title>I Built a Framework That’s 17x Faster Than Laravel : Meet Kuppa.js</title>
      <dc:creator>Ketut Dana</dc:creator>
      <pubDate>Sat, 21 Feb 2026 14:08:24 +0000</pubDate>
      <link>https://dev.to/ketutdana/i-built-a-framework-thats-17x-faster-than-laravel-meet-kuppajs-3fee</link>
      <guid>https://dev.to/ketutdana/i-built-a-framework-thats-17x-faster-than-laravel-meet-kuppajs-3fee</guid>
      <description>&lt;p&gt;Building a web application often feels like a trade-off. You either go with a "batteries-included" framework like Laravel but sacrifice raw performance, or you pick a minimalist tool like Express.js but spend hours wiring up folders, auth, and database connections.&lt;/p&gt;

&lt;p&gt;This past weekend, I decided to stop choosing. I built &lt;strong&gt;Kuppa.js&lt;/strong&gt;, an opinionated, high-performance framework built on top of Express.js, specifically optimized for the Supabase ecosystem.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Kuppa.js?
&lt;/h2&gt;

&lt;p&gt;The goal was simple: &lt;strong&gt;Developer Experience of Laravel + Raw Speed of Node.js.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Express.js is famous for being &lt;em&gt;unopinionated&lt;/em&gt;. It’s just a blank canvas. Kuppa.js turns that canvas into a structured environment. It tells you where your migrations go, how your controllers should look, and comes with Supabase Auth baked in by default. It moves Express from a library to a real framework.&lt;/p&gt;

&lt;h2&gt;
  
  
  The "Brutal" Benchmark: Kuppa vs. Laravel
&lt;/h2&gt;

&lt;p&gt;I didn't want to just claim it’s fast. I ran an &lt;strong&gt;Apache Benchmark (ab)&lt;/strong&gt; with 5,000 requests and a concurrency level of 100 on my local machine.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Setup:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Laravel:&lt;/strong&gt; Serving a static home page (No DB, No Auth).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kuppa.js:&lt;/strong&gt; Serving a home page with &lt;strong&gt;Active Database Session &amp;amp; Auth Check&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The Results:
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Laravel (Static)&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Kuppa.js (Auth + DB)&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Requests per Second&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;63.00 #/sec&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1,043.53 #/sec&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Avg. Latency&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1,587 ms&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;95 ms&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Success Rate&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;100%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Kuppa.js outperformed Laravel by &lt;strong&gt;17x&lt;/strong&gt;, even while doing the heavy lifting of checking authentication. This is the power of a non-blocking I/O combined with a lightweight, opinionated structure.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Features
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Opinionated Structure:&lt;/strong&gt; No more "Where should I put this file?" questions. Standardized Models, Controllers, and Core logic.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Supabase Native:&lt;/strong&gt; Deep integration for Database and Auth out of the box. &lt;/li&gt;
&lt;li&gt; &lt;strong&gt;CLI Driven:&lt;/strong&gt; Manage your database with custom commands like &lt;code&gt;kuppa migrate&lt;/code&gt; and &lt;code&gt;kuppa db&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Security First:&lt;/strong&gt; Database inspections are handled via custom PostgreSQL functions with &lt;code&gt;SECURITY DEFINER&lt;/code&gt; to ensure the CLI is powerful but safe.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  A Weekend Project Gone Open Source
&lt;/h2&gt;

&lt;p&gt;Kuppa.js started as a "home weekend project" to scratch my own itch. It’s now open source because I believe there's a middle ground for developers who love the Supabase stack but miss the structure of a real framework.&lt;/p&gt;

&lt;p&gt;It’s still in its early stages, but the foundation is rock solid. &lt;/p&gt;




&lt;h3&gt;
  
  
  What's Next? Bridging DX and Hardened Security
&lt;/h3&gt;

&lt;p&gt;The core is ready, but a framework is only as good as its stability. My next focus for &lt;strong&gt;Kuppa.js&lt;/strong&gt; is to maximize the developer experience without compromising on security:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Strict Security Layer:&lt;/strong&gt; Implementing a standardized validation layer (via Zod/Joi) to ensure every input is sanitized before it even touches the Supabase RPC. &lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Advanced CLI Generators:&lt;/strong&gt; Expanding the CLI to not only generate boilerplate but also scaffold secure-by-default controllers and models with built-in error handling.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Enhanced Database Inspection:&lt;/strong&gt; Improving the &lt;code&gt;kuppa db&lt;/code&gt; utility to provide deeper insights into Row Level Security (RLS) policies and PostgreSQL performance bottlenecks.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Automated API Documentation:&lt;/strong&gt; Auto-generating Swagger/OpenAPI specs directly from your Kuppa routes to make frontend integration seamless.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Check out the project here:&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/dnysaz/kuppa-app" rel="noopener noreferrer"&gt;https://github.com/dnysaz/kuppa-app&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Start :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx create-kuppa my-kuppa-app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I’m building Kuppa.js to be the go-to for devs who want Laravel’s productivity with Node.js’s performance. I’d love to hear your thoughts—especially on how you handle security in high-performance environments.&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.amazonaws.com%2Fuploads%2Farticles%2Fsoih1db2aonwgjjmh1fo.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.amazonaws.com%2Fuploads%2Farticles%2Fsoih1db2aonwgjjmh1fo.png" alt="image_1" width="800" height="500"&gt;&lt;/a&gt;&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.amazonaws.com%2Fuploads%2Farticles%2F19kyzdheat12quc3xsgh.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.amazonaws.com%2Fuploads%2Farticles%2F19kyzdheat12quc3xsgh.png" alt="image_2" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Critiques are welcome. If you see any bottlenecks in how I handle the Supabase RPC or have suggestions on making the security layer even tighter, please let me know. I'm building this to be a production-ready framework, and your feedback is crucial to making that happen.&lt;/p&gt;

&lt;h1&gt;
  
  
  javascript #nodejs #supabase #webdev #performance
&lt;/h1&gt;

</description>
      <category>javascript</category>
      <category>express</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>dwrite.me update features custom &amp; simple Rich Text Editor</title>
      <dc:creator>Ketut Dana</dc:creator>
      <pubDate>Tue, 10 Feb 2026 07:07:44 +0000</pubDate>
      <link>https://dev.to/ketutdana/dwriteme-update-features-custom-simple-rich-text-editor-4n09</link>
      <guid>https://dev.to/ketutdana/dwriteme-update-features-custom-simple-rich-text-editor-4n09</guid>
      <description>&lt;p&gt;Hello,&lt;/p&gt;

&lt;p&gt;dwrite just got a major upgrade! We’ve officially launched our Custom &amp;amp; Simple Rich Text Editor. This update gives you full control over your formatting: Bold, Italic, Underline, Headings (H1-H6), and Block Quotes.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This is quote!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And for the tech savvy, we’ve added Syntax Highlighting for code snippets, like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&amp;lt;div&amp;gt; hello world &amp;lt;/div&amp;gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I’m really excited about this because now you can style your thoughts exactly how you want. This feature is also optional—you can switch to a distraction-free mode by toggling the button at the bottom of the page.&lt;/p&gt;

&lt;p&gt;Important Note: The Paste function remains disabled in the regular editor to keep our content handcrafted. :) But... I’ve made an exception for the Code Editor—you can paste your snippets there freely! :D&lt;/p&gt;

&lt;p&gt;Another Update: Notifications are live! Whenever someone leaves a comment on your article, you’ll see an alert on your profile.&lt;/p&gt;

&lt;p&gt;That’s all for now. Thank you, and have a good day!&lt;/p&gt;

&lt;p&gt;Please visit at &lt;a href="https://dwrite.me/feed" rel="noopener noreferrer"&gt;https://dwrite.me/feed&lt;/a&gt;&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>sideprojects</category>
      <category>webdev</category>
      <category>writing</category>
    </item>
    <item>
      <title>Let’s Get Back to Real Human Thought with dwrite.me</title>
      <dc:creator>Ketut Dana</dc:creator>
      <pubDate>Mon, 09 Feb 2026 03:44:54 +0000</pubDate>
      <link>https://dev.to/ketutdana/lets-get-back-to-real-human-thought-with-dwriteme-jmp</link>
      <guid>https://dev.to/ketutdana/lets-get-back-to-real-human-thought-with-dwriteme-jmp</guid>
      <description>&lt;p&gt;Lately, the internet has started to feel loud, yet incredibly empty. Every time I browse Google, Medium, or news portals, I run into articles that feel "too perfect." The structure is flawless, the grammar is impeccable, but there is absolutely no soul in them.&lt;/p&gt;

&lt;p&gt;We all know why. It’s AI.&lt;/p&gt;

&lt;p&gt;As a developer, I love technology. But as a human, I’ve started to crave writing that has "scars"—writing that has emotion, rhythm, and is actually born from someone’s messy brain, not a polished prompt.&lt;/p&gt;

&lt;p&gt;That’s why I built dwrite.me.&lt;/p&gt;

&lt;p&gt;An Internet That’s Too Fast&lt;br&gt;
My frustration is simple: We live in an age where everything is expected to be instant. Need a 2,000-word article? One click. Need an opinion? Ask a chatbot.&lt;/p&gt;

&lt;p&gt;But here’s the problem: If everyone is using AI to write, why should we bother reading each other at all? We aren't exchanging thoughts anymore; we are just swapping machine-processed data. Our way of thinking is becoming lazy. We no longer value the "friction" of struggling to find the right words. Yet, that struggle is exactly where our humanity lives.&lt;/p&gt;

&lt;p&gt;The Broken Bridge Between Us&lt;br&gt;
I used to read blogs to feel like I was having a conversation with the author. I could feel their anxiety, their excitement, or even their confusion.&lt;/p&gt;

&lt;p&gt;Now? That bridge feels broken. AI writing is sterile. There are no surprises, no bold opinions, no "wrong" takes. Everything is safe. I’m worried that if we keep going down this path, we’ll forget how to connect honestly through words. We’re becoming content consumers instead of thought appreciators.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;dwrite.me: Back to Basics&lt;/strong&gt;&lt;br&gt;
I built dwrite.me with a very simple concept. In fact, it might be too simple by today's standards.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No AI, Just Friction:&lt;/strong&gt;&lt;br&gt;
I want people to feel the effort of typing again. I want there to be a "clash" between the mind and the keyboard.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pure Minimalism:&lt;/strong&gt; &lt;br&gt;
No clutter, no distractions. No Copy Paste. It’s just you and your message.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Handcrafted:&lt;/strong&gt; &lt;br&gt;
Every word typed here is a conscious choice made by a human being.&lt;/p&gt;

&lt;p&gt;I don’t expect this platform to compete with the giants like Medium or Substack. Not at all. dwrite.me is just a small space for those who still believe that human thought with all its flaws is infinitely more valuable than a text generated by a thousand servers in a matter of seconds.&lt;/p&gt;

&lt;p&gt;If you also feel like the internet is getting drowned in automated "noise," maybe we’re on the same frequency.&lt;/p&gt;

&lt;p&gt;Check it out at dwrite.me. Let’s start thinking again, one slow word at a time.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dwrite.me" rel="noopener noreferrer"&gt;https://dwrite.me&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Open for collaboration. Let’s build this together if you have the same vision.&lt;/p&gt;

</description>
      <category>blog</category>
      <category>article</category>
      <category>ai</category>
      <category>webdev</category>
    </item>
    <item>
      <title>w3site.id cara baru untuk hosting situs statis secara gratis lengkap dengan AI site builder</title>
      <dc:creator>Ketut Dana</dc:creator>
      <pubDate>Tue, 03 Feb 2026 07:57:02 +0000</pubDate>
      <link>https://dev.to/ketutdana/w3siteid-cara-baru-untuk-hosting-situs-statis-secara-gratis-lengkap-dengan-ai-site-builder-1b3m</link>
      <guid>https://dev.to/ketutdana/w3siteid-cara-baru-untuk-hosting-situs-statis-secara-gratis-lengkap-dengan-ai-site-builder-1b3m</guid>
      <description>&lt;p&gt;Halo! Kenalin nih, w3site.id, cara paling sat-set buat kamu yang mau hosting situs statis tanpa ribet. Gak cuma urusan hosting, kamu juga bisa dapet subdomain .w3site.id secara gratis tis tis! Cocok banget buat kamu yang butuh rumah digital buat portofolio atau proyek iseng tapi mau kelihatan tetep pro tanpa harus boncos di awal.&lt;/p&gt;

&lt;p&gt;Yang bikin makin gokil, kita punya fitur AI Site Builder yang beneran jenius. Kamu tinggal ketik konsep situs impianmu, dan boom! AI kita bakal bikinin situs statis instan cuma dalam hitungan detik. Gak cuma itu, fiturnya komplit banget mulai dari bikin landing page simpel, biolink ala-ala selebgram, shortlink, sampai SEO article generator. Bahkan, buat kamu yang lagi mau mulai bisnis, ada fitur cek SWOT juga biar strategi kamu makin matang dan anti-gagal!&lt;/p&gt;

&lt;p&gt;Buat kamu kaum mendang-mending, tenang aja karena ada Paket Gratis yang oke punya. Kamu bisa langsung dapet slot buat 2 situs dengan SSD storage 256MB yang pastinya kenceng. Ini kesempatan emas buat kamu yang mau pamer karya atau sekadar coba-coba bikin sticky notes online sendiri. Yuk, buruan join di w3site.id dan bikin jejak digitalmu jadi lebih keren sekarang juga!&lt;/p&gt;

&lt;p&gt;Kunjungi : &lt;a href="https://w3site.id" rel="noopener noreferrer"&gt;https://w3site.id&lt;/a&gt;&lt;/p&gt;

</description>
      <category>website</category>
      <category>hosting</category>
      <category>webdev</category>
      <category>gratis</category>
    </item>
    <item>
      <title>I Built Clip10: A Real-time Clipboard with "Terminal" Commands</title>
      <dc:creator>Ketut Dana</dc:creator>
      <pubDate>Mon, 29 Dec 2025 09:12:53 +0000</pubDate>
      <link>https://dev.to/ketutdana/i-built-clip10-a-real-time-clipboard-with-terminal-commands-44i4</link>
      <guid>https://dev.to/ketutdana/i-built-clip10-a-real-time-clipboard-with-terminal-commands-44i4</guid>
      <description>&lt;p&gt;*&lt;em&gt;Hi everyone! *&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I want to share a project I’ve been working on called Clip10. It’s basically a web-based clipboard where you can drop links, notes, or images, and they sync across all your devices in real-time.&lt;/p&gt;

&lt;p&gt;But there’s a twist: everything disappears in 10 minutes unless you tell it not to!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why I built this?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Sometimes I just need to move a link or a photo from my laptop to my phone quickly. I don't want to email myself or use a bloated messaging app. I wanted something "frictionless"—just open, type, and done.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Cool Part: Commands in the Editor&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Instead of clicking many buttons, I built a Command-Line Interface (CLI) directly inside the text editor. You just type a command and hit Enter.&lt;/p&gt;

&lt;p&gt;Type these commands in the editor and press &lt;strong&gt;Enter&lt;/strong&gt; to execute:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Command&lt;/th&gt;
&lt;th&gt;Action&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;:help&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Open UI Menu&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Displays the English command reference modal.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;:show-qr&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Share Link&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Generates a QR Code modal for the current session.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;:image&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Share Image&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Upload images to the content.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;:save&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Download&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Exports the current text as a &lt;code&gt;.txt&lt;/code&gt; file.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;:clear&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Wipe Data&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Deletes all text in the editor and syncs with DB.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;:stop-time&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Freeze Timer&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Activates &lt;strong&gt;∞ INFINITY&lt;/strong&gt; mode (Saved to DB).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;:start-time&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Resume Timer&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Restores the 10-minute countdown logic.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;p&gt;&lt;strong&gt;How I made it? (The Tech Stack)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I kept the stack simple but powerful:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Frontend: Plain HTML and Tailwind CSS (I love Dark Mode!).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Database &amp;amp; Real-time: Supabase. This is the MVP here. It handles the live syncing perfectly. When I type on my PC, the text appears on my phone instantly.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Link Engine: I wrote a custom Regex to detect URLs. If you type google.com, it automatically turns blue and clickable.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Previews: I used the Microlink API so that links show a nice visual card (like on Discord or Slack).&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Features at a glance:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Smart Detection: It knows if you're typing a link or just text.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ephemeral by Default: Great for privacy. Your data vanishes after 10 minutes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Local Export: You can save your notes as a .txt file using the :save command.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;QR Handoff: No need to type long URLs on your mobile browser.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What I learned&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Building this project taught me a lot about handling real-time data and how to build a "command processor" in JavaScript. Sometimes, the best UI is actually just a simple text box that can do everything.&lt;/p&gt;

&lt;p&gt;What do you think? Is a 10-minute timer too short, or just right for privacy? I'd love to hear your feedback!&lt;/p&gt;

&lt;p&gt;Check out the documentation in my README for more details.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/dnysaz/clip10" rel="noopener noreferrer"&gt;https://github.com/dnysaz/clip10&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://clip10.vercel.app" rel="noopener noreferrer"&gt;https://clip10.vercel.app&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>supabase</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>Mengembangkan Bahasa Pemrograman Baru, Apakah Masih Relevan Saat Ini?</title>
      <dc:creator>Ketut Dana</dc:creator>
      <pubDate>Thu, 16 Oct 2025 02:27:19 +0000</pubDate>
      <link>https://dev.to/ketutdana/mengembangkan-bahasa-pemrograman-baru-apakah-masih-relevan-saat-ini-13o7</link>
      <guid>https://dev.to/ketutdana/mengembangkan-bahasa-pemrograman-baru-apakah-masih-relevan-saat-ini-13o7</guid>
      <description>&lt;p&gt;&lt;strong&gt;Setiap&lt;/strong&gt; kali seseorang bilang ingin membuat bahasa pemrograman baru, reaksi pertama yang sering muncul adalah tawa kecil atau skeptisisme: &lt;/p&gt;

&lt;p&gt;“&lt;em&gt;Untuk apa? Sudah ada Python, Rust, Go, JavaScript,PHP, Java, C , C++ dan ratusan lainnya.&lt;/em&gt;”&lt;/p&gt;

&lt;h2&gt;
  
  
  Dan saya paham kenapa begitu.
&lt;/h2&gt;

&lt;p&gt;Kita hidup di era di mana hampir semua kebutuhan pengembangan sudah punya alatnya. Ada framework untuk setiap gaya berpikir, ada library untuk setiap masalah, bahkan ada AI yang bisa menulis kode lebih cepat dari manusia. Jadi, muncul pertanyaan yang wajar: &lt;strong&gt;kenapa masih ada orang yang merasa perlu membuat bahasa pemrograman baru?&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Keresahan Itu Datang Dari “&lt;em&gt;Rasa Tidak Cukup&lt;/em&gt;”
&lt;/h2&gt;

&lt;p&gt;Setiap developer pasti pernah merasakan momen di mana mereka tidak puas dengan cara sebuah bahasa memaksa mereka berpikir. Bukan karena bahasanya jelek, tapi karena &lt;em&gt;cara berbahasa itu tidak lagi terasa alami&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Kita terbiasa menyesuaikan diri dengan sintaks, aturan, dan paradigma yang sudah ditentukan. Tapi lama-kelamaan, muncul rasa ingin membalikkan arah: Bagaimana kalau justru &lt;em&gt;bahasa yang menyesuaikan diri dengan cara kita berpikir&lt;/em&gt;?&lt;/p&gt;

&lt;p&gt;Di situlah keresahan itu tumbuh. Bukan soal ingin menciptakan sesuatu yang “lebih baik dari semua bahasa lain”, tapi lebih kepada ingin menemukan &lt;em&gt;cara baru untuk berpikir dan menulis logika.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Apakah Dunia Masih Butuh Bahasa Baru?
&lt;/h2&gt;

&lt;p&gt;Kalau kita bicara efisiensi murni mungkin tidak. Tapi kalau bicara &lt;em&gt;ekspresi, pendidikan, budaya berpikir, dan inovasi&lt;/em&gt;, jawabannya: ya, sangat mungkin.&lt;/p&gt;

&lt;p&gt;Bahasa pemrograman bukan sekadar alat menulis instruksi untuk mesin. Ia juga cara manusia menstrukturkan logika, mengekspresikan ide, dan berkomunikasi dengan sistem. Bahasa baru sering lahir dari ketidakpuasan terhadap batas-batas yang ada — dan justru dari sanalah teknologi berkembang.&lt;/p&gt;

&lt;p&gt;Tidak semua bahasa baru harus menggantikan yang lama. Beberapa mungkin hanya menjadi eksperimen singkat, tapi eksperimen itulah yang mendorong batas pemikiran komunitas developer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Dampaknya Tidak Selalu Besar — Tapi Bisa Bermakna
&lt;/h2&gt;

&lt;p&gt;Kita sering menilai “relevansi” dari seberapa banyak orang yang memakainya. Padahal, terkadang, dampak sejati dari sebuah bahasa bukan pada jumlah penggunanya, tapi pada &lt;strong&gt;cara berpikir baru yang ia tanamkan&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Setiap bahasa membawa filosofi tersendiri:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Ada yang fokus pada kesederhanaan.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ada yang ingin ekstrem dalam efisiensi.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ada yang mencoba mendekatkan manusia dan mesin melalui bentuk ekspresi baru.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Dan di sinilah poin pentingnya: membuat bahasa baru bukan hanya soal menulis compiler, tapi soal menciptakan &lt;em&gt;ruang ide baru&lt;/em&gt; bagi cara manusia memahami teknologi.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bagaimana Saya Memulainya
&lt;/h2&gt;

&lt;p&gt;Awalnya bukan karena ambisi besar, tapi karena rasa penasaran:&lt;/p&gt;

&lt;p&gt;“Bagaimana kalau bahasa ini bisa ditulis dengan cara yang lebih manusiawi?”&lt;/p&gt;

&lt;p&gt;“Bagaimana kalau sintaksnya bisa berbicara dalam cara berpikir yang berbeda?”&lt;/p&gt;

&lt;p&gt;Dari pertanyaan sederhana itu, saya mulai mencatat ide, menulis contoh kecil, bereksperimen dengan parser, dan melihat bagaimana satu baris kode bisa punya makna yang lebih dekat dengan niat penulisnya.&lt;/p&gt;

&lt;p&gt;Itu bukan perjalanan cepat. Membuat bahasa bahkan sekadar prototipe adalah proses panjang antara logika, bahasa manusia, dan kesabaran. Tapi setiap kali satu konsep berhasil dijalankan, ada rasa kepuasan yang tidak tergantikan:rasa bahwa saya sedang mencoba menciptakan “cara berpikir baru”.&lt;/p&gt;

&lt;h2&gt;
  
  
  Penutup
&lt;/h2&gt;

&lt;p&gt;Apakah dunia masih butuh bahasa pemrograman baru? Mungkin tidak untuk efisiensi, tapi &lt;strong&gt;ya untuk evolusi berpikir&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Selama masih ada orang yang merasa bahwa mesin bisa lebih memahami manusia, selama masih ada yang ingin menulis kode dengan rasa ingin tahu, maka selalu ada ruang bagi bahasa baru untuk lahir. Bukan untuk menggantikan, tapi untuk &lt;em&gt;menambah warna dalam cara kita memahami logika dan teknologi&lt;/em&gt;.&lt;/p&gt;

</description>
      <category>computerscience</category>
      <category>discuss</category>
      <category>programming</category>
    </item>
    <item>
      <title>VinotesApp: A Simple and Practical Online Sticky Notes</title>
      <dc:creator>Ketut Dana</dc:creator>
      <pubDate>Tue, 12 Aug 2025 10:07:39 +0000</pubDate>
      <link>https://dev.to/ketutdana/vinotesapp-a-simple-and-practical-online-sticky-notes-14ec</link>
      <guid>https://dev.to/ketutdana/vinotesapp-a-simple-and-practical-online-sticky-notes-14ec</guid>
      <description>&lt;p&gt;Have you ever needed to jot something down quickly without the hassle of heavy apps or carrying around sticky note papers? That’s where &lt;strong&gt;VinotesApp&lt;/strong&gt; comes in as the perfect solution.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is VinotesApp?
&lt;/h2&gt;

&lt;p&gt;VinotesApp is an online note-taking site that works just like sticky notes. The difference is, while sticky notes are physical papers you stick on your desk or laptop, VinotesApp is the digital and online version. So you can access your notes anytime, anywhere, without worrying about losing them.&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.amazonaws.com%2Fuploads%2Farticles%2F7782j9jbv0wujmf5nrp0.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.amazonaws.com%2Fuploads%2Farticles%2F7782j9jbv0wujmf5nrp0.png" alt=" " width="800" height="514"&gt;&lt;/a&gt;&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.amazonaws.com%2Fuploads%2Farticles%2F2e3q4qqtkndfsvaga2j1.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.amazonaws.com%2Fuploads%2Farticles%2F2e3q4qqtkndfsvaga2j1.png" alt=" " width="800" height="513"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Features of VinotesApp
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Easy login with Google account&lt;/strong&gt;No long sign-ups needed — just log in with your Google account.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Create new notes with one click&lt;/strong&gt;Click the “+” button to create a new note, then click outside the note area to save it automatically.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Mark important notes&lt;/strong&gt;Notes marked as important will always appear in front so you don’t miss them.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Customize note colors&lt;/strong&gt;Make your notes more fun and organized by choosing your favorite colors.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&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%2Fbz5q33ods2hk3ehpvs1p.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.amazonaws.com%2Fuploads%2Farticles%2Fbz5q33ods2hk3ehpvs1p.png" alt=" " width="800" height="501"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Technology Behind VinotesApp
&lt;/h2&gt;

&lt;p&gt;VinotesApp is built with lightweight and efficient technology:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Laravel 11 as the backend framework&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Socialite for Google authentication&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;SQLite as a simple, fast, and easy-to-maintain database&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  A Simple Project with Practical Purpose
&lt;/h2&gt;

&lt;p&gt;VinotesApp is a simple project created to solve a common need for quick and easy online note-taking. It’s not packed with dozens of complex features, but focuses on doing one thing well: helping you keep your notes accessible and organized without fuss.&lt;/p&gt;

&lt;h2&gt;
  
  
  Recognized by Laravel News
&lt;/h2&gt;

&lt;p&gt;VinotesApp was also featured by &lt;strong&gt;Laravel News&lt;/strong&gt;, a popular community and news site for Laravel developers. You can check out their LinkedIn post about VinotesApp here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.linkedin.com/posts/laravel-news_the-simplest-online-sticky-notes-app-activity-7331018475634659329-1iI4/" rel="noopener noreferrer"&gt;https://www.linkedin.com/posts/laravel-news_the-simplest-online-sticky-notes-app-activity-7331018475634659329-1iI4/&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Choose VinotesApp?
&lt;/h2&gt;

&lt;p&gt;Because VinotesApp focuses on simplicity and ease of use. No installation, no complicated setup. All your notes are securely stored online and accessible wherever you are.&lt;/p&gt;

&lt;p&gt;Interested? Try it now at &lt;a href="https://www.vinotesapp.com/" rel="noopener noreferrer"&gt;vinotesapp.com&lt;/a&gt; and experience the ease of online note-taking!&lt;/p&gt;

</description>
      <category>php</category>
      <category>laravel</category>
      <category>project</category>
      <category>notes</category>
    </item>
    <item>
      <title>Why I Stopped Chasing the "Cool Stack" Everyone’s Using</title>
      <dc:creator>Ketut Dana</dc:creator>
      <pubDate>Wed, 06 Aug 2025 13:42:19 +0000</pubDate>
      <link>https://dev.to/ketutdana/why-i-stopped-chasing-the-cool-stack-everyones-using-4aim</link>
      <guid>https://dev.to/ketutdana/why-i-stopped-chasing-the-cool-stack-everyones-using-4aim</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;And why that's been the best decision I’ve made for my productivity.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A few years ago, I remember feeling this pressure.&lt;/p&gt;

&lt;p&gt;Everyone was talking about the "right" stack to use.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;You &lt;strong&gt;must&lt;/strong&gt; use React.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You &lt;strong&gt;have to&lt;/strong&gt; build with Docker.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If you’re still using PHP? “Yikes, bro.”&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At first, I tried to keep up.I thought maybe I was falling behind. Maybe I was doing it wrong.&lt;/p&gt;

&lt;p&gt;But the more I tried to force myself to follow the “industry standard,” the more I realized:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The industry doesn't know what I’m building.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So I stopped.&lt;/p&gt;

&lt;h3&gt;
  
  
  What I Actually Needed
&lt;/h3&gt;

&lt;p&gt;I work on small web apps. Sometimes for myself. Sometimes for clients.Most of the time, I don’t need Kubernetes. Or TypeScript. Or an entire CI/CD pipeline just to post a blog.&lt;/p&gt;

&lt;p&gt;What I &lt;em&gt;do&lt;/em&gt; need is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;A simple backend that runs&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A form that works&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A layout I can style quickly&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Something I can ship fast and maintain alone&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That’s it. I don’t need a spaceship. I need a scooter.&lt;/p&gt;

&lt;h3&gt;
  
  
  I Even Built My Own Framework
&lt;/h3&gt;

&lt;p&gt;Yeah. Instead of chasing tools I didn’t enjoy, I built something I actually like using.&lt;/p&gt;

&lt;p&gt;I called it &lt;strong&gt;VeltoPHP&lt;/strong&gt;. It’s not big. It’s not fancy.It’s just something that makes sense &lt;em&gt;for me&lt;/em&gt;.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Laravel was powerful, but too heavy for what I wanted.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;I didn’t want to depend on updates or breaking changes from packages I don’t use.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;I wanted to enjoy building again.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Is it better than Laravel? Nope.Is it better &lt;em&gt;for me&lt;/em&gt;? 100%.&lt;/p&gt;

&lt;h3&gt;
  
  
  A Great Stack Isn’t the One Everyone Uses — It’s the One You Understand
&lt;/h3&gt;

&lt;p&gt;I’ve seen people throw shade at PHP, at jQuery, at whatever’s not trendy.I’ve also seen indie developers build solid, profitable apps with those exact tools.&lt;/p&gt;

&lt;p&gt;And that’s when it hit me:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Most of the time, “best practices” just mean “what works best for me.”&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If it works, it works.If you understand it, and you can move fast with it — that’s your stack.&lt;/p&gt;

&lt;h3&gt;
  
  
  Stop Telling People What Stack They &lt;em&gt;Have&lt;/em&gt; to Use
&lt;/h3&gt;

&lt;p&gt;We all build different things.&lt;/p&gt;

&lt;p&gt;Some of us work in big teams.Some of us are solo developers.Some are launching startups.Some are building projects after work with limited time and energy.&lt;/p&gt;

&lt;p&gt;Why should we all use the same tools?&lt;/p&gt;

&lt;p&gt;Why should we shame someone for choosing something &lt;em&gt;they&lt;/em&gt; are comfortable with?&lt;/p&gt;

&lt;h3&gt;
  
  
  Idealism Is Cool — As Long As It’s Not Fanaticism
&lt;/h3&gt;

&lt;p&gt;Look, I love seeing developers who care deeply about clean architecture, patterns, and performance.But I also think there’s a line between sharing knowledge and forcing opinions.&lt;/p&gt;

&lt;p&gt;Not everyone has the same goals.Not everyone has the same constraints.&lt;/p&gt;

&lt;p&gt;The moment we forget that, we stop building community — and start building echo chambers.&lt;/p&gt;

&lt;h3&gt;
  
  
  What Actually Matters
&lt;/h3&gt;

&lt;p&gt;At the end of the day, I don’t want to be remembered for the stack I used.I want to be remembered for the things I built — and the problems I solved.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The best tech choice is the one that lets you ship, learn, and grow.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;No stack will magically make you a better developer.But choosing the &lt;em&gt;right&lt;/em&gt; stack for your needs? That’s wisdom.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;I don’t care if you're using PHP, Go, Ruby, or Vanilla JS.What matters is: Are you building something that matters &lt;em&gt;to you&lt;/em&gt;?&lt;/p&gt;

&lt;p&gt;If the answer is yes — you’re doing great.&lt;/p&gt;

&lt;p&gt;And if anyone tells you otherwise, just remember:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;You don’t need their permission to build your way.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  What About You?
&lt;/h3&gt;

&lt;p&gt;Have you ever felt pressured to use a certain tech stack?Or are you already walking your own path?&lt;/p&gt;

&lt;p&gt;Drop a comment — I’d love to hear your story.&lt;/p&gt;

</description>
      <category>coding</category>
      <category>programming</category>
      <category>explore</category>
      <category>hobby</category>
    </item>
    <item>
      <title>Hack Shared Hosting: Use Composer 2 + PHP 8.3 Without Root Access!</title>
      <dc:creator>Ketut Dana</dc:creator>
      <pubDate>Thu, 31 Jul 2025 07:42:34 +0000</pubDate>
      <link>https://dev.to/ketutdana/hack-shared-hosting-use-composer-2-php-83-without-root-access-17j8</link>
      <guid>https://dev.to/ketutdana/hack-shared-hosting-use-composer-2-php-83-without-root-access-17j8</guid>
      <description>&lt;p&gt;Because sometimes, all you need is a modern dev environment — and your hosting provider says no 😤&lt;/p&gt;

&lt;h1&gt;
  
  
  The Shared Hosting Problem
&lt;/h1&gt;

&lt;p&gt;If you're on a typical shared hosting (especially with cPanel):&lt;/p&gt;

&lt;p&gt;❌ Composer is stuck at version 1.x&lt;/p&gt;

&lt;p&gt;❌ CLI PHP version is ancient (sometimes PHP 5.6 🤯)&lt;/p&gt;

&lt;p&gt;❌ You can't install tools globally or change system settings&lt;/p&gt;

&lt;p&gt;But you need Composer 2 and PHP 8.3+ to run modern frameworks like Laravel, Symfony, or even custom ones.&lt;/p&gt;

&lt;h1&gt;
  
  
  What You’ll Achieve
&lt;/h1&gt;

&lt;p&gt;Without root, you’ll get:&lt;/p&gt;

&lt;p&gt;✅ PHP 8.3 CLI — not just for .htaccess, but for terminal too&lt;br&gt;
✅ Composer 2.8+ installed globally (in your user space)&lt;br&gt;
✅ A persistent setup (survives logout or server reboot)&lt;/p&gt;
&lt;h1&gt;
  
  
  Step 1: Create a Local ~/bin Folder
&lt;/h1&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;
&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; ~/bin

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This is where we'll install your personal Composer binary.&lt;/p&gt;
&lt;h1&gt;
  
  
  Step 2: Install Composer 2 Locally
&lt;/h1&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;
&lt;span class="nb"&gt;cd&lt;/span&gt; ~/bin
php &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s2"&gt;"copy('https://getcomposer.org/installer', 'composer-setup.php');"&lt;/span&gt;
php composer-setup.php &lt;span class="nt"&gt;--install-dir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;~/bin &lt;span class="nt"&gt;--filename&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;composer
php &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s2"&gt;"unlink('composer-setup.php');"&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;✅ This will install composer into ~/bin/composer.&lt;/p&gt;

&lt;p&gt;Make sure you're using the correct PHP binary (we’ll handle that next).&lt;/p&gt;
&lt;h1&gt;
  
  
  Step 3: Add ~/bin to Your Shell PATH
&lt;/h1&gt;

&lt;p&gt;Edit ~/.bashrc and add this line:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;/bin:&lt;/span&gt;&lt;span class="nv"&gt;$PATH&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or via terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'export PATH="$HOME/bin:$PATH"'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; ~/.bashrc

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This makes your local composer override any global one.&lt;/p&gt;

&lt;h1&gt;
  
  
  Step 4: Ensure .bashrc Loads on Login
&lt;/h1&gt;

&lt;p&gt;If you're using ~/.bash_profile, make sure it sources .bashrc:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'source ~/.bashrc'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; ~/.bash_profile

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Step 5: Use the PHP Version You Want (e.g., PHP 8.3)
&lt;/h1&gt;

&lt;p&gt;Most shared hostings offer multiple PHP versions stored in /opt/alt/, such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;
/opt/alt/php83/usr/bin/php

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To use PHP 8.3:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;
&lt;span class="nb"&gt;alias &lt;/span&gt;&lt;span class="nv"&gt;php&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'/opt/alt/php83/usr/bin/php'&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To make this permanent:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"alias php='/opt/alt/php83/usr/bin/php'"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; ~/.bashrc

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now every php command will use PHP 8.3.&lt;/p&gt;

&lt;h1&gt;
  
  
  Final Step: Reload Shell
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;
&lt;span class="nb"&gt;source&lt;/span&gt; ~/.bashrc

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or logout and SSH back in.&lt;/p&gt;

&lt;h1&gt;
  
  
  Test Your Setup
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;
which php
php &lt;span class="nt"&gt;-v&lt;/span&gt;

which composer
composer &lt;span class="nt"&gt;-V&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Expected output:
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;
~/bin/composer
Composer version 2.8.x
PHP version 8.3.x &lt;span class="o"&gt;(&lt;/span&gt;/opt/alt/php83/usr/bin/php&lt;span class="o"&gt;)&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Why This Works
&lt;/h1&gt;

&lt;p&gt;Shared hosting doesn’t restrict what you do inside your own home directory&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;We installed Composer locally and adjusted your shell environment&lt;/li&gt;
&lt;li&gt;We aliased php to point to the correct version&lt;/li&gt;
&lt;li&gt;No root required, nothing breaks the server&lt;/li&gt;
&lt;li&gt;You just created your own dev environment inside a locked-down system .&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Final Words
&lt;/h1&gt;

&lt;p&gt;You just outsmarted your shared hosting provider.&lt;br&gt;
PHP 8.3 and Composer 2 — on your terms, no root, no VPS, no extra cost.&lt;/p&gt;

&lt;p&gt;If this helped you, share it with fellow devs.&lt;br&gt;
Because we all deserve a real dev environment, even on the cheapest hosting plans.&lt;/p&gt;

&lt;h1&gt;
  
  
  Happy Coding!
&lt;/h1&gt;

&lt;p&gt;image credit : &lt;a href="http://www.freepik.com" rel="noopener noreferrer"&gt;Designed by fullvector / Freepik&lt;/a&gt;&lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>composer</category>
      <category>php</category>
      <category>hack</category>
    </item>
    <item>
      <title>Saya Membuat VeltoPHP Karena Laravel Terlalu Luar Biasa untuk Saya yang Suka Membuat Sesuatu yang Sederhana</title>
      <dc:creator>Ketut Dana</dc:creator>
      <pubDate>Thu, 24 Jul 2025 10:28:21 +0000</pubDate>
      <link>https://dev.to/ketutdana/saya-membuat-veltophp-karena-laravel-terlalu-luar-biasa-untuk-saya-yang-suka-membuat-sesuatu-yang-5dcb</link>
      <guid>https://dev.to/ketutdana/saya-membuat-veltophp-karena-laravel-terlalu-luar-biasa-untuk-saya-yang-suka-membuat-sesuatu-yang-5dcb</guid>
      <description>&lt;p&gt;Halo! 👋&lt;br&gt;&lt;br&gt;
Nama saya KetutDana, dan saya ingin berbagi cerita pribadi — tentang bagaimana dan &lt;em&gt;kenapa&lt;/em&gt; saya akhirnya menciptakan sebuah framework PHP bernama &lt;strong&gt;VeltoPHP&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Awal Mula: Dari HTML ke PHP
&lt;/h2&gt;

&lt;p&gt;Saya mulai belajar programming pada tahun 2017. Waktu itu, saya bekerja bersama sepupu saya, yang juga memperkenalkan saya pada dunia koding.&lt;/p&gt;

&lt;p&gt;Proyek pertama saya sangat sederhana — hanya sebuah website statis berbasis HTML dan CSS. Tanpa backend. Tanpa framework. Bukan karena saya tidak ingin menggunakannya, tapi karena saya bahkan &lt;strong&gt;tidak tahu&lt;/strong&gt; mereka itu apa.&lt;/p&gt;

&lt;p&gt;Saya bukan lulusan IT. Tidak punya latar belakang pendidikan formal di bidang ini. Hanya ada satu hal yang saya bawa: &lt;strong&gt;rasa ingin tahu dan minat belajar yang tinggi.&lt;/strong&gt; Itu yang menjadi bahan bakar saya sejak hari pertama.&lt;/p&gt;




&lt;h2&gt;
  
  
  Mengenal PHP dan Belajar Backend
&lt;/h2&gt;

&lt;p&gt;Sepupu saya memperkenalkan saya ke bahasa pemrograman pertama saya: &lt;strong&gt;PHP&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
Kenapa PHP? Karena dia bisa PHP. 😄&lt;/p&gt;

&lt;p&gt;Awalnya saya bingung — kenapa kita perlu backend? Apa itu database? Apa itu CRUD?&lt;/p&gt;

&lt;p&gt;Semua itu asing.&lt;/p&gt;

&lt;p&gt;Tapi waktu berjalan, dan sedikit demi sedikit saya mulai &lt;em&gt;paham&lt;/em&gt;. (Bukan langsung mahir, hanya paham konsep dasarnya.)&lt;/p&gt;

&lt;p&gt;Saya ingat betul, proyek PHP pertama saya adalah membuat &lt;strong&gt;clone WhatsApp&lt;/strong&gt; menggunakan Bootstrap dan PHP murni. Kodenya sangat mentah, tidak aman, bahkan rentan terhadap SQL Injection — tapi itu adalah titik awal penting bagi saya.&lt;/p&gt;

&lt;p&gt;Itu adalah &lt;strong&gt;awal dari semuanya.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Ketemu Laravel — dan Jatuh Cinta
&lt;/h2&gt;

&lt;p&gt;Setelah cukup bermain-main dengan PHP murni, saya menemukan sebuah framework bernama &lt;strong&gt;Laravel&lt;/strong&gt;. Waktu itu Laravel 5 sedang populer. Saya mencobanya dan... wow!&lt;/p&gt;

&lt;p&gt;Saya sangat kagum. Laravel terasa elegan, lengkap, dan sangat nyaman digunakan. Saya mulai membuat berbagai proyek pribadi dengan Laravel — tidak untuk dipublikasikan, hanya untuk belajar dan bersenang-senang.&lt;/p&gt;

&lt;p&gt;Tahun 2021, saya menggunakan Laravel 8 untuk hampir semua proyek saya.&lt;/p&gt;




&lt;h2&gt;
  
  
  Tapi Lama-lama Laravel Terlalu Besar untuk Saya
&lt;/h2&gt;

&lt;p&gt;Semakin hari, Laravel semakin berkembang. Laravel 9, 10, 11, 12 — semuanya luar biasa. Tapi di sisi lain, saya mulai merasa "kecil".&lt;/p&gt;

&lt;p&gt;Saya ini programmer hobi. Saya suka ngoding untuk mengisi waktu, bukan untuk mengelola sistem enterprise berskala besar. Saya ingin bikin proyek-proyek kecil, ringan, dan sederhana.&lt;/p&gt;

&lt;p&gt;Laravel jadi terasa terlalu kompleks untuk kebutuhan saya.&lt;br&gt;&lt;br&gt;
Seolah saya hanya seekor semut yang mencoba naik gajah.&lt;/p&gt;




&lt;h2&gt;
  
  
  Lahirnya VeltoPHP
&lt;/h2&gt;

&lt;p&gt;Awal tahun 2025, saya mulai memikirkan blueprint framework sendiri:&lt;br&gt;&lt;br&gt;
Sebuah framework yang tetap enak digunakan, memiliki gaya penulisan seindah Laravel, &lt;strong&gt;tapi jauh lebih ringan dan fokus untuk hal-hal sederhana&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Lahirlah &lt;strong&gt;VeltoPHP&lt;/strong&gt;, sebuah micro-framework yang awalnya mengusung konsep &lt;strong&gt;RVC (Route-View-Controller)&lt;/strong&gt; — versi super ringan dari MVC, tanpa database, tanpa ORM, tanpa embel-embel.&lt;/p&gt;

&lt;p&gt;Tujuannya sederhana:&lt;br&gt;&lt;br&gt;
Untuk membuat &lt;strong&gt;website statis dan aplikasi kecil&lt;/strong&gt; dengan cepat dan nyaman.&lt;/p&gt;




&lt;h2&gt;
  
  
  Lalu Hadirlah Axion
&lt;/h2&gt;

&lt;p&gt;Tapi kemudian saya sadar:&lt;br&gt;&lt;br&gt;
VeltoPHP terlalu sederhana jika tidak ada dukungan backend yang proper. Kalau tidak bisa konek ke database dan tidak bisa menangani login, buat apa ada framework?&lt;/p&gt;

&lt;p&gt;Akhirnya saya membuat modul tambahan bernama &lt;strong&gt;Axion&lt;/strong&gt; — semacam plugin auth &amp;amp; model — agar VeltoPHP bisa berubah menjadi framework fullstack jika dibutuhkan.&lt;/p&gt;

&lt;p&gt;Tapi ternyata... itu tidak cukup. Banyak error muncul jika pengguna tidak menggunakan Axion dengan benar. Arsitektur awalnya terlalu rapuh.&lt;/p&gt;




&lt;h2&gt;
  
  
  Saran yang Mengubah Arah: HMVC
&lt;/h2&gt;

&lt;p&gt;Dari komunitas Dev.to, saya dapat masukan berharga:&lt;br&gt;&lt;br&gt;
&lt;strong&gt;"Kenapa tidak pakai arsitektur modular, seperti HMVC?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Saran itu membuka pikiran saya. Saya pelajari konsep HMVC dan menyadari bahwa:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Modul bisa lebih terisolasi&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Bug tidak menyebar ke seluruh sistem&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Pengembangan jadi lebih fleksibel&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Akhirnya, lahirlah &lt;strong&gt;VeltoPHP V.2&lt;/strong&gt;, dengan arsitektur &lt;strong&gt;HMVC&lt;/strong&gt;, sistem &lt;strong&gt;middleware&lt;/strong&gt;, dan built-in &lt;strong&gt;auth module (Axion)&lt;/strong&gt; yang kini menjadi bagian inti dari VeltoPHP, bukan ekstensi terpisah.&lt;/p&gt;




&lt;h2&gt;
  
  
  Status Saat Ini
&lt;/h2&gt;

&lt;p&gt;VeltoPHP V.2 masih dalam tahap pengembangan aktif.&lt;br&gt;&lt;br&gt;
Belum saya sarankan untuk digunakan di production. Tapi untuk pembelajaran, prototyping, atau eksperimen backend ringan — VeltoPHP sudah cukup menyenangkan digunakan.&lt;/p&gt;




&lt;h2&gt;
  
  
  Harapan Saya
&lt;/h2&gt;

&lt;p&gt;Saya tahu saya bukan siapa-siapa. Saya bukan developer besar.&lt;/p&gt;

&lt;p&gt;Tapi saya punya mimpi kecil:&lt;br&gt;&lt;br&gt;
Saya ingin VeltoPHP bisa bermanfaat — setidaknya untuk orang-orang seperti saya.&lt;br&gt;&lt;br&gt;
Orang yang suka ngoding, bukan untuk membangun startup 1 miliar dolar, tapi hanya untuk membangun sesuatu yang sederhana, belajar sesuatu yang baru, dan bersenang-senang dengan kode.&lt;/p&gt;

&lt;p&gt;Kalau kamu tertarik ikut mengembangkan VeltoPHP, saya akan sangat senang.&lt;br&gt;&lt;br&gt;
Framework ini open source dan selalu terbuka untuk kontribusi dari siapa pun.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Salam,&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
KetutDana&lt;br&gt;&lt;br&gt;
&lt;em&gt;Creator of VeltoPHP&lt;/em&gt;&lt;br&gt;&lt;br&gt;
➡️ &lt;a href="https://github.com/veltophp" rel="noopener noreferrer"&gt;github.com/veltophp&lt;/a&gt;&lt;/p&gt;

</description>
      <category>veltophp</category>
      <category>php</category>
      <category>framework</category>
      <category>laravel</category>
    </item>
  </channel>
</rss>
