<?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: Mark Barnett</title>
    <description>The latest articles on DEV Community by Mark Barnett (@markusbnet).</description>
    <link>https://dev.to/markusbnet</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%2F560157%2Fb95f35aa-d736-45e6-95a3-80470609be77.jpeg</url>
      <title>DEV Community: Mark Barnett</title>
      <link>https://dev.to/markusbnet</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/markusbnet"/>
    <language>en</language>
    <item>
      <title>Why I built my own budgeting app (and yes, I know there are hundreds already)</title>
      <dc:creator>Mark Barnett</dc:creator>
      <pubDate>Thu, 21 May 2026 07:30:54 +0000</pubDate>
      <link>https://dev.to/markusbnet/why-i-built-my-own-budgeting-app-and-yes-i-know-there-are-hundreds-already-3a41</link>
      <guid>https://dev.to/markusbnet/why-i-built-my-own-budgeting-app-and-yes-i-know-there-are-hundreds-already-3a41</guid>
      <description>&lt;p&gt;I know what you're thinking. The world doesn't need another budgeting app. You're probably right. But hear me out.&lt;/p&gt;

&lt;p&gt;I've used YNAB, Mint (RIP), Copilot, Monarch, and more spreadsheet templates than I want to admit. They all annoyed me in different ways.&lt;/p&gt;

&lt;p&gt;YNAB is powerful but it wants you to adopt a whole philosophy. Give every dollar a job, reconcile your accounts regularly, learn what "age of money" means. I spent more time managing YNAB than actually thinking about my finances. I don't want a budgeting practice. I want to know if I can afford the thing I'm looking at.&lt;/p&gt;

&lt;p&gt;The simple apps go too far the other direction. Enter income, subtract bills, see what's left. Great for about five minutes until you need to track something that doesn't fit their three categories.&lt;/p&gt;

&lt;p&gt;I wanted something in between and couldn't find it. So I built &lt;a href="https://money-me.com" rel="noopener noreferrer"&gt;Money Me&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it started
&lt;/h2&gt;

&lt;p&gt;Weekend project. Classic. I just wanted to answer a few questions without a lot of fuss: what's my actual financial position right now? What does next month look like? Where's money disappearing that I haven't noticed?&lt;/p&gt;

&lt;p&gt;The first version was barely an app. Income in, expenses out, a forecast showing when I'd run out of money at my current pace. No bank connections, no AI-powered insights, no gamification badges. Just arithmetic.&lt;/p&gt;

&lt;p&gt;The weird thing is, that rough version was more useful than most of what I'd used before. Not because it was smart, but because it got out of the way. Open it, see the number, close it. No guilt about 47 uncategorized transactions. No backlog of receipts.&lt;/p&gt;

&lt;h2&gt;
  
  
  Manual entry in 2026, seriously?
&lt;/h2&gt;

&lt;p&gt;Yeah. I know it sounds backwards when every other app is racing to add bank sync and automatic categorization.&lt;/p&gt;

&lt;p&gt;But I've been on the other side of that. Mint would categorize my mortgage payment as "Shopping" and I'd spend 20 minutes unfiling and re-filing transactions. Plaid connections would break every few weeks and suddenly you're missing two months of data. The automation is convenient when it works and infuriating when it doesn't.&lt;/p&gt;

&lt;p&gt;With manual entry, you actually know what the numbers mean because you put them there. It takes maybe 5 minutes a week. The tradeoff is worth it, at least for me.&lt;/p&gt;

&lt;p&gt;Where Money Me gets more interesting is the forecasting. It projects forward — what does your cash look like in 30, 60, 90 days? Not just a flat calculation but accounting for irregular bills, the car insurance that hits quarterly, debt payments that change as balances go down. It's the thing I always wanted from a spreadsheet but could never be bothered to maintain the formulas for.&lt;/p&gt;

&lt;h2&gt;
  
  
  When it stopped being a side project
