<?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: Florian</title>
    <description>The latest articles on DEV Community by Florian (@florianheysen).</description>
    <link>https://dev.to/florianheysen</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%2F800172%2F534bba30-c3e8-40aa-8f0b-4c131bedff35.png</url>
      <title>DEV Community: Florian</title>
      <link>https://dev.to/florianheysen</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/florianheysen"/>
    <language>en</language>
    <item>
      <title>How to Disable Google Discover on OPPO Find X9 (ColorOS 16) Without Losing Google Assistant</title>
      <dc:creator>Florian</dc:creator>
      <pubDate>Mon, 27 Apr 2026 14:35:44 +0000</pubDate>
      <link>https://dev.to/florianheysen/how-to-disable-google-discover-on-oppo-find-x9-coloros-16-without-losing-google-assistant-2gid</link>
      <guid>https://dev.to/florianheysen/how-to-disable-google-discover-on-oppo-find-x9-coloros-16-without-losing-google-assistant-2gid</guid>
      <description>&lt;p&gt;If you own an OPPO Find X9 running ColorOS 16, you've probably noticed that swiping left from the home screen opens Google Discover. You've probably also noticed there's no setting anywhere to turn it off.&lt;/p&gt;

&lt;p&gt;The classic trap: every solution online tells you to disable the Google package, which kills "Hey Google", Gemini, and voice search along with Discover. Not great.&lt;/p&gt;

&lt;p&gt;Here's the clean method. It disables Discover only, and leaves everything else intact.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;An OPPO Find X9 (this should also work on other recent OPPO phones running ColorOS)&lt;/li&gt;
&lt;li&gt;ADB installed on your computer (Mac, Windows, or Linux)&lt;/li&gt;
&lt;li&gt;A USB cable&lt;/li&gt;
&lt;li&gt;USB debugging enabled on the phone&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you've never used ADB before, it's a small command-line tool that lets you talk to your Android device from your computer. On Mac with Homebrew:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew &lt;span class="nb"&gt;install &lt;/span&gt;android-platform-tools
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To enable USB debugging: Settings, About phone, tap "Build number" 7 times, then go back to Settings, Developer options, and turn on "USB debugging".&lt;/p&gt;

&lt;h2&gt;
  
  
  The fix
&lt;/h2&gt;

&lt;p&gt;Plug in your phone, accept the ADB authorization prompt that pops up, then run these commands:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;adb shell settings put secure assistant_screen_type 0
adb shell settings put secure asistant_screen_type 0
adb shell am force-stop com.android.launcher
adb shell am force-stop com.google.android.googlequicksearchbox
adb shell am start &lt;span class="nt"&gt;-a&lt;/span&gt; android.intent.action.MAIN &lt;span class="nt"&gt;-c&lt;/span&gt; android.intent.category.HOME
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. Swipe left from your home screen, nothing happens. Discover is gone, but "Ok Google" and Gemini still work.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this works
&lt;/h2&gt;

&lt;p&gt;ColorOS uses an internal key called &lt;code&gt;assistant_screen_type&lt;/code&gt; to decide what shows up to the left of the home screen. The possible values:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;th&gt;Behavior&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;0&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Nothing (Discover disabled)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;1&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;OPPO Assistant (Breeno)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;2&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Google Discover&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Default on the Find X9 is &lt;code&gt;2&lt;/code&gt;. We set it to &lt;code&gt;0&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;force-stop&lt;/code&gt; on the launcher and the Google app forces them to reload their config. Without it, the change only takes effect after a reboot. The &lt;code&gt;am start&lt;/code&gt; cleanly restarts the home screen.&lt;/p&gt;

&lt;h2&gt;
  
  
  The weird part: the duplicate key
&lt;/h2&gt;

