<?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: Boy Offi9</title>
    <description>The latest articles on DEV Community by Boy Offi9 (@boyoffi9).</description>
    <link>https://dev.to/boyoffi9</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%2F4109469%2Fc6279faa-3e4c-4a69-8640-0ceb399e24a4.jpg</url>
      <title>DEV Community: Boy Offi9</title>
      <link>https://dev.to/boyoffi9</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/boyoffi9"/>
    <language>en</language>
    <item>
      <title>I Got Tired of Making Normal Portfolio Websites, So I Built an OS Instead</title>
      <dc:creator>Boy Offi9</dc:creator>
      <pubDate>Thu, 24 Sep 2026 14:50:58 +0000</pubDate>
      <link>https://dev.to/boyoffi9/i-got-tired-of-making-normal-portfolio-websites-so-i-built-an-os-instead-20d</link>
      <guid>https://dev.to/boyoffi9/i-got-tired-of-making-normal-portfolio-websites-so-i-built-an-os-instead-20d</guid>
      <description>&lt;h2&gt;
  
  
  I Got Tired of Making Normal Portfolio Websites, So I Built an OS Instead
&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fx04rd6rz5i5g0wuyl17k.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%2Fx04rd6rz5i5g0wuyl17k.png" alt="A screenshot of the Boy Offi9 WM desktop interface showing windows, an app drawer, and system elements" width="" height=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I wanted my portfolio to be more than a collection of pages saying what I can build.&lt;/p&gt;

&lt;p&gt;They usually follow the same pattern:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;About → Projects → Skills → Contact&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;So I decided to do something different.&lt;/p&gt;

&lt;p&gt;I built &lt;strong&gt;Boy Offi9 WM&lt;/strong&gt; — a browser-based personal operating environment where my portfolio is presented as an interactive desktop/mobile system instead of a traditional website.&lt;/p&gt;

&lt;p&gt;It has a boot sequence, desktop, windows, app drawer, terminal, mobile interface, filesystem-style apps like &lt;code&gt;about.md&lt;/code&gt;, &lt;code&gt;projects&lt;/code&gt;, and &lt;code&gt;skills.json&lt;/code&gt;, and a bunch of small details that probably didn't need to exist. 😅&lt;/p&gt;

&lt;p&gt;The goal wasn't to recreate Windows, Linux, or Android. I wanted to build something with its own visual language and interaction model.&lt;/p&gt;

&lt;p&gt;It's still a portfolio underneath everything.&lt;/p&gt;

&lt;p&gt;The difference is that &lt;strong&gt;you don't just read it — you explore it.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I like taking familiar ideas, changing the angle, and giving them their own identity.&lt;/p&gt;

&lt;p&gt;This is one of those experiments.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Build. Break. Understand.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;👉 &lt;a href="https://www.boy-offi9-inc.my.id/" rel="noopener noreferrer"&gt;Try Boy Offi9 WM&lt;/a&gt;&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>webdev</category>
      <category>frontend</category>
      <category>portfolio</category>
    </item>
    <item>
      <title>HexForge Gateway: APK reverse engineering with Claude, running on your phone</title>
      <dc:creator>Boy Offi9</dc:creator>
      <pubDate>Thu, 24 Sep 2026 12:39:34 +0000</pubDate>
      <link>https://dev.to/boyoffi9/hexforge-gateway-apk-reverse-engineering-with-claude-running-on-your-phone-1lcf</link>
      <guid>https://dev.to/boyoffi9/hexforge-gateway-apk-reverse-engineering-with-claude-running-on-your-phone-1lcf</guid>
      <description>&lt;p&gt;Reverse-engineering an APK usually means juggling jadx, apktool, adb, frida and a pile of terminal tabs. I built &lt;strong&gt;HexForge Gateway&lt;/strong&gt; to put all of that behind one self-hosted API, and to expose it as native &lt;a href="https://modelcontextprotocol.io" rel="noopener noreferrer"&gt;MCP&lt;/a&gt; tools so Claude can drive the whole workflow.&lt;/p&gt;

&lt;p&gt;It runs entirely on-device (Termux + MT Manager on Android) or on a normal PC. No cloud, no accounts.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it does
&lt;/h2&gt;