&lt;/h2&gt;

&lt;p&gt;There was a week where I noticed I was checking Money Me before buying things. Not in a "I should check my budget" guilt way, just... it was the fastest way to know if the purchase made sense. That's when I realised the thing was actually useful and maybe I should take it more seriously.&lt;/p&gt;

&lt;p&gt;So I rebuilt it properly as a PWA. Offline support, installable on mobile, actually fast. Added the features I kept wishing existed: debt payoff strategies (avalanche vs snowball, and you can compare them side by side), savings goals with realistic timelines, and something that flags when a spending category spikes compared to your normal.&lt;/p&gt;

&lt;p&gt;It's been live at &lt;a href="https://money-me.com" rel="noopener noreferrer"&gt;money-me.com&lt;/a&gt; for a while now. Works fine as a web app, no app store needed. But I kept getting asked "is it on the Play Store?" so I packaged it as a TWA (Trusted Web Activity — basically a PWA wrapped natively for Android) and that's where things got... bureaucratic.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Google Play situation
&lt;/h2&gt;

&lt;p&gt;Google requires 12 people opted into a closed beta for 14 consecutive days before you can release to production. Totally reasonable as a policy. Stops junk apps flooding the store. But when you're one person with no existing audience, finding 12 Android users who'll install your thing and keep it for two weeks is harder than it sounds.&lt;/p&gt;

&lt;p&gt;I wrote about this &lt;a href="https://dev.to/markusbnet/show-dev-i-built-a-personal-finance-app-and-now-im-stuck-behind-googles-12-tester-gate-42mj"&gt;already on dev.to&lt;/a&gt;. Classic chicken-and-egg: you need users to get on the store, but the store is where users would find you.&lt;/p&gt;

&lt;h2&gt;
  
  
  Some things I've figured out along the way
&lt;/h2&gt;

&lt;p&gt;Building the product is maybe 40% of the work. Distribution is the rest. SEO, app store requirements, actually telling people the thing exists. Nobody mentions this part when you're excitedly sketching wireframes on a Saturday morning.&lt;/p&gt;

&lt;p&gt;The "how often will someone actually use this?" test has saved me from a lot of bad features. Investment tracking sounds great on a feature list. In practice, people check their brokerage directly. Not everything needs to live inside a budgeting app.&lt;/p&gt;

&lt;p&gt;And the indie dev community has been surprisingly helpful. People swap beta tests, share what's working, give feedback that's actually useful. Building alone doesn't mean being alone, which is nice.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where it's at now
&lt;/h2&gt;

&lt;p&gt;Money Me is live on the web. The Android app is in closed beta waiting to clear Google's 14-day window. The core stuff works well — dashboard, forecasting, debt strategies, savings goals, spending tracking. It gets better with each update.&lt;/p&gt;

&lt;p&gt;It's not for everyone. If you love YNAB's zero-based approach, stick with YNAB. If you want auto-imported bank transactions, Money Me isn't that (at least not yet). It's for people who want to understand their money without adopting a whole system around it.&lt;/p&gt;

&lt;p&gt;You can try the web app free at &lt;a href="https://money-me.com" rel="noopener noreferrer"&gt;money-me.com&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;If you've got an Android phone and 30 seconds to spare, I'd really appreciate help getting past Google's 12-tester gate. Beta testers get 6 months of Premium free once we're live in production.&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://play.google.com/apps/testing/com.moneyme.twa" rel="noopener noreferrer"&gt;Opt in to the beta here&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Happy to swap tests if you're building something too — drop your link in the comments.&lt;/p&gt;