&lt;p&gt;You probably noticed we run the same command twice with different spelling:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;adb shell settings put secure assistant_screen_type 0
adb shell settings put secure asistant_screen_type 0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Yes, there's a typo in ColorOS. Somewhere in OPPO's code, someone wrote &lt;code&gt;asistant&lt;/code&gt; (one "s") instead of &lt;code&gt;assistant&lt;/code&gt;. Both keys exist in parallel, and depending on the system version or context, one or the other gets read. Setting both to 0 covers all cases.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I tried first and what didn't work
&lt;/h2&gt;

&lt;p&gt;In case you run into these elsewhere, here's why they fail:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Method&lt;/th&gt;
&lt;th&gt;Why it breaks&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;assistant_screen_type_left_enable=0&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;This key only toggles the UI option, but &lt;code&gt;assistant_screen_type=2&lt;/code&gt; still forces Discover&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Disabling the Google package with &lt;code&gt;pm disable&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Kills Discover, but also kills Assistant, search, Gemini, basically everything&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Disabling &lt;code&gt;MinusOneActivity&lt;/code&gt; or &lt;code&gt;DrawerOverlayService&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;SecurityException: Android protects system app components, you don't have permission&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;launcher_slid_slip_enable_state=0&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Controls a different gesture, not Discover&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;swipe_right_display_content=0&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;This key isn't used by the OPPO launcher&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;overlay_launcher_scene=0&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Same, controls something else&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Verifying it stuck
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;adb shell settings get secure assistant_screen_type
adb shell settings get secure asistant_screen_type
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Both should return &lt;code&gt;0&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  If you want Discover back later
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;adb shell settings put secure assistant_screen_type 2
adb shell settings put secure asistant_screen_type 2
adb shell am force-stop com.android.launcher
adb shell am start &lt;span class="nt"&gt;-a&lt;/span&gt; android.intent.action.MAIN &lt;span class="nt"&gt;-c&lt;/span&gt; android.intent.category.HOME
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Notes
&lt;/h2&gt;

&lt;p&gt;Tested on OPPO Find X9 running ColorOS 16, no root required. The method should work on most recent OPPO and OnePlus phones since they share the same ColorOS base, but I haven't verified it on other models.&lt;/p&gt;

&lt;p&gt;If a system update ever wipes the config, just rerun the commands.&lt;/p&gt;

</description>
      <category>oppo</category>
      <category>coloros</category>
      <category>google</category>
      <category>discover</category>
    </item>
    <item>
      <title>Openinary: The Self-Hosted Cloudinary Alternative Nobody Built Before</title>
      <dc:creator>Florian</dc:creator>
      <pubDate>Sun, 21 Dec 2025 13:06:10 +0000</pubDate>
      <link>https://dev.to/florianheysen/openinary-the-self-hosted-cloudinary-alternative-nobody-built-before-25po</link>
      <guid>https://dev.to/florianheysen/openinary-the-self-hosted-cloudinary-alternative-nobody-built-before-25po</guid>
      <description>&lt;p&gt;I spent the last &lt;strong&gt;6 months&lt;/strong&gt; building &lt;strong&gt;Openinary&lt;/strong&gt;, and I believe it fills a real gap in the self-hosted ecosystem.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;You know what’s wild?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;There’s &lt;strong&gt;Nextcloud&lt;/strong&gt; for file storage&lt;/li&gt;
&lt;li&gt;There’s &lt;strong&gt;Immich&lt;/strong&gt; for photos&lt;/li&gt;
&lt;li&gt;But there was &lt;strong&gt;nothing&lt;/strong&gt; for &lt;strong&gt;image processing and delivery at scale&lt;/strong&gt;, fully self-hosted&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Most SaaS image platforms follow the same pattern:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A great API&lt;/li&gt;
&lt;li&gt;Strong lock-in&lt;/li&gt;
&lt;li&gt;A bill that keeps growing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cloudinary&lt;/strong&gt; gates your media.&lt;br&gt;
&lt;strong&gt;Uploadcare&lt;/strong&gt; does the same.&lt;/p&gt;