&lt;p&gt;Everything flows through one model:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Workspace -&amp;gt; Workflow -&amp;gt; Jobs -&amp;gt; Tasks -&amp;gt; MCP Agents&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;8 agents&lt;/strong&gt;: jadx, apktool, APKiD, adb, frida, a filesystem agent, an AI-provider agent, and &lt;code&gt;apkmcp&lt;/code&gt;, a client for MT Manager's built-in APK MCP service&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;19 MCP tools&lt;/strong&gt; exposing those agents to Claude Desktop, Claude Code, Cursor and other MCP clients&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Job and Workflow engines&lt;/strong&gt; to chain steps and track their state&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Knowledge engine&lt;/strong&gt; so findings from one task are available to the next&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Live updates&lt;/strong&gt; over WebSocket (&lt;code&gt;task:update&lt;/code&gt;, &lt;code&gt;job:update&lt;/code&gt;, &lt;code&gt;workflow:update&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;9 AI providers&lt;/strong&gt; and a plugin system, if you want to extend it&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Storage is local files by default, with Supabase as an opt-in backend.&lt;/p&gt;

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



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/boy-offi9-inc/hexforge-gateway
&lt;span class="nb"&gt;cd &lt;/span&gt;hexforge-gateway
npm &lt;span class="nb"&gt;install
cp&lt;/span&gt; .env.example .env
npm run dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The Gateway starts on &lt;code&gt;http://localhost:8080&lt;/code&gt; and prints copy-pasteable commands. Create a workspace:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; PUT http://localhost:8080/workspaces/by-name/my-project &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"targetLabel":"com.example.app"}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Then register the MCP server with your client. The steps are in &lt;code&gt;docs/MCP_SERVER.md&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  Running it on a phone
&lt;/h2&gt;

&lt;p&gt;The part I'm happiest with: on Android, the Gateway runs in Termux and talks to MT Manager's APK MCP over loopback, so the whole stack lives on one device. There's a step-by-step guide with screenshots in &lt;code&gt;docs/MT_MANAGER.md&lt;/code&gt;, including the one setting (the floating ball) that keeps the service alive in the background.&lt;/p&gt;
&lt;h2&gt;
  
  
  How it's built
&lt;/h2&gt;

&lt;p&gt;TypeScript, Fastify, Zod, Node 20+. Modules talk through an event bus. CI runs typecheck, build, a real smoke test against a live instance, and an MCP handshake check on every push. Releases are automated: bump the version in &lt;code&gt;package.json&lt;/code&gt; and it tags and publishes.&lt;/p&gt;
&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Per-workspace scoping for WebSocket connections&lt;/li&gt;
&lt;li&gt;A web interface&lt;/li&gt;
&lt;li&gt;A watched folder for APKs on PC, instead of typing full paths&lt;/li&gt;
&lt;li&gt;Streamable HTTP transport for the MCP server, so remote clients can connect&lt;/li&gt;
&lt;li&gt;A proper unit and integration test suite&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Use it responsibly
&lt;/h2&gt;

&lt;p&gt;Only analyze apps you own or have permission to test.&lt;/p&gt;

&lt;p&gt;MIT licensed. Feedback, issues and PRs are welcome:&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/boy-offi9-inc" rel="noopener noreferrer"&gt;
        boy-offi9-inc
      &lt;/a&gt; / &lt;a href="https://github.com/boy-offi9-inc/hexforge-gateway" rel="noopener noreferrer"&gt;
        hexforge-gateway
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Self-hosted reverse-engineering workspace API — orchestrates jadx/apktool/adb/frida/APKiD via a job &amp;amp; workflow engine, exposed as native MCP tools for Claude. No cloud required.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;HexForge Gateway&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;
  &lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/a4f693a2619ea0238d5e5e982329fc56ea5e05a6c485a5cc8933218bb56662aa/68747470733a2f2f692e6962622e636f2f4c443451513036382f66696c652d30303030303030303063323838316634393966303135343365366432326638632e706e67"&gt;&lt;img src="https://camo.githubusercontent.com/a4f693a2619ea0238d5e5e982329fc56ea5e05a6c485a5cc8933218bb56662aa/68747470733a2f2f692e6962622e636f2f4c443451513036382f66696c652d30303030303030303063323838316634393966303135343365366432326638632e706e67" alt="HexForge Gateway" width="360"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
  &lt;a href="https://github.com/boy-offi9-inc/hexforge-gateway/actions/workflows/ci.yml" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/6f33003e8f1712e015096363fbb81ff5132cd8682af6c6b14122bbeab8109cd2/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f616374696f6e732f776f726b666c6f772f7374617475732f626f792d6f666669392d696e632f686578666f7267652d676174657761792f63692e796d6c3f6272616e63683d6d61696e267374796c653d666f722d7468652d6261646765266c6162656c3d4349266c6f676f3d676974687562616374696f6e73266c6f676f436f6c6f723d776869746526636f6c6f723d304541354539" alt="CI status"&gt;&lt;/a&gt;
  &lt;a href="https://github.com/boy-offi9-inc/hexforge-gateway/LICENSE" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/1e0db84cd73c7d64a3d770bf03d4a87cab4657ed50b82733dfa354bab2f434bf/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d4d49542d3742324646373f7374796c653d666f722d7468652d6261646765266c6f676f3d6f70656e736f75726365696e6974696174697665266c6f676f436f6c6f723d7768697465" alt="MIT License"&gt;&lt;/a&gt;
  &lt;a href="https://nodejs.org" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/fbad2d55d20cf6db3ebe0f8a520ff03314f98ac83d065690758bbee78c01d0df/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6e6f64652d25334525334432302d3333393933333f7374796c653d666f722d7468652d6261646765266c6f676f3d6e6f6465646f746a73266c6f676f436f6c6f723d7768697465" alt="Node &gt;= 20"&gt;&lt;/a&gt;
  &lt;a href="https://www.typescriptlang.org" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/fa5df0cde661590c7258b4ab55c011a51d18713945e65cdc3874a5b8cc5b8602/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f547970655363726970742d352e352d3331373843363f7374796c653d666f722d7468652d6261646765266c6f676f3d74797065736372697074266c6f676f436f6c6f723d7768697465" alt="TypeScript"&gt;&lt;/a&gt;
  &lt;a href="https://fastify.dev" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/7f92572bbd5356bafa9ac5869596fcc03a952360541eeaa7cd83c4a71d495802/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f466173746966792d352d3030303030303f7374796c653d666f722d7468652d6261646765266c6f676f3d66617374696679266c6f676f436f6c6f723d7768697465" alt="Fastify"&gt;&lt;/a&gt;
  &lt;br&gt;
  &lt;a href="https://github.com/boy-offi9-inc/hexforge-gateway/docs/SETUP.md" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/88fe0b3697db1d8fcef11109e8f5d766b4f34fb426380b48a61dd01a19f7f0df/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f72756e732532306f6e2d5465726d757825323025374325323050432d3045413545393f7374796c653d666f722d7468652d6261646765266c6f676f3d7465726d7578266c6f676f436f6c6f723d7768697465" alt="Runs on Termux or PC"&gt;&lt;/a&gt;
  &lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/1b2205864b42ef94f608e128909c473065fbff2b163a4602283ec4f7bffc5882/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f636c6f75642d6f7074696f6e616c2d3742324646373f7374796c653d666f722d7468652d6261646765266c6f676f3d69636c6f7564266c6f676f436f6c6f723d7768697465"&gt;&lt;img src="https://camo.githubusercontent.com/1b2205864b42ef94f608e128909c473065fbff2b163a4602283ec4f7bffc5882/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f636c6f75642d6f7074696f6e616c2d3742324646373f7374796c653d666f722d7468652d6261646765266c6f676f3d69636c6f7564266c6f676f436f6c6f723d7768697465" alt="Cloud optional"&gt;&lt;/a&gt;
  &lt;a href="https://github.com/boy-offi9-inc/hexforge-gateway/CONTRIBUTING.md" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/e969122d9f18341b82fda8fdfb293bc90a0ccfe2635935d40198d0787b507218/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5052732d77656c636f6d652d4646343738353f7374796c653d666f722d7468652d6261646765266c6f676f3d676974687562266c6f676f436f6c6f723d7768697465" alt="PRs welcome"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;AI-assisted APK reverse-engineering workspace API. Dispatches tasks to
MCP agents (jadx, apktool, adb, frida, filesystem, MT Manager's APK MCP
AI providers) and streams updates over WebSocket. Runs entirely on-device
(Termux + MT Manager on Android) or on a normal PC - no cloud required.&lt;/p&gt;
&lt;p&gt;Flow: &lt;code&gt;Workspace -&amp;gt; Workflow -&amp;gt; Jobs -&amp;gt; Tasks -&amp;gt; MCP Agents&lt;/code&gt;, with modules
talking through an Event Bus. MIT licensed. Contributing: run
&lt;code&gt;npm run typecheck &amp;amp;&amp;amp; npm run build &amp;amp;&amp;amp; ./scripts/smoke-test.sh&lt;/code&gt; before a
PR - see &lt;a href="https://github.com/boy-offi9-inc/hexforge-gateway/CONTRIBUTING.md" rel="noopener noreferrer"&gt;&lt;code&gt;CONTRIBUTING.md&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Getting started&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;npm install
cp .env.example .env
npm run dev&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;The Gateway starts on &lt;code&gt;http://localhost:8080&lt;/code&gt; and prints a banner with your
workspaces and copy-pasteable commands. &lt;code&gt;GET /&lt;/code&gt; returns the same as JSON -
the quickest way to see what's here.&lt;/p&gt;
&lt;p&gt;Core endpoints (request/response shapes are in the linked docs):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;GET /&lt;/code&gt; - live cheat sheet - &lt;code&gt;GET /health&lt;/code&gt; - service + config status&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;POST /workspaces&lt;/code&gt;…&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/boy-offi9-inc/hexforge-gateway" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


</description>
      <category>mcp</category>
      <category>android</category>
      <category>opensource</category>
      <category>typescript</category>
    </item>
    <item>
      <title>MatrixRainView — A Code-Driven Android Matrix Rain Rendering Library</title>
      <dc:creator>Boy Offi9</dc:creator>
      <pubDate>Sat, 05 Sep 2026 17:06:09 +0000</pubDate>
      <link>https://dev.to/boyoffi9/matrixrainview-a-code-driven-android-matrix-rain-rendering-library-12ij</link>
      <guid>https://dev.to/boyoffi9/matrixrainview-a-code-driven-android-matrix-rain-rendering-library-12ij</guid>
      <description>&lt;p&gt;This is a submission for &lt;a href="https://dev.to/challenges/weekend-2026-09-03"&gt;Weekend Challenge: Generosity Edition&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;I built &lt;strong&gt;MatrixRainView&lt;/strong&gt;, an open-source Android library that allows developers to easily add a fully customizable Matrix-style digital rain effect to their applications.&lt;/p&gt;

&lt;p&gt;The goal behind this project was simple: make creative UI effects more accessible to Android developers without requiring pre-rendered GIFs, videos, or heavy animation assets.&lt;/p&gt;

&lt;p&gt;Instead of playing back an animation, MatrixRainView generates the effect in real time using native Android rendering. This gives developers complete control over the visual experience and makes it easy to customize for different projects.&lt;/p&gt;

&lt;h3&gt;
  
  
  Features
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;⚡ Real-time Canvas-based rendering&lt;/li&gt;
&lt;li&gt;🎨 Custom colors and themes&lt;/li&gt;
&lt;li&gt;🔤 Custom glyph/character support&lt;/li&gt;
&lt;li&gt;🌧 Adjustable rain speed and density&lt;/li&gt;
&lt;li&gt;✨ Glow and fade effects&lt;/li&gt;
&lt;li&gt;📱 XML and programmatic configuration&lt;/li&gt;
&lt;li&gt;🔧 Lightweight and dependency-free design&lt;/li&gt;
&lt;li&gt;📦 Easy integration using JitPack&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The project is fully open source, allowing developers to freely use, modify, and build upon it.&lt;/p&gt;

&lt;p&gt;I created this library as a way of giving back to the Android developer community by providing a reusable component that developers can use in their own creative applications.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;Check out the demo application:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/boy-offi9-inc/matrix-rain-demo" rel="noopener noreferrer"&gt;MatrixRainDemo&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The demo showcases different configurations and customization options available through the library.&lt;/p&gt;

&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;

&lt;p&gt;Library source:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/boy-offi9-inc/matrix-rain-view" rel="noopener noreferrer"&gt;MatrixRainView&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Demo application:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/boy-offi9-inc/matrix-rain-demo" rel="noopener noreferrer"&gt;MatrixRainDemo&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;p&gt;MatrixRainView was built using &lt;strong&gt;Kotlin&lt;/strong&gt; and Android's custom &lt;code&gt;View&lt;/code&gt; system.&lt;/p&gt;

&lt;p&gt;Instead of relying on external animation files, the renderer uses Android's native &lt;code&gt;Canvas&lt;/code&gt; drawing APIs to generate the digital rain effect frame by frame.&lt;/p&gt;

&lt;p&gt;Some important design decisions:&lt;/p&gt;

&lt;h3&gt;
  
  
  Custom Rendering Engine
&lt;/h3&gt;

&lt;p&gt;The animation is generated completely through code, allowing each character, movement, fade effect, and visual property to be controlled dynamically.&lt;/p&gt;

&lt;h3&gt;
  
  
  Performance Focus
&lt;/h3&gt;

&lt;p&gt;The library was designed to remain lightweight while providing smooth animations by avoiding unnecessary dependencies and using Android's built-in rendering capabilities.&lt;/p&gt;

&lt;h3&gt;
  
  
  Developer-Friendly API
&lt;/h3&gt;

&lt;p&gt;I focused on making customization simple, allowing developers to modify properties like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Rain speed&lt;/li&gt;
&lt;li&gt;Character density&lt;/li&gt;
&lt;li&gt;Colors&lt;/li&gt;
&lt;li&gt;Glow intensity&lt;/li&gt;
&lt;li&gt;Character sets&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;through an easy-to-use API.&lt;/p&gt;

&lt;p&gt;The result is a reusable Android component that developers can quickly integrate into their applications.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prize Categories
&lt;/h2&gt;

&lt;p&gt;No special prize category applies.&lt;/p&gt;

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

&lt;p&gt;MatrixRainView started as an experiment in Android graphics and became an open-source tool for developers who want to add dynamic visual experiences to their apps.&lt;/p&gt;

&lt;p&gt;I hope this project helps other developers create more interesting interfaces and inspires more open-source contributions.s gives developers complete control over the visual experience and makes it easy to customize for different projects.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>weekendchallenge</category>
      <category>android</category>
      <category>kotlin</category>
    </item>
    <item>
      <title>I built a real, drop-in "Matrix rain" View for Android (not another Canvas tutorial)</title>
      <dc:creator>Boy Offi9</dc:creator>
      <pubDate>Fri, 04 Sep 2026 18:17:40 +0000</pubDate>
      <link>https://dev.to/boyoffi9/i-built-a-real-drop-in-matrix-rain-view-for-android-not-another-canvas-tutorial-25kp</link>
      <guid>https://dev.to/boyoffi9/i-built-a-real-drop-in-matrix-rain-view-for-android-not-another-canvas-tutorial-25kp</guid>
      <description>&lt;p&gt;I've built plenty of little effects and demos before, but this is the first thing I've shipped that's an actual &lt;em&gt;reusable library&lt;/em&gt; — not a gist, not a "here's how you'd do it" tutorial, not a GIF. Something you drop into a project with one line and it just works.&lt;/p&gt;

&lt;p&gt;It's called &lt;strong&gt;matrix-rain-view&lt;/strong&gt; — a configurable "digital rain" effect (the falling-glyph look from &lt;em&gt;The Matrix&lt;/em&gt;) as a real, custom Android &lt;code&gt;View&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why not just another tutorial?
&lt;/h2&gt;

&lt;p&gt;Every Matrix-rain tutorial I found was the same: a &lt;code&gt;Canvas&lt;/code&gt;, a coroutine loop, some hardcoded green. Fine for a blog post, annoying to actually use — no lifecycle handling, no attribute API, speed tied to frame rate so it looks different on every device.&lt;/p&gt;

&lt;p&gt;So I built it properly instead:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Real lifecycle&lt;/strong&gt; — starts on attach, stops on detach. No leaks, no battery drain when it's off-screen.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Delta-time animation&lt;/strong&gt; — motion speed is consistent regardless of device refresh rate, instead of speeding up on 120Hz screens.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A real attribute API&lt;/strong&gt; — configurable via XML or code, not just a set of magic numbers buried in a &lt;code&gt;draw()&lt;/code&gt; method.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Custom glyph sets&lt;/strong&gt; — katakana, binary, alnum, or your own custom pool.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Install
&lt;/h2&gt;

&lt;p&gt;Add JitPack to &lt;code&gt;settings.gradle.kts&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="nf"&gt;dependencyResolutionManagement&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;repositories&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;google&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="nf"&gt;mavenCentral&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="nf"&gt;maven&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;uri&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"https://jitpack.io"&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="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add the dependency:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="nf"&gt;dependencies&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;implementation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"com.github.boy-offi9-inc:matrix-rain-view:1.0.1"&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;h2&gt;
  
  
  Usage
&lt;/h2&gt;