</description>
      <category>buildinpublic</category>
      <category>sideprojects</category>
      <category>webdev</category>
      <category>showdev</category>
    </item>
    <item>
      <title>How I shipped my PWA to Google Play as a TWA (and what actually went wrong)</title>
      <dc:creator>Mark Barnett</dc:creator>
      <pubDate>Thu, 21 May 2026 07:29:15 +0000</pubDate>
      <link>https://dev.to/markusbnet/how-i-shipped-my-pwa-to-google-play-as-a-twa-and-what-actually-went-wrong-392j</link>
      <guid>https://dev.to/markusbnet/how-i-shipped-my-pwa-to-google-play-as-a-twa-and-what-actually-went-wrong-392j</guid>
      <description>&lt;p&gt;I built &lt;a href="https://money-me.com" rel="noopener noreferrer"&gt;Money Me&lt;/a&gt; as a PWA. It works offline, it's installable, it feels like a native app. At some point I decided to put it on Google Play because people kept asking "is it in the store?"&lt;/p&gt;

&lt;p&gt;The TWA route seemed obvious. Wrap the existing PWA in an Android shell, ship it. I figured a day of work, maybe two.&lt;/p&gt;

&lt;p&gt;It took me a lot longer than that.&lt;/p&gt;

&lt;h2&gt;
  
  
  So what is a TWA
&lt;/h2&gt;

&lt;p&gt;A Trusted Web Activity is basically an Android app that opens your website in Chrome, but with the browser UI stripped away. No address bar, no back button. Fullscreen. If you didn't know better you'd think it was a regular Android app.&lt;/p&gt;

&lt;p&gt;The "trusted" bit: you prove you own the domain by putting a specific JSON file on your server. Android checks it against your app's signing key. If it matches, Chrome hides the browser chrome (pun maybe intended). If it doesn't match, you get an ugly blue bar at the top and your app looks like a glorified bookmark.&lt;/p&gt;

&lt;p&gt;Important thing I didn't understand at first: a TWA is NOT a WebView. It's actual Chrome running your site. Service workers work, push notifications work, everything your PWA already does just... works. This is the main reason to use a TWA over something like Capacitor or a WebView wrapper.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bubblewrap
&lt;/h2&gt;

&lt;p&gt;Google has a tool called &lt;a href="https://github.com/nicedevelopment/nicedevelopment-nicedevelopment" rel="noopener noreferrer"&gt;Bubblewrap&lt;/a&gt; that generates an Android project from your web manifest. Point it at your manifest URL, it spits out a project, you build an APK.&lt;/p&gt;

&lt;p&gt;My advice: don't treat it as a black box. You will need to open the generated project and mess with &lt;code&gt;build.gradle&lt;/code&gt; and the Android manifest at some point. If you've never seen an Android project before, spend 20 minutes understanding the structure first. You'll thank yourself later when something breaks and the error message means nothing to you.&lt;/p&gt;

&lt;h2&gt;
  
  
  The blue bar (aka my nemesis for two days)
&lt;/h2&gt;

&lt;p&gt;This is where I lost the most time. The blue navigation bar shows up when Chrome can't verify you own the domain. Your app still works fine underneath, it just looks terrible.&lt;/p&gt;

&lt;p&gt;The fix is a file at &lt;code&gt;/.well-known/assetlinks.json&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"relation"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"delegate_permission/common.handle_all_urls"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"target"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"namespace"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"android_app"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"package_name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"com.yourapp.twa"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"sha256_cert_fingerprints"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"YOUR:SHA256:FINGERPRINT:HERE"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Simple enough. Except I got the fingerprint wrong three times before figuring out what was happening.&lt;/p&gt;

&lt;p&gt;The problem: you have multiple signing keys and they all have different fingerprints. There's your local debug key, your upload key, and then Google Play's own app signing key. Play App Signing is mandatory for new apps now, which means Google re-signs your bundle after you upload it. So the fingerprint that matters for asset links is Google's key, not yours.&lt;/p&gt;

&lt;p&gt;Go to &lt;strong&gt;Play Console → Setup → App signing → App signing key certificate&lt;/strong&gt; and grab the SHA-256 from there. I wasted hours using my upload key fingerprint instead. The blue bar kept showing up and I kept double-checking the JSON format, the content type, the file path. The file was fine. The fingerprint was just wrong.&lt;/p&gt;