&lt;p&gt;I was paying &lt;strong&gt;$90/month&lt;/strong&gt; for Cloudinary.&lt;/p&gt;

&lt;p&gt;For what?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Resizing images&lt;/li&gt;
&lt;li&gt;Processing a demo video&lt;/li&gt;
&lt;li&gt;Adding watermarks&lt;/li&gt;
&lt;li&gt;Optimizing formats&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The Solution
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Openinary&lt;/strong&gt; is what I built.&lt;/p&gt;

&lt;p&gt;A &lt;strong&gt;self-hosted, open-source alternative to Cloudinary&lt;/strong&gt;, focused on &lt;strong&gt;simplicity and control&lt;/strong&gt;.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Self-hosted, runs on your own infrastructure via &lt;strong&gt;Docker&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Simple URL-based API&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Example: &lt;code&gt;/w_1500,h_500,f_avif/sample.jpg&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;&lt;p&gt;Smart caching with invalidation&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;strong&gt;S3-compatible storage&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;Works with &lt;strong&gt;AWS S3&lt;/strong&gt;, &lt;strong&gt;Cloudflare R2&lt;/strong&gt;, &lt;strong&gt;MinIO&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;Automatic format optimization&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;WebP, AVIF, best format per browser&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;strong&gt;Open source&lt;/strong&gt;, &lt;strong&gt;AGPL-3.0&lt;/strong&gt; license&lt;/p&gt;&lt;/li&gt;

&lt;/ul&gt;




&lt;h2&gt;
  
  
  Why It Matters
&lt;/h2&gt;

&lt;p&gt;The &lt;strong&gt;self-hosted movement is real&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;People are moving away from SaaS lock-in, especially for &lt;strong&gt;core infrastructure&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Until now, one piece was missing:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;You couldn’t process and deliver media at scale on your own infrastructure.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Openinary aims to fill that gap.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Current Status
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;⭐ &lt;strong&gt;83 GitHub stars&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;🔥 Featured on &lt;strong&gt;GitHub Trending&lt;/strong&gt; (Dec 9)&lt;/li&gt;
&lt;li&gt;🎥 &lt;strong&gt;8,000+ views&lt;/strong&gt; on the feature video&lt;/li&gt;
&lt;li&gt;🎯 Goal: &lt;strong&gt;100 stars by Dec 31&lt;/strong&gt; (yes, I’m chasing this 😅)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Tech Stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Runtime:&lt;/strong&gt; Node.js&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deployment:&lt;/strong&gt; Docker, one command&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Storage:&lt;/strong&gt; S3-compatible (AWS, Cloudflare R2, MinIO)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;License:&lt;/strong&gt; AGPL-3.0&lt;/li&gt;
&lt;/ul&gt;




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

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://github.com/openinary/openinary" rel="noopener noreferrer"&gt;https://github.com/openinary/openinary&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Deploy guides:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.openinary.dev/guides/coolify-deployment" rel="noopener noreferrer"&gt;Deploy on Coolify&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.openinary.dev/guides/dokploy-deployment" rel="noopener noreferrer"&gt;Deploy on Dokploy&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;




&lt;h2&gt;
  
  
  Looking For
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Early feedback, especially from &lt;strong&gt;Cloudinary users&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Ideas on what to build next&lt;/li&gt;
&lt;li&gt;Help spreading the word before the end of the year&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you’ve hit the wall with expensive image services, or wanted to self-host but couldn’t find a solid solution, I’d love to hear from you.&lt;/p&gt;




&lt;h2&gt;
  
  
  Questions?
&lt;/h2&gt;

&lt;p&gt;Drop them in the comments.&lt;br&gt;
Happy to discuss the &lt;strong&gt;architecture&lt;/strong&gt;, &lt;strong&gt;use cases&lt;/strong&gt;, or &lt;strong&gt;why I built this instead of using existing solutions&lt;/strong&gt;.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>selfhosted</category>
      <category>devops</category>
      <category>docker</category>
    </item>
  </channel>
</rss>