&lt;p&gt;Full-screen effect:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;com.boyoffi9.matrixrainview.MatrixRainView&lt;/span&gt;
    &lt;span class="na"&gt;android:layout_width=&lt;/span&gt;&lt;span class="s"&gt;"match_parent"&lt;/span&gt;
    &lt;span class="na"&gt;android:layout_height=&lt;/span&gt;&lt;span class="s"&gt;"match_parent"&lt;/span&gt;
    &lt;span class="na"&gt;app:rainColor=&lt;/span&gt;&lt;span class="s"&gt;"#00FF41"&lt;/span&gt;
    &lt;span class="na"&gt;app:rainSpeed=&lt;/span&gt;&lt;span class="s"&gt;"1.2"&lt;/span&gt;
    &lt;span class="na"&gt;app:rainDensity=&lt;/span&gt;&lt;span class="s"&gt;"1.0"&lt;/span&gt;
    &lt;span class="na"&gt;app:rainGlow=&lt;/span&gt;&lt;span class="s"&gt;"true"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or as a background behind real UI — just make sure it's the bottom child of a &lt;code&gt;FrameLayout&lt;/code&gt; (a &lt;code&gt;LinearLayout&lt;/code&gt; can't stack children):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;FrameLayout&lt;/span&gt;
    &lt;span class="na"&gt;android:layout_width=&lt;/span&gt;&lt;span class="s"&gt;"match_parent"&lt;/span&gt;
    &lt;span class="na"&gt;android:layout_height=&lt;/span&gt;&lt;span class="s"&gt;"match_parent"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;com.boyoffi9.matrixrainview.MatrixRainView&lt;/span&gt;
        &lt;span class="na"&gt;android:id=&lt;/span&gt;&lt;span class="s"&gt;"@+id/matrixRain"&lt;/span&gt;
        &lt;span class="na"&gt;android:layout_width=&lt;/span&gt;&lt;span class="s"&gt;"match_parent"&lt;/span&gt;
        &lt;span class="na"&gt;android:layout_height=&lt;/span&gt;&lt;span class="s"&gt;"match_parent"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;LinearLayout&lt;/span&gt;
        &lt;span class="na"&gt;android:layout_width=&lt;/span&gt;&lt;span class="s"&gt;"match_parent"&lt;/span&gt;
        &lt;span class="na"&gt;android:layout_height=&lt;/span&gt;&lt;span class="s"&gt;"wrap_content"&lt;/span&gt;
        &lt;span class="na"&gt;android:layout_gravity=&lt;/span&gt;&lt;span class="s"&gt;"center"&lt;/span&gt;
        &lt;span class="na"&gt;android:orientation=&lt;/span&gt;&lt;span class="s"&gt;"vertical"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="c"&gt;&amp;lt;!-- your real UI --&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/LinearLayout&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;/FrameLayout&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Everything's controllable at runtime too:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;rain&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;findViewById&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;MatrixRainView&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="nc"&gt;R&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;matrixRain&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;rain&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rainColor&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Color&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parseColor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"#00FFAA"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;rain&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;speed&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;1.5f&lt;/span&gt;
&lt;span class="n"&gt;rain&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;density&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.8f&lt;/span&gt;
&lt;span class="n"&gt;rain&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;charSet&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;MatrixRainView&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;CharSet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;BINARY&lt;/span&gt;
&lt;span class="n"&gt;rain&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;glowEnabled&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;false&lt;/span&gt;

&lt;span class="n"&gt;rain&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pause&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;rain&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;resume&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  See it in action
&lt;/h2&gt;

&lt;p&gt;I put together a small demo app showing it running as a background behind real content, with a live settings panel wired to every property (color, speed, density, fade, glow, charset) — no restart needed, updates the running animation immediately.&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://github.com/boy-offi9-inc/matrix-rain-demo" rel="noopener noreferrer"&gt;matrix-rain-demo&lt;/a&gt; — screenshots, a screen recording, and a CI-built debug APK from the Actions tab.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Library: &lt;a href="https://github.com/boy-offi9-inc/matrix-rain-view" rel="noopener noreferrer"&gt;github.com/boy-offi9-inc/matrix-rain-view&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Demo: &lt;a href="https://github.com/boy-offi9-inc/matrix-rain-demo" rel="noopener noreferrer"&gt;github.com/boy-offi9-inc/matrix-rain-demo&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;MIT licensed. If you use it or have thoughts, I'd love a star or an issue — this is my first real reusable Android lib, so feedback's very welcome.&lt;/p&gt;

</description>
      <category>android</category>
      <category>kotlin</category>
      <category>opensource</category>
      <category>androiddev</category>
    </item>
  </channel>
</rss>