&lt;p&gt;Other things that bit me:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Chrome caches the verification result.&lt;/strong&gt; You fix the asset links file, reinstall the app, and... blue bar is still there. You need to clear Chrome's data on the test device. Not just the cache. The data. I was clearing the app cache only and wondering why nothing changed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Content-Type has to be &lt;code&gt;application/json&lt;/code&gt;.&lt;/strong&gt; My CDN was serving it as &lt;code&gt;text/plain&lt;/code&gt;. Took me a while to catch that one.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use Google's &lt;a href="https://developers.google.com/digital-asset-links/tools/generator" rel="noopener noreferrer"&gt;verification tool&lt;/a&gt;.&lt;/strong&gt; I should have used this from the start instead of guessing. It tells you exactly what's wrong.&lt;/p&gt;

&lt;h2&gt;
  
  
  The signing key situation
&lt;/h2&gt;

&lt;p&gt;If you're a web developer, Android signing keys are confusing. There are two keys involved:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Your &lt;strong&gt;upload key&lt;/strong&gt; — you use this to sign the bundle before uploading to Play Console&lt;/li&gt;
&lt;li&gt;Google's &lt;strong&gt;app signing key&lt;/strong&gt; — Google uses this to sign the APK that actually gets distributed to users&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For your asset links JSON, you need #2. Not #1. I keep repeating this because it took me an embarrassingly long time to figure out, and every tutorial I found either glossed over it or assumed you already knew.&lt;/p&gt;

&lt;p&gt;Generate your upload key:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;keytool &lt;span class="nt"&gt;-genkey&lt;/span&gt; &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="nt"&gt;-keystore&lt;/span&gt; upload-keystore.jks &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-keyalg&lt;/span&gt; RSA &lt;span class="nt"&gt;-keysize&lt;/span&gt; 2048 &lt;span class="nt"&gt;-validity&lt;/span&gt; 10000 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-alias&lt;/span&gt; upload
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then do your first upload to Play Console, and THEN go grab the app signing key fingerprint. You can't get it before the first upload because Google generates it at that point.&lt;/p&gt;

&lt;h2&gt;
  
  
  Closed testing: the 12-tester gate
&lt;/h2&gt;

&lt;p&gt;Once the app was building and the blue bar was gone, I thought I was done. Nope.&lt;/p&gt;

&lt;p&gt;Google requires new apps to have 12 testers opted into a closed beta for 14 continuous days before you can go to production. You need real people with real Google accounts who join your testing program, install the app, and stay opted in for the full two weeks.&lt;/p&gt;

&lt;p&gt;If you've got an existing user base, this is nothing. If you're a solo dev shipping your first app, it's a real bottleneck. I wrote a &lt;a href="https://dev.to/markusbnet/show-dev-i-built-a-personal-finance-app-and-now-im-stuck-behind-googles-12-tester-gate-42mj"&gt;whole post about this&lt;/a&gt; already.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I'd do differently next time
&lt;/h2&gt;

&lt;p&gt;Get asset links working BEFORE you build the TWA. Host the JSON file, verify it with Google's tool, confirm it's correct. Then build the app. Debugging both at the same time is miserable.&lt;/p&gt;

&lt;p&gt;Start looking for testers before your build is ready. The 14-day clock is the actual bottleneck, not the technical work.&lt;/p&gt;

&lt;p&gt;Test on a Samsung phone early. My app looked perfect on a Pixel. Then I tried it on an older Galaxy and some things were off.&lt;/p&gt;

&lt;h2&gt;
  
  
  Is it worth it though?
&lt;/h2&gt;

&lt;p&gt;Yeah. For a PWA that's already working well, a TWA is the right call. One codebase, Play Store presence, native-feeling experience. The setup takes a weekend if you know the pitfalls. Compared to maintaining a separate React Native or Kotlin app? Not even a question.&lt;/p&gt;

&lt;p&gt;The downside is you're dependent on Chrome being installed, but that's basically every Android phone. And you need to keep your asset links in sync when keys change. That's about it.&lt;/p&gt;




&lt;p&gt;I'm going through the closed testing process now with &lt;a href="https://money-me.com" rel="noopener noreferrer"&gt;Money Me&lt;/a&gt;. If you've got an Android phone and don't mind helping an indie dev clear the 12-tester gate, I'd massively appreciate it. Beta testers get 6 months of Premium free.&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://play.google.com/apps/testing/com.moneyme.twa" rel="noopener noreferrer"&gt;Join the beta on Google Play&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;30 seconds to opt in. If you've got TWA questions, drop them in the comments — I've made most of the mistakes already.&lt;/p&gt;

</description>
      <category>pwa</category>
      <category>android</category>
      <category>webdev</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Show DEV: I built a personal finance app and now I'm stuck behind Google's 12-tester gate</title>
      <dc:creator>Mark Barnett</dc:creator>
      <pubDate>Wed, 20 May 2026 16:15:34 +0000</pubDate>
      <link>https://dev.to/markusbnet/show-dev-i-built-a-personal-finance-app-and-now-im-stuck-behind-googles-12-tester-gate-42mj</link>
      <guid>https://dev.to/markusbnet/show-dev-i-built-a-personal-finance-app-and-now-im-stuck-behind-googles-12-tester-gate-42mj</guid>
      <description>&lt;p&gt;I've been building Money Me for a while now — a personal finance app that tracks spending, income, budgets, and savings goals. Nothing groundbreaking, just trying to do the basics properly without the bloat.&lt;/p&gt;

&lt;p&gt;The web app has been live at &lt;a href="https://money-me.com" rel="noopener noreferrer"&gt;money-me.com&lt;/a&gt; for a while and it works well. So I figured wrapping it as an Android app would be the easy part. Built it as a TWA (Trusted Web Activity) — basically the PWA packaged natively. Same app, proper home screen icon, runs in Chrome under the hood.&lt;/p&gt;

&lt;p&gt;Turns out shipping to Google Play is where it gets interesting.&lt;/p&gt;

&lt;p&gt;Google requires &lt;strong&gt;12 people opted into your closed beta for 14 consecutive days&lt;/strong&gt; before they'll let you publish to production. Makes total sense as a policy — stops junk apps flooding the store. But when you're a solo dev with no audience yet, finding 12 people who'll install your app &lt;em&gt;and keep it installed for two weeks&lt;/em&gt; is a genuine challenge.&lt;/p&gt;

&lt;p&gt;So here I am, asking the dev community for help.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Money Me does
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Track income and expenses manually (no bank sync — privacy first)&lt;/li&gt;
&lt;li&gt;Set monthly budgets and see where you're overspending&lt;/li&gt;
&lt;li&gt;Create savings goals and track progress&lt;/li&gt;
&lt;li&gt;Monthly overview that actually tells you something useful&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The ask
&lt;/h2&gt;

&lt;p&gt;If you've got an Android phone and don't mind keeping the app installed for a couple of weeks, I'd massively appreciate it. The opt-in takes about 30 seconds:&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://play.google.com/apps/testing/com.moneyme.twa" rel="noopener noreferrer"&gt;play.google.com/apps/testing/com.moneyme.twa&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can also try the web version first at &lt;a href="https://money-me.com" rel="noopener noreferrer"&gt;money-me.com&lt;/a&gt; — it's the exact same app.&lt;/p&gt;

&lt;p&gt;Every tester gets &lt;strong&gt;6 months of Premium free&lt;/strong&gt; once we launch to production.&lt;/p&gt;

&lt;p&gt;And if you're building something too — drop your link in the comments. Happy to swap tests. We've all been stuck behind this gate at some point.&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>android</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
