{"id":4199,"date":"2026-08-12T05:45:00","date_gmt":"2026-08-12T05:45:00","guid":{"rendered":"https:\/\/tucumandevelopers.com\/index.php\/2026\/08\/12\/pushing-the-limits-turning-a-4gb-lenovo-duet-chromebook-into-my-primary-development-machine\/"},"modified":"2026-08-12T05:45:00","modified_gmt":"2026-08-12T05:45:00","slug":"pushing-the-limits-turning-a-4gb-lenovo-duet-chromebook-into-my-primary-development-machine","status":"publish","type":"post","link":"https:\/\/tucumandevelopers.com\/index.php\/2026\/08\/12\/pushing-the-limits-turning-a-4gb-lenovo-duet-chromebook-into-my-primary-development-machine\/","title":{"rendered":"Pushing the Limits: Turning a 4GB Lenovo Duet Chromebook into My Primary Development Machine"},"content":{"rendered":"<div>\n<div><\/div>\n<div data-article-id=\"4374511\" id=\"article-body\">\n<p>While everyone is pushing the limits of AI, I&#8217;ve been busy pushing the limits of a Lenovo Duet Chromebook tablet I inherited from my son. He used it as a school tablet for a year, but eventually got frustrated with its performance under their heavy workload. The tablet comes with just 4GB of RAM, but as a Chromebook, it has the unique ability to run both Android and Linux software.<\/p>\n<p>I&#8217;ve been trying to move to a portable, lightweight development machine for the past 5+ years. After experimenting with (and eventually giving up on) Android and Termux paired with a Bluetooth keyboard, I decided to give this Duet a serious shot. This article covers my journey optimizing this 4GB tablet into my primary development machine\u2014one that I use both on the go as a tablet and docked via USB-C to a larger monitor, keyboard, and mouse.<\/p>\n<hr>\n<h3> <a name=\"step-1-ditching-the-android-vm-arc\" href=\"#step-1-ditching-the-android-vm-arc\"> <\/a> Step 1: Ditching the Android VM (ARC++) <\/h3>\n<p>The very first thing I did was disable the Android VM. I simply didn&#8217;t have a use for Android apps on a dev setup. Disabling Android (ARC++) reclaims about <strong>1GB of RAM immediately<\/strong>, which is a massive 25% gain on a 4GB device.<\/p>\n<p><em>One minor hiccup:<\/em> I briefly regretted this when it broke my Android-based Tailscale configuration. Luckily, I solved this by running Tailscale directly inside the Linux container using its userspace networking mode and SOCKS5 proxy: <\/p>\n<div>\n<pre><code>tailscaled <span>--tun<\/span><span>=<\/span>userspace-networking <span>--socks5-server<\/span><span>=<\/span>localhost:1055 <\/code><\/pre>\n<div>\n<\/p><\/div>\n<\/p><\/div>\n<hr>\n<h3> <a name=\"step-2-finetuning-chrome-flags-amp-settings\" href=\"#step-2-finetuning-chrome-flags-amp-settings\"> <\/a> Step 2: Fine-Tuning Chrome Flags &amp; Settings <\/h3>\n<p>Next, I tweaked a specific set of ChromeOS flags to maximize memory savings, force GPU acceleration across both Chrome and the Linux container, and stop Chrome from wasting CPU cycles and RAM prefetching pages:<\/p>\n<ul>\n<li> <strong>Memory Saver Mode (<code>chrome:\/\/settings\/performance<\/code>)<\/strong>: Set to <strong>Maximum<\/strong>. Automatically discards inactive background tabs.<\/li>\n<li> <strong><code>#ignore-gpu-blocklist<\/code> \u2192 Enabled<\/strong>: Overrides built-in software rendering blocklists to force GPU hardware acceleration across the OS.<\/li>\n<li> <strong><code>#enable-gpu-rasterization<\/code> \u2192 Enabled<\/strong>: Uses the Mali GPU to rasterize web content instead of the ARM CPU.<\/li>\n<li> <strong><code>#enable-zero-copy<\/code> \u2192 Enabled<\/strong>: Forces raster threads to write directly to GPU memory tiles, bypassing staging buffers in RAM.<\/li>\n<li> <strong><code>#crostini-gpu-support<\/code> \u2192 Enabled<\/strong>: Ensures hardware GPU acceleration is passed through directly into the Linux container.<\/li>\n<li> <strong><code>#scheduler-configuration<\/code> \u2192 Enables Hyper-Threading on relevant CPUs<\/strong>: Tunes CPU thread scheduling to maximize performance for active workloads.<\/li>\n<li> <strong><code>#enable-parallel-downloading<\/code> \u2192 Enabled<\/strong>: Accelerates download speeds by splitting files into parallel chunks.<\/li>\n<li> <strong><code>#prerender2<\/code> &amp; <code>#prerender2-cross-origin-iframes<\/code> \u2192 Disabled<\/strong>: Prevents Chrome from speculatively pre-loading linked pages and third-party iframe embeds in hidden background processes. This saves <strong>100MB\u2013250MB of RAM<\/strong> and stops background CPU spikes while browsing.<\/li>\n<\/ul>\n<hr>\n<h3> <a name=\"step-3-optimizing-virtual-memory-amp-crosh-swap\" href=\"#step-3-optimizing-virtual-memory-amp-crosh-swap\"> <\/a> Step 3: Optimizing Virtual Memory &amp; Crosh Swap <\/h3>\n<p>ChromeOS uses ZRAM (compressed memory swap). By default, Linux container swappiness is set higher than ideal, causing active terminal tools to get pushed into swap too early.<\/p>\n<ol>\n<li> <strong>Crosh ZRAM Swap<\/strong>: Opened Crosh (<code>Ctrl<\/code> + <code>Alt<\/code> + <code>T<\/code>) and expanded the ZRAM swap limit to 8GB to give the system plenty of breathing room during heavy multitasking: <\/li>\n<\/ol>\n<div>\n<pre><code> swap <span>enable <\/span>8192 <\/code><\/pre>\n<div>\n<\/p><\/div>\n<\/p><\/div>\n<ol>\n<li> <strong>Linux Swappiness<\/strong>: Created <code>\/etc\/sysctl.d\/99-custom.conf<\/code> inside Linux and added: <\/li>\n<\/ol>\n<div>\n<pre><code> <span>vm.swappiness<\/span><span>=<\/span><span>20<\/span> <span>vm.vfs_cache_pressure<\/span><span>=<\/span><span>150<\/span> <span>vm.overcommit_memory<\/span><span>=<\/span><span>1<\/span> <\/code><\/pre>\n<div>\n<\/p><\/div>\n<\/p><\/div>\n<p>This keeps active CLI processes in physical RAM while allowing smooth swapping when under memory pressure.<\/p>\n<hr>\n<h3> <a name=\"step-4-streamlining-the-linux-container-headless-cli-mode\" href=\"#step-4-streamlining-the-linux-container-headless-cli-mode\"> <\/a> Step 4: Streamlining the Linux Container (Headless CLI Mode) <\/h3>\n<p>Since I don&#8217;t use Linux GUI apps or Linux audio, I wanted to strip out background overhead.<\/p>\n<ul>\n<li> <strong>Crucial Discovery regarding <code>sommelier<\/code><\/strong>: I initially tried to disable <code>sommelier<\/code> (the Wayland\/X11 proxy display service), but the terminal crashed and Termina failed to start. In ChromeOS, <code>sommelier<\/code> manages the host-to-container IPC sockets. <strong>Leave <code>sommelier<\/code> running!<\/strong> <\/li>\n<li> <strong>Masking PipeWire &amp; PackageKit<\/strong>: I tried disabling <code>pipewire<\/code> and <code>packagekit<\/code>, but they kept restarting. The trick in <code>systemd<\/code> is that socket-activated services will automatically respawn whenever their socket is triggered. Using <code>mask<\/code> instead of <code>disable<\/code> permanently stops them: <\/li>\n<\/ul>\n<div>\n<pre><code> <span># Mask PipeWire audio services &amp; sockets<\/span> systemctl <span>--user<\/span> stop pipewire.service pipewire-pulse.service wireplumber.service filter-chain.service pipewire.socket pipewire-pulse.socket 2&gt;\/dev\/null systemctl <span>--user<\/span> mask pipewire.service pipewire-pulse.service wireplumber.service filter-chain.service pipewire.socket pipewire-pulse.socket 2&gt;\/dev\/null <span># Mask PackageKit (APT background update checker)<\/span> <span>sudo <\/span>systemctl stop packagekit 2&gt;\/dev\/null <span>sudo <\/span>systemctl mask packagekit 2&gt;\/dev\/null <\/code><\/pre>\n<div>\n<\/p><\/div>\n<\/p><\/div>\n<hr>\n<h3> <a name=\"conclusion\" href=\"#conclusion\"> <\/a> Conclusion <\/h3>\n<p>After this round of optimizations, I can happily say that I&#8217;m using the Lenovo Duet as my primary development machine. It easily handles AI harnesses, terminal code editors (like Neovim\/Micro), and web browsing. <\/p>\n<p>If you prefer VS Code, I recommend running <strong>VS Code Server<\/strong> inside Linux and accessing the editor interface directly through the Chrome browser: <\/p>\n<div>\n<pre><code>code serve-web <\/code><\/pre>\n<div>\n<\/p><\/div>\n<\/p><\/div>\n<p>This gives you the full VS Code experience without incurring the heavy RAM overhead of the Linux GUI container stack!<\/p>\n<\/p><\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>Fuente: <a href=\"https:\/\/dev.to\/onurcinar\/pushing-the-limits-turning-a-4gb-lenovo-duet-chromebook-into-my-primary-development-machine-3kao\">Art\u00edculo original<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>While everyone is pushing the limits of AI, I&#8217;ve been busy pushing the limits of a Lenovo Duet Chromebook tablet I inherited from my son. He used it as a school tablet for a year, but eventually got frustrated with its performance under their heavy workload. The tablet comes with just 4GB of RAM, but [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":4198,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"webixso_pending_account_ids":""},"categories":[41],"tags":[],"class_list":["post-4199","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-devto"],"jetpack_publicize_connections":[],"_links":{"self":[{"href":"https:\/\/tucumandevelopers.com\/index.php\/wp-json\/wp\/v2\/posts\/4199","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/tucumandevelopers.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/tucumandevelopers.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/tucumandevelopers.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/tucumandevelopers.com\/index.php\/wp-json\/wp\/v2\/comments?post=4199"}],"version-history":[{"count":0,"href":"https:\/\/tucumandevelopers.com\/index.php\/wp-json\/wp\/v2\/posts\/4199\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/tucumandevelopers.com\/index.php\/wp-json\/wp\/v2\/media\/4198"}],"wp:attachment":[{"href":"https:\/\/tucumandevelopers.com\/index.php\/wp-json\/wp\/v2\/media?parent=4199"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/tucumandevelopers.com\/index.php\/wp-json\/wp\/v2\/categories?post=4199"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/tucumandevelopers.com\/index.php\/wp-json\/wp\/v2\/tags?post=4199"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}