<?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: Akshay Jatin Solanki</title>
    <description>The latest articles on DEV Community by Akshay Jatin Solanki (@akshayjatinsolanki).</description>
    <link>https://dev.to/akshayjatinsolanki</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%2F3826290%2Fe451bb26-ccfd-4ce6-bab2-57d63f47c26a.jpg</url>
      <title>DEV Community: Akshay Jatin Solanki</title>
      <link>https://dev.to/akshayjatinsolanki</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/akshayjatinsolanki"/>
    <language>en</language>
    <item>
      <title>I Wanted YouTube's Simplicity in VLC — So I Built My Own Media Player</title>
      <dc:creator>Akshay Jatin Solanki</dc:creator>
      <pubDate>Thu, 01 Oct 2026 18:37:39 +0000</pubDate>
      <link>https://dev.to/akshayjatinsolanki/i-wanted-youtubes-simplicity-in-vlc-so-i-built-my-own-media-player-2bpp</link>
      <guid>https://dev.to/akshayjatinsolanki/i-wanted-youtubes-simplicity-in-vlc-so-i-built-my-own-media-player-2bpp</guid>
      <description>&lt;h1&gt;
  
  
  I Wanted YouTube's Simplicity in VLC — So I Built My Own Media Player
&lt;/h1&gt;

&lt;p&gt;I use VLC because it plays almost everything.&lt;/p&gt;

&lt;p&gt;MKV. MP4. WebM. AVI. MOV. Multiple audio tracks. Subtitles. You name it.&lt;/p&gt;

&lt;p&gt;But there was one thing I kept wishing VLC had:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A simpler, more modern interface.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Something that felt as easy to use as YouTube, while keeping the flexibility of a desktop media player.&lt;/p&gt;

&lt;p&gt;So I decided to build it.&lt;/p&gt;

&lt;p&gt;Meet &lt;strong&gt;Simple YT Style Player&lt;/strong&gt; — a lightweight media player inspired by &lt;strong&gt;YouTube's simplicity and VLC's versatility&lt;/strong&gt;, now running on both &lt;strong&gt;Windows and Android&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/akshayai1996/vlc-youtubeskin" rel="noopener noreferrer"&gt;&lt;strong&gt;View the project on GitHub →&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Before vs After
&lt;/h2&gt;

&lt;p&gt;The idea is easier to understand with a real example.&lt;/p&gt;

&lt;p&gt;Imagine you've downloaded a large MKV movie containing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Multiple audio languages&lt;/li&gt;
&lt;li&gt;Embedded subtitles&lt;/li&gt;
&lt;li&gt;A long runtime&lt;/li&gt;
&lt;li&gt;A quiet audio mix&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Before
&lt;/h3&gt;

&lt;p&gt;You open a traditional media player and start searching through menus for:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Audio Track
Subtitle Track
Playback Speed
Aspect Ratio
Rotation
Brightness
Volume
Loop
Picture-in-Picture
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The functionality is there, but the experience can feel unnecessarily complicated.&lt;/p&gt;

&lt;h3&gt;
  
  
  After
&lt;/h3&gt;

&lt;p&gt;The goal with Simple YT Style Player is much simpler:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Open file
   ↓
Choose audio / subtitles
   ↓
Play
   ↓
Swipe / seek / adjust
   ↓
Keep watching
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And when you need advanced controls, they're still there.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The idea was not to remove functionality — it was to make the functionality easier to reach.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What It Can Do
&lt;/h2&gt;

&lt;p&gt;The player currently supports a surprisingly wide range of playback features.&lt;/p&gt;

&lt;h3&gt;
  
  
  Playback
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;MKV, MP4, WebM, AVI, MOV and other formats supported through FFmpeg&lt;/li&gt;
&lt;li&gt;Multiple audio-track selection&lt;/li&gt;
&lt;li&gt;Embedded subtitle support&lt;/li&gt;
&lt;li&gt;Playback speed from &lt;strong&gt;0.25× to 2×&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Configurable skip interval&lt;/li&gt;
&lt;li&gt;Looping&lt;/li&gt;
&lt;li&gt;Resume playback&lt;/li&gt;
&lt;li&gt;Touch scrubbing&lt;/li&gt;
&lt;li&gt;Long-file hour-aware timestamps&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Picture &amp;amp; Sound
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;16:9, 4:3 and source aspect ratio&lt;/li&gt;
&lt;li&gt;Video rotation&lt;/li&gt;
&lt;li&gt;Brightness adjustment&lt;/li&gt;
&lt;li&gt;Volume up to &lt;strong&gt;200%&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Reactive audio visualiser with multiple themes&lt;/li&gt;
&lt;li&gt;Picture-in-picture mode&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;File associations&lt;/li&gt;
&lt;li&gt;Auto-hiding playback controls&lt;/li&gt;
&lt;li&gt;High-DPI support&lt;/li&gt;
&lt;li&gt;Keyboard shortcuts&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  One Player, Two Platforms
&lt;/h2&gt;

&lt;p&gt;One of the interesting parts of the project was making the same player work across &lt;strong&gt;Windows and Android&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The architecture is roughly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;             Simple YT Style Player
                       │
                Shared UI / Logic
                       │
              ┌────────┴────────┐
              │                 │
           Windows            Android
              │                 │
        Rust + FFmpeg      Rust + FFmpegKit
              │                 │
              └────────┬────────┘
                       │
                 Media Playback
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The project uses &lt;strong&gt;Tauri 2&lt;/strong&gt; as the native shell and &lt;strong&gt;Rust&lt;/strong&gt; for the core media operations.&lt;/p&gt;

&lt;p&gt;The interface itself is intentionally lightweight:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Vanilla HTML + CSS + JavaScript.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No UI framework is required.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Rust + Tauri?
&lt;/h2&gt;

&lt;p&gt;The first version of this project was built using &lt;strong&gt;Electron + HTML&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It worked, but I wanted the next version to feel more like a real native application.&lt;/p&gt;

&lt;p&gt;So version 2 was rebuilt around:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Tauri 2&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Rust&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;FFmpeg / FFprobe&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Vanilla HTML/CSS/JavaScript&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This gave me a shared application architecture that could target both desktop and mobile while keeping the core media logic in Rust.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Android Problem I Had to Solve
&lt;/h2&gt;

&lt;p&gt;One of the more interesting technical challenges was Android playback.&lt;/p&gt;

&lt;p&gt;A normal Android file picker can return a &lt;code&gt;content://&lt;/code&gt; URI.&lt;/p&gt;

&lt;p&gt;But the WebView-based interface cannot simply treat that URI like a normal local file.&lt;/p&gt;

&lt;p&gt;So the application resolves the selected file and serves it through a &lt;strong&gt;local HTTP connection&lt;/strong&gt;.&lt;/p&gt;

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

&lt;p&gt;Because video playback engines naturally work with HTTP byte-range requests.&lt;/p&gt;

&lt;p&gt;Instead of trying to force the player to consume an Android &lt;code&gt;content://&lt;/code&gt; URI directly, the application exposes the local file through a loopback connection and lets the video engine request the parts of the file it needs.&lt;/p&gt;

&lt;p&gt;That also means seeking and buffering behave much more naturally.&lt;/p&gt;

&lt;h2&gt;
  
  
  Subtitles Without Extra Files
&lt;/h2&gt;

&lt;p&gt;Another feature I wanted was support for subtitles embedded directly inside media containers.&lt;/p&gt;

&lt;p&gt;For example, an MKV can contain:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Movie
├── Video
├── English Audio
├── Hindi Audio
├── English Subtitles
└── Hindi Subtitles
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The player can inspect the container, expose the available subtitle tracks, and allow the user to switch between them without requiring separate &lt;code&gt;.srt&lt;/code&gt; files.&lt;/p&gt;

&lt;p&gt;The same idea applies to multiple audio tracks.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Controls Stay Out of the Way
&lt;/h2&gt;

&lt;p&gt;One design choice I particularly like is the &lt;strong&gt;auto-hiding control interface&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;During playback, the controls disappear rather than permanently occupying the screen.&lt;/p&gt;

&lt;p&gt;On mobile, the layout also adapts between portrait and landscape orientation.&lt;/p&gt;

&lt;p&gt;The goal is simple:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The video should remain the focus.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Picture-in-Picture
&lt;/h2&gt;

&lt;p&gt;Sometimes you don't actually want the video to stop just because you need to use another application.&lt;/p&gt;

&lt;p&gt;The player therefore supports &lt;strong&gt;picture-in-picture&lt;/strong&gt;, allowing playback to continue in a smaller floating window.&lt;/p&gt;

&lt;p&gt;This is particularly useful for tutorials, lectures, reference videos and long-form content.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keyboard Shortcuts
&lt;/h2&gt;

&lt;p&gt;The desktop version also supports familiar keyboard controls:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Key&lt;/th&gt;
&lt;th&gt;Action&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;Space&lt;/code&gt; / &lt;code&gt;K&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Play / Pause&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;M&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Mute / Unmute&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;O&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Open a file&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;F&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Fullscreen&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;I&lt;/code&gt; / &lt;code&gt;P&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Picture-in-picture&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;←&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Skip backward&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;→&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Skip forward&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  No Account. No Ads. No Telemetry.
&lt;/h2&gt;

&lt;p&gt;This is one of the principles behind the project.&lt;/p&gt;

&lt;p&gt;The player is designed to play &lt;strong&gt;your files&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;There is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No account&lt;/li&gt;
&lt;li&gt;No sign-in&lt;/li&gt;
&lt;li&gt;No advertising&lt;/li&gt;
&lt;li&gt;No analytics&lt;/li&gt;
&lt;li&gt;No external backend required for playback&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It can work completely offline.&lt;/p&gt;

&lt;h2&gt;
  
  
  Windows + Android Releases
&lt;/h2&gt;

&lt;p&gt;The current repository provides builds for:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Windows 10 / 11 (64-bit)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;and&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Android 8.0+ (arm64)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The installers and APK are available from the GitHub Releases page.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/akshayai1996/vlc-youtubeskin/releases" rel="noopener noreferrer"&gt;&lt;strong&gt;Download the latest release →&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Build It Yourself
&lt;/h2&gt;

&lt;p&gt;The project is open source and can also be built from source.&lt;/p&gt;

&lt;h3&gt;
  
  
  Windows
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install
&lt;/span&gt;npm run tauri:build
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For development:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm run tauri:dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Android
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;rustup target add aarch64-linux-android
npm run android:dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For an APK:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm run android:apk
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The repository also includes automated Rust tests for media probing, subtitle extraction and audio remuxing using real FFmpeg-generated media fixtures.&lt;/p&gt;

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

&lt;p&gt;The project separates the user interface from the platform-specific media implementation.&lt;/p&gt;

&lt;p&gt;This became especially important when adding Android support because Windows and Android cannot execute FFmpeg in exactly the same way.&lt;/p&gt;

&lt;p&gt;Windows uses FFmpeg sidecar processes, while Android uses FFmpegKit in-process through JNI.&lt;/p&gt;

&lt;p&gt;The higher-level player logic can still remain shared.&lt;/p&gt;

&lt;h2&gt;
  
  
  From a "Skin" to a Real Player
&lt;/h2&gt;

&lt;p&gt;The project started from a simple idea:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"What if VLC had a cleaner, more YouTube-like interface?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;But that idea gradually grew into something bigger.&lt;/p&gt;

&lt;p&gt;Version 1 was an Electron + HTML implementation for Windows.&lt;/p&gt;

&lt;p&gt;Version 2 became a &lt;strong&gt;Rust + Tauri 2 application for Windows and Android&lt;/strong&gt;, with a growing set of playback and mobile features.&lt;/p&gt;

&lt;p&gt;So although the repository is still called:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;vlc-youtubeskin&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;the project has evolved into something closer to a standalone media player.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Want to Build Next
&lt;/h2&gt;

&lt;p&gt;There is still plenty I'd like to improve.&lt;/p&gt;

&lt;p&gt;Possible future directions include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;More playback controls&lt;/li&gt;
&lt;li&gt;Better media library management&lt;/li&gt;
&lt;li&gt;Additional mobile polish&lt;/li&gt;
&lt;li&gt;More visual themes&lt;/li&gt;
&lt;li&gt;Playlist support&lt;/li&gt;
&lt;li&gt;Further performance improvements&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The project is still evolving.&lt;/p&gt;

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

&lt;p&gt;If you've ever wanted something between &lt;strong&gt;VLC's compatibility&lt;/strong&gt; and &lt;strong&gt;YouTube's simplicity&lt;/strong&gt;, give it a try.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;⭐ &lt;a href="https://github.com/akshayai1996/vlc-youtubeskin" rel="noopener noreferrer"&gt;GitHub — Simple YT Style Player&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The project is released under the &lt;strong&gt;MIT License&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;And that's really how this started:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I wanted a media player I'd actually enjoy using, so I built one.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>tauri</category>
      <category>rust</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Outlook Can't Search Multiple Categories — So I Built It</title>
      <dc:creator>Akshay Jatin Solanki</dc:creator>
      <pubDate>Thu, 01 Oct 2026 18:31:59 +0000</pubDate>
      <link>https://dev.to/akshayjatinsolanki/outlook-cant-search-multiple-categories-so-i-built-it-4c97</link>
      <guid>https://dev.to/akshayjatinsolanki/outlook-cant-search-multiple-categories-so-i-built-it-4c97</guid>
      <description>&lt;h1&gt;
  
  
  Outlook Can't Search Multiple Categories — So I Built It
&lt;/h1&gt;

&lt;p&gt;I use Outlook categories heavily to organise email.&lt;/p&gt;

&lt;p&gt;Project. Client. Follow Up. Important. Finance.&lt;/p&gt;

&lt;p&gt;The problem came later.&lt;/p&gt;

&lt;p&gt;Once I had several categories assigned to hundreds or thousands of emails, I wanted to do something simple:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"Show me emails that have BOTH &lt;code&gt;Project&lt;/code&gt; AND &lt;code&gt;Follow Up&lt;/code&gt;."&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Or:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"Show me emails that have &lt;code&gt;Finance&lt;/code&gt; OR &lt;code&gt;Client&lt;/code&gt;."&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That is where Outlook's native search became frustrating.&lt;/p&gt;

&lt;p&gt;So instead of continuing to manually scroll through folders and emails, I built my own &lt;strong&gt;multi-category search tool using Outlook VBA&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/akshayai1996/outlook-vba-category-search" rel="noopener noreferrer"&gt;&lt;strong&gt;View the project on GitHub →&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;The tool adds a dedicated search panel to &lt;strong&gt;Classic Outlook on Windows&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;You can select multiple categories and choose how they should be matched:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AND&lt;/strong&gt; — an email must contain &lt;em&gt;all&lt;/em&gt; selected categories&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OR&lt;/strong&gt; — an email must contain &lt;em&gt;at least one&lt;/em&gt; selected category&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then you can further narrow the results using additional filters.&lt;/p&gt;

&lt;h2&gt;
  
  
  Before vs After
&lt;/h2&gt;

&lt;p&gt;Here's the kind of problem that led me to build it.&lt;/p&gt;

&lt;p&gt;Imagine you have an email history containing:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;500+ emails
↓
Categories:
Project
Client
Follow Up
Finance
Important
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You want:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Find emails tagged &lt;strong&gt;Project + Follow Up&lt;/strong&gt; from a particular sender, received this month, including only messages with attachments.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Before
&lt;/h3&gt;

&lt;p&gt;The workflow becomes a collection of manual steps:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. Open Outlook search
2. Filter by category
3. Check results manually
4. Try another filter
5. Open messages one by one
6. Repeat across folders/subfolders
7. Remember which emails you already checked
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The more conditions you add, the more tedious it becomes.&lt;/p&gt;

&lt;h3&gt;
  
  
  After
&lt;/h3&gt;

&lt;p&gt;With the VBA search panel:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Categories:
☑ Project
☑ Follow Up

Match:
◉ AND
○ OR

Sender:
client@example.com

Date:
01 Sep → 30 Sep

Attachments:
☑ Only emails with attachments

Scope:
Inbox + Subfolders
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Click Search.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The results are returned in a single grid showing the subject, sender, received date, categories and folder.&lt;/p&gt;

&lt;p&gt;From there you can double-click an email, export the results to Excel, or save the matched emails to another Outlook folder.&lt;/p&gt;

&lt;p&gt;That was the whole idea behind the project:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Turn a frustrating manual search into one repeatable query.&lt;/strong&gt;&lt;/p&gt;

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

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Multi-category search&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Search multiple Outlook categories together using AND / OR logic&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Scope control&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Search the Inbox, subfolders, whole mailbox, or shared mailboxes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Sender filter&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Filter results by sender&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Keyword filter&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Search subject or email body&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Attachment filter&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Find emails with attachments&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Date range&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Filter emails by received date&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Results grid&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;View subject, sender, date, categories and folder&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Open email&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Double-click a result to open the message&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Export to Excel&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Export the result list&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Save to folder&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Move or copy matched emails to another Outlook folder&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Everything runs locally inside Outlook.&lt;/p&gt;

&lt;p&gt;There is no external server, third-party service, or data upload involved.&lt;/p&gt;

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

&lt;p&gt;The interesting part wasn't really the VBA form.&lt;/p&gt;

&lt;p&gt;The real problem was &lt;strong&gt;information retrieval&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I had already done the work of categorising my emails. The categories contained useful information about the context of each message.&lt;/p&gt;

&lt;p&gt;But once there were many categories, finding the exact combination I needed became difficult.&lt;/p&gt;

&lt;p&gt;I wanted something that felt less like manually navigating an email client and more like querying my own organised email history.&lt;/p&gt;

&lt;p&gt;So the workflow became:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Categorise → Select conditions → Search → Get the exact matching emails&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Technical Part
&lt;/h2&gt;

&lt;p&gt;One of the most important implementation decisions was avoiding a simple loop through every Outlook mail item.&lt;/p&gt;

&lt;p&gt;A straightforward approach would look something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;For Each objItem In objFolder.Items
    ' Inspect the email
Next
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That works, but it becomes increasingly expensive as the mailbox grows.&lt;/p&gt;

&lt;p&gt;Instead, the tool uses Outlook's &lt;code&gt;Folder.GetTable&lt;/code&gt; functionality.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Dim objTable As Outlook.Table

Set objTable = objFolder.GetTable( _
    Filter:=strDASL, _
    Columns:="Subject,ReceivedTime,SenderName,Categories,EntryID")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The idea is simple:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Read the properties required for the search without fully opening every email.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This keeps the search process lightweight, particularly when working with larger mail folders.&lt;/p&gt;

&lt;h2&gt;
  
  
  Exact Category Matching Matters
&lt;/h2&gt;

&lt;p&gt;There is another small detail that can cause surprisingly bad search results.&lt;/p&gt;

&lt;p&gt;Imagine you have these categories:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;HR
HRS
HR-Policy
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A simple substring test such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;If InStr(1, strCats, "HR", vbTextCompare) &amp;gt; 0 Then
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;can produce false matches.&lt;/p&gt;

&lt;p&gt;The tool therefore uses token-based category matching so that &lt;code&gt;HR&lt;/code&gt; is treated as a distinct category rather than simply matching text containing &lt;code&gt;HR&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;That sounds minor, but it makes the search results much more trustworthy.&lt;/p&gt;

&lt;h2&gt;
  
  
  Search Scope
&lt;/h2&gt;

&lt;p&gt;Another thing I wanted was control over &lt;strong&gt;where&lt;/strong&gt; the search happens.&lt;/p&gt;

&lt;p&gt;The tool supports searching across different scopes rather than forcing everything into a single folder.&lt;/p&gt;

&lt;p&gt;That means you can use the same search idea for:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Inbox
Inbox + Subfolders
Whole Mailbox
Shared Mailboxes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This becomes especially useful when Outlook rules have already distributed emails across multiple folders.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Results Window
&lt;/h2&gt;

&lt;p&gt;The search results are presented in a grid containing information such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Subject
Sender
Received Date
Categories
Folder
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;From there, you can open a message directly, export the result list to Excel, or save the matching emails to another Outlook folder.&lt;/p&gt;

&lt;p&gt;So the tool is not only a filter — it is intended to be a small workflow around finding and acting on the results.&lt;/p&gt;

&lt;h2&gt;
  
  
  Installation
&lt;/h2&gt;

&lt;p&gt;The project is VBA-based, so there is no traditional installer.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Open Outlook's VBA Editor
&lt;/h3&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Alt + F11
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Import the VBA module
&lt;/h3&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;modCategorySearch.bas
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Create the two UserForms
&lt;/h3&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;frmCategorySearch
frmResults
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then paste the corresponding form code from the repository.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Run the macro
&lt;/h3&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ShowCategorySearch
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can also add the macro to Outlook's Quick Access Toolbar.&lt;/p&gt;

&lt;p&gt;The complete installation instructions are available in the repository README.&lt;/p&gt;

&lt;h2&gt;
  
  
  Project Structure
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Email_Categorizer_outlookvba/
├── modCategorySearch.bas
├── frmCategorySearch_code.txt
├── frmResults_code.txt
└── Smart_Email_Search_no_logo.png
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Privacy
&lt;/h2&gt;

&lt;p&gt;This was designed as a &lt;strong&gt;local productivity tool&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The repository does not require a web service or external backend.&lt;/p&gt;

&lt;p&gt;The search runs through Outlook VBA on the user's machine.&lt;/p&gt;

&lt;h2&gt;
  
  
  Limitations
&lt;/h2&gt;

&lt;p&gt;This project is intentionally built around &lt;strong&gt;Classic Outlook on Windows&lt;/strong&gt; and VBA.&lt;/p&gt;

&lt;p&gt;That also means it comes with the limitations of Outlook VBA itself.&lt;/p&gt;

&lt;p&gt;There is no modern web-based add-in architecture here, and installation currently involves importing the module and creating the required UserForms.&lt;/p&gt;

&lt;p&gt;For this project, that trade-off was acceptable because the goal was straightforward:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Make searching my categorised Outlook mail significantly easier without introducing an external application.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Want to Improve Next
&lt;/h2&gt;

&lt;p&gt;There are several directions I'd like to explore:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Easier installation&lt;/li&gt;
&lt;li&gt;Saved search presets&lt;/li&gt;
&lt;li&gt;More advanced search combinations&lt;/li&gt;
&lt;li&gt;A more polished interface&lt;/li&gt;
&lt;li&gt;Potentially a proper Outlook add-in implementation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But for now, the VBA version solves the problem I originally set out to solve.&lt;/p&gt;

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

&lt;p&gt;If you use Outlook categories heavily and have ever wished you could search several of them together, you can check out the project here:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;⭐ &lt;a href="https://github.com/akshayai1996/outlook-vba-category-search" rel="noopener noreferrer"&gt;GitHub — Outlook VBA Multi-Category Search&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The project is released under the &lt;strong&gt;MIT License&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I'd especially be interested in hearing from people who use large Outlook mailboxes and have found other limitations in Outlook's native category/search workflow.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Built because sometimes the best way to fix a productivity problem is to build the missing feature yourself.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>vba</category>
      <category>outlook</category>
      <category>productivity</category>
      <category>showdev</category>
    </item>
    <item>
      <title>I Built My Own AI Copilot for Excel Desktop — Without Paying for Microsoft 365 Copilot</title>
      <dc:creator>Akshay Jatin Solanki</dc:creator>
      <pubDate>Mon, 21 Sep 2026 06:01:10 +0000</pubDate>
      <link>https://dev.to/akshayjatinsolanki/i-built-my-own-ai-copilot-for-excel-desktop-without-paying-for-microsoft-365-copilot-320g</link>
      <guid>https://dev.to/akshayjatinsolanki/i-built-my-own-ai-copilot-for-excel-desktop-without-paying-for-microsoft-365-copilot-320g</guid>
      <description>&lt;p&gt;I use Excel a lot.&lt;/p&gt;

&lt;p&gt;And like many Excel users, I eventually wanted something more powerful than formulas, VBA, and endless clicking.&lt;/p&gt;

&lt;p&gt;I wanted to be able to say:&lt;/p&gt;

&lt;p&gt;«"Clean this data."»&lt;/p&gt;

&lt;p&gt;«"Find the duplicate customers."»&lt;/p&gt;

&lt;p&gt;«"Create a chart from this table."»&lt;/p&gt;

&lt;p&gt;«"Format this report professionally."»&lt;/p&gt;

&lt;p&gt;«"Add formulas to calculate the margin."»&lt;/p&gt;

&lt;p&gt;«"Find the errors in this workbook."»&lt;/p&gt;

&lt;p&gt;…and have AI actually do it inside Excel.&lt;/p&gt;

&lt;p&gt;Microsoft already has a solution for this: Copilot for Excel.&lt;/p&gt;

&lt;p&gt;So naturally, I tried it.&lt;/p&gt;

&lt;p&gt;And after using it, I had a question:&lt;/p&gt;

&lt;p&gt;What if I could build my own version?&lt;/p&gt;

&lt;p&gt;Not another chatbot that tells me which Excel formula to type.&lt;/p&gt;

&lt;p&gt;I mean an actual AI assistant sitting inside native Excel Desktop, capable of turning natural-language instructions into real Excel operations.&lt;/p&gt;

&lt;p&gt;So I started building one.&lt;/p&gt;

&lt;p&gt;And this is what came out of it:&lt;/p&gt;

&lt;p&gt;🚀 Excel AI Assistant&lt;/p&gt;

&lt;p&gt;GitHub repository:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/akshayai1996/excel-addin-ai" rel="noopener noreferrer"&gt;https://github.com/akshayai1996/excel-addin-ai&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The project is an Excel Desktop add-in that provides a Copilot-style AI sidebar, but instead of being tied to Microsoft's Copilot experience, it uses OpenCode as the AI interface.&lt;/p&gt;

&lt;p&gt;The basic idea is:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;          ┌─────────────────────┐
          │     Excel Desktop    │
          │                     │
          │  ┌───────────────┐  │
          │  │   AI Sidebar  │  │
          │  │               │  │
          │  │ "Clean this   │  │
          │  │  spreadsheet" │  │
          │  └───────┬───────┘  │
          └──────────┼───────────┘
                     │
                 Office.js
                     │
                     ▼
          ┌─────────────────────┐
          │   Python Bridge     │
          │  bridge_server.py   │
          └──────────┬──────────┘
                     │
                  OpenCode
                     │
                     ▼
          ┌─────────────────────┐
          │  AI Model / Provider│
          └─────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;The important part is that the AI doesn't directly manipulate Excel.&lt;/p&gt;

&lt;p&gt;It produces structured actions.&lt;/p&gt;

&lt;p&gt;Those actions are then validated and executed by the Excel add-in.&lt;/p&gt;

&lt;p&gt;That distinction ended up being one of the most important architectural decisions in the project.&lt;/p&gt;




&lt;p&gt;Why I Started Building This&lt;/p&gt;

&lt;p&gt;My original motivation wasn't:&lt;/p&gt;

&lt;p&gt;«"I want to replace Microsoft."»&lt;/p&gt;

&lt;p&gt;It was much simpler.&lt;/p&gt;

&lt;p&gt;I wanted an AI assistant that I could actually use for long Excel sessions without constantly worrying about the Copilot usage allowance.&lt;/p&gt;

&lt;p&gt;When I experimented with Microsoft Copilot for Excel, I found that after a relatively small number of interactions/edits, I could hit usage limitations.&lt;/p&gt;

&lt;p&gt;For someone doing serious spreadsheet work, that changes the experience.&lt;/p&gt;

&lt;p&gt;Imagine working on a complicated engineering workbook and telling the AI:&lt;/p&gt;

&lt;p&gt;Fix the formulas.&lt;/p&gt;

&lt;p&gt;Then:&lt;/p&gt;

&lt;p&gt;Now format the headers.&lt;/p&gt;

&lt;p&gt;Then:&lt;/p&gt;

&lt;p&gt;Create a summary sheet.&lt;/p&gt;

&lt;p&gt;Then:&lt;/p&gt;

&lt;p&gt;Add a chart.&lt;/p&gt;

&lt;p&gt;Then:&lt;/p&gt;

&lt;p&gt;Find anything that looks wrong.&lt;/p&gt;

&lt;p&gt;An AI assistant becomes much more useful when you can keep iterating.&lt;/p&gt;

&lt;p&gt;So I started wondering:&lt;/p&gt;

&lt;p&gt;Why should the Excel interface and the AI provider have to be the same product?&lt;/p&gt;

&lt;p&gt;What if Excel was simply the interface...&lt;/p&gt;

&lt;p&gt;…and I could choose the AI layer separately?&lt;/p&gt;

&lt;p&gt;That became the idea behind this project.&lt;/p&gt;




&lt;p&gt;The Core Idea&lt;/p&gt;

&lt;p&gt;The project tries to separate three things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Excel&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Excel remains the actual spreadsheet application.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;AI interface&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The sidebar communicates with an AI system through OpenCode.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Excel execution engine&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;JavaScript receives structured instructions and performs the actual Excel operations through Office.js.&lt;/p&gt;

&lt;p&gt;So instead of:&lt;/p&gt;

&lt;p&gt;User → AI → Random JavaScript → Excel&lt;/p&gt;

&lt;p&gt;I designed it more like:&lt;/p&gt;

&lt;p&gt;User&lt;br&gt;
  ↓&lt;br&gt;
Natural language&lt;br&gt;
  ↓&lt;br&gt;
AI&lt;br&gt;
  ↓&lt;br&gt;
Structured Excel actions&lt;br&gt;
  ↓&lt;br&gt;
Validation&lt;br&gt;
  ↓&lt;br&gt;
Office.js execution&lt;br&gt;
  ↓&lt;br&gt;
Excel&lt;/p&gt;

&lt;p&gt;That architecture makes the AI layer much easier to control.&lt;/p&gt;




&lt;p&gt;What Can I Ask It To Do?&lt;/p&gt;

&lt;p&gt;This is where it becomes interesting.&lt;/p&gt;

&lt;p&gt;The assistant isn't just answering questions about Excel.&lt;/p&gt;

&lt;p&gt;It can perform actual workbook operations.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;p&gt;"Create a table from A1:F500."&lt;/p&gt;

&lt;p&gt;or:&lt;/p&gt;

&lt;p&gt;"Sort the sales data by revenue descending."&lt;/p&gt;

&lt;p&gt;or:&lt;/p&gt;

&lt;p&gt;"Find duplicate customer IDs and highlight them."&lt;/p&gt;

&lt;p&gt;or:&lt;/p&gt;

&lt;p&gt;"Add a formula for profit margin."&lt;/p&gt;

&lt;p&gt;or:&lt;/p&gt;

&lt;p&gt;"Create a column chart showing monthly revenue."&lt;/p&gt;

&lt;p&gt;or:&lt;/p&gt;

&lt;p&gt;"Freeze the top row."&lt;/p&gt;

&lt;p&gt;or:&lt;/p&gt;

&lt;p&gt;"Replace all occurrences of LTCS with CS."&lt;/p&gt;

&lt;p&gt;It also supports more advanced workbook operations such as pivot tables, charts, conditional formatting, formatting, formula operations, structural changes, and other Excel actions.&lt;/p&gt;

&lt;p&gt;The AI converts the request into a structured action.&lt;/p&gt;

&lt;p&gt;For example, conceptually:&lt;/p&gt;

&lt;p&gt;{&lt;br&gt;
  "type": "sort_range",&lt;br&gt;
  "sheet": "Sales",&lt;br&gt;
  "range": "A1:F500",&lt;br&gt;
  "column": 6,&lt;br&gt;
  "ascending": false&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;The Excel execution layer then interprets that instruction.&lt;/p&gt;

&lt;p&gt;The model doesn't get unrestricted access to execute arbitrary JavaScript.&lt;/p&gt;

&lt;p&gt;That's intentional.&lt;/p&gt;




&lt;p&gt;Natural Language → Actions&lt;/p&gt;

&lt;p&gt;This is probably my favourite part of the architecture.&lt;/p&gt;

&lt;p&gt;Suppose I tell the assistant:&lt;/p&gt;

&lt;p&gt;«"Format this report professionally."»&lt;/p&gt;

&lt;p&gt;That's vague.&lt;/p&gt;

&lt;p&gt;The AI might decide that this means:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Identify the header row&lt;/li&gt;
&lt;li&gt;Make headers bold&lt;/li&gt;
&lt;li&gt;Apply suitable number formats&lt;/li&gt;
&lt;li&gt;Add borders&lt;/li&gt;
&lt;li&gt;Adjust column widths&lt;/li&gt;
&lt;li&gt;Freeze the header row&lt;/li&gt;
&lt;li&gt;Create a table&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Those become structured Excel actions.&lt;/p&gt;

&lt;p&gt;Something like:&lt;/p&gt;

&lt;p&gt;format_range&lt;br&gt;
set_number_format&lt;br&gt;
borders&lt;br&gt;
freeze_panes&lt;br&gt;
create_table&lt;/p&gt;

&lt;p&gt;The execution layer handles them.&lt;/p&gt;

&lt;p&gt;This means the AI can reason about the workbook while the deterministic JavaScript layer remains responsible for actually changing it.&lt;/p&gt;




&lt;p&gt;I Didn't Want Just Another Chatbot&lt;/p&gt;

&lt;p&gt;There are already thousands of AI chat interfaces.&lt;/p&gt;

&lt;p&gt;I wasn't interested in building another one.&lt;/p&gt;

&lt;p&gt;The interesting question for me was:&lt;/p&gt;

&lt;p&gt;«Can an AI assistant actually operate Excel?»&lt;/p&gt;

&lt;p&gt;There's a huge difference between:&lt;/p&gt;

&lt;p&gt;AI says:&lt;/p&gt;

&lt;p&gt;«"You can use "=SUM(A1:A100)"."»&lt;/p&gt;

&lt;p&gt;and:&lt;/p&gt;

&lt;p&gt;AI actually inserts the formula into Excel.&lt;/p&gt;

&lt;p&gt;The second one is much more useful.&lt;/p&gt;

&lt;p&gt;That's the experience I was trying to build.&lt;/p&gt;




&lt;p&gt;The Excel Add-in&lt;/p&gt;

&lt;p&gt;The frontend is built using the Office.js ecosystem.&lt;/p&gt;

&lt;p&gt;The main pieces are:&lt;/p&gt;

&lt;p&gt;taskpane.html&lt;br&gt;
taskpane.css&lt;br&gt;
taskpane.js&lt;br&gt;
excel_actions.js&lt;/p&gt;

&lt;p&gt;The task pane provides the conversational interface.&lt;/p&gt;

&lt;p&gt;"taskpane.js" handles the assistant interaction and communication with the bridge.&lt;/p&gt;

&lt;p&gt;And "excel_actions.js" acts as the Excel execution layer.&lt;/p&gt;

&lt;p&gt;The latter is intentionally substantial because Excel operations aren't always as simple as:&lt;/p&gt;

&lt;p&gt;range.values = ...&lt;/p&gt;

&lt;p&gt;Real spreadsheets have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;formulas&lt;/li&gt;
&lt;li&gt;formatting&lt;/li&gt;
&lt;li&gt;tables&lt;/li&gt;
&lt;li&gt;charts&lt;/li&gt;
&lt;li&gt;merged cells&lt;/li&gt;
&lt;li&gt;hidden rows&lt;/li&gt;
&lt;li&gt;hidden columns&lt;/li&gt;
&lt;li&gt;filters&lt;/li&gt;
&lt;li&gt;conditional formatting&lt;/li&gt;
&lt;li&gt;freeze panes&lt;/li&gt;
&lt;li&gt;structural changes&lt;/li&gt;
&lt;li&gt;workbook state&lt;/li&gt;
&lt;li&gt;undo requirements&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So the execution layer needs to be much more careful.&lt;/p&gt;




&lt;p&gt;The Python Bridge&lt;/p&gt;

&lt;p&gt;The second major component is:&lt;/p&gt;

&lt;p&gt;server/bridge_server.py&lt;/p&gt;

&lt;p&gt;This acts as the bridge between the Office.js frontend and OpenCode.&lt;/p&gt;

&lt;p&gt;Conceptually:&lt;/p&gt;

&lt;p&gt;Excel WebView&lt;br&gt;
      ↓&lt;br&gt;
HTTP request&lt;br&gt;
      ↓&lt;br&gt;
Python bridge&lt;br&gt;
      ↓&lt;br&gt;
OpenCode&lt;br&gt;
      ↓&lt;br&gt;
AI model&lt;br&gt;
      ↓&lt;br&gt;
Structured response&lt;br&gt;
      ↓&lt;br&gt;
Excel&lt;/p&gt;

&lt;p&gt;The bridge also contains the system instructions that tell the AI what kinds of Excel actions it is allowed to generate.&lt;/p&gt;

&lt;p&gt;This is important.&lt;/p&gt;

&lt;p&gt;Instead of asking the model:&lt;/p&gt;

&lt;p&gt;«"Give me some JavaScript to modify Excel."»&lt;/p&gt;

&lt;p&gt;I ask it to produce a known action format.&lt;/p&gt;

&lt;p&gt;That gives the application a much clearer contract between the AI and Excel.&lt;/p&gt;




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

&lt;p&gt;This project isn't based on a single hard-coded AI model.&lt;/p&gt;

&lt;p&gt;That's deliberate.&lt;/p&gt;

&lt;p&gt;OpenCode provides an interface through which different AI models/providers can be used.&lt;/p&gt;

&lt;p&gt;That means the Excel interface doesn't have to care whether the underlying model changes.&lt;/p&gt;

&lt;p&gt;The architecture becomes:&lt;/p&gt;

&lt;p&gt;Excel AI Assistant&lt;br&gt;
        │&lt;br&gt;
        ▼&lt;br&gt;
     OpenCode&lt;br&gt;
        │&lt;br&gt;
        ├── Model A&lt;br&gt;
        ├── Model B&lt;br&gt;
        ├── Model C&lt;br&gt;
        └── Other supported providers&lt;/p&gt;

&lt;p&gt;That separation is powerful.&lt;/p&gt;

&lt;p&gt;The Excel add-in becomes the product.&lt;/p&gt;

&lt;p&gt;The AI model becomes an interchangeable component.&lt;/p&gt;

&lt;p&gt;And that's exactly what I wanted.&lt;/p&gt;




&lt;p&gt;One Important Clarification: This Is Not a "Fully Local AI" Project&lt;/p&gt;

&lt;p&gt;I want to be very clear about this because "local AI" can be misleading.&lt;/p&gt;

&lt;p&gt;The Excel add-in and Python bridge run locally on the user's computer.&lt;/p&gt;

&lt;p&gt;However, OpenCode can communicate with cloud-based AI providers depending on the configuration and model being used.&lt;/p&gt;

&lt;p&gt;So I'm not claiming:&lt;/p&gt;

&lt;p&gt;«"Your spreadsheet never leaves your computer."»&lt;/p&gt;

&lt;p&gt;That's not the point of this project.&lt;/p&gt;

&lt;p&gt;The point is different:&lt;/p&gt;

&lt;p&gt;«You can build a Copilot-style Excel experience while choosing the AI layer independently of Microsoft 365 Copilot.»&lt;/p&gt;

&lt;p&gt;If someone configures OpenCode with a local model, that's a different setup.&lt;/p&gt;

&lt;p&gt;If they configure it with a cloud provider, the model provider's data handling and policies apply.&lt;/p&gt;

&lt;p&gt;I think being explicit about this is important.&lt;/p&gt;




&lt;p&gt;What About Cost?&lt;/p&gt;

&lt;p&gt;This is another area where I don't want to make misleading claims.&lt;/p&gt;

&lt;p&gt;The project itself doesn't require a Microsoft 365 Copilot subscription.&lt;/p&gt;

&lt;p&gt;But that does not mean AI inference is universally free.&lt;/p&gt;

&lt;p&gt;Depending on how OpenCode is configured, the underlying model/provider may have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;free usage&lt;/li&gt;
&lt;li&gt;paid usage&lt;/li&gt;
&lt;li&gt;rate limits&lt;/li&gt;
&lt;li&gt;API limits&lt;/li&gt;
&lt;li&gt;account requirements&lt;/li&gt;
&lt;li&gt;subscription requirements&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So I wouldn't describe this project as:&lt;/p&gt;

&lt;p&gt;«"Unlimited free AI."»&lt;/p&gt;

&lt;p&gt;Instead, I'd describe it as:&lt;/p&gt;

&lt;p&gt;«"A Copilot-style Excel interface where the AI backend is decoupled from Microsoft 365 Copilot."»&lt;/p&gt;

&lt;p&gt;That distinction matters.&lt;/p&gt;




&lt;p&gt;Safety Was a Big Concern&lt;/p&gt;

&lt;p&gt;Giving an AI access to a spreadsheet is different from asking it to write a poem.&lt;/p&gt;

&lt;p&gt;A bad Excel action can potentially destroy data.&lt;/p&gt;

&lt;p&gt;So I didn't want the architecture to simply be:&lt;/p&gt;

&lt;p&gt;AI → execute whatever it says&lt;/p&gt;

&lt;p&gt;The project includes several layers intended to make workbook modifications safer.&lt;/p&gt;

&lt;p&gt;Structured actions&lt;/p&gt;

&lt;p&gt;The AI generates known action types instead of arbitrary JavaScript.&lt;/p&gt;

&lt;p&gt;Validation&lt;/p&gt;

&lt;p&gt;The bridge validates the structured response before passing it to the execution layer.&lt;/p&gt;

&lt;p&gt;Transaction-style execution&lt;/p&gt;

&lt;p&gt;The Excel execution layer is designed around grouped operations and state management.&lt;/p&gt;

&lt;p&gt;Undo / redo&lt;/p&gt;

&lt;p&gt;The project includes transactional undo/redo functionality.&lt;/p&gt;

&lt;p&gt;Workbook backups&lt;/p&gt;

&lt;p&gt;Automatic ".xlsx" backups can be created before batches of modifications.&lt;/p&gt;

&lt;p&gt;These aren't guarantees that an AI can never make a mistake.&lt;/p&gt;

&lt;p&gt;They're safeguards around an inherently probabilistic system.&lt;/p&gt;




&lt;p&gt;It Can Work With Charts, Pivot Tables and More&lt;/p&gt;

&lt;p&gt;One thing I particularly wanted was for the assistant to go beyond simple cell edits.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;p&gt;«"Create a chart showing revenue by month."»&lt;/p&gt;

&lt;p&gt;or:&lt;/p&gt;

&lt;p&gt;«"Create a pivot table summarising sales by region."»&lt;/p&gt;

&lt;p&gt;or:&lt;/p&gt;

&lt;p&gt;«"Highlight negative margins with conditional formatting."»&lt;/p&gt;

&lt;p&gt;The assistant can translate these requests into structured Excel actions rather than merely explaining how to perform them manually.&lt;/p&gt;

&lt;p&gt;That turns the interaction from:&lt;/p&gt;

&lt;p&gt;Chatbot + instructions&lt;/p&gt;

&lt;p&gt;into:&lt;/p&gt;

&lt;p&gt;AI + spreadsheet manipulation&lt;/p&gt;

&lt;p&gt;which is a much more interesting application.&lt;/p&gt;




&lt;p&gt;I Also Added Test Workbooks&lt;/p&gt;

&lt;p&gt;The repository includes test data such as:&lt;/p&gt;

&lt;p&gt;test-data/&lt;br&gt;
├── messy_test.xlsx&lt;br&gt;
├── sales_test.xlsx&lt;br&gt;
└── make_test_workbooks.py&lt;/p&gt;

&lt;p&gt;I think this is important for an AI-powered spreadsheet application.&lt;/p&gt;

&lt;p&gt;You don't want to test everything against your only important workbook.&lt;/p&gt;

&lt;p&gt;A deliberately messy workbook gives the assistant something realistic to work on.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;p&gt;Messy data&lt;br&gt;
   ↓&lt;br&gt;
AI analysis&lt;br&gt;
   ↓&lt;br&gt;
Cleaning actions&lt;br&gt;
   ↓&lt;br&gt;
Excel execution&lt;br&gt;
   ↓&lt;br&gt;
Verification&lt;/p&gt;

&lt;p&gt;That's a much better development loop.&lt;/p&gt;




&lt;p&gt;The Project Structure&lt;/p&gt;

&lt;p&gt;At a high level:&lt;/p&gt;

&lt;p&gt;excel-addin-ai/&lt;br&gt;
│&lt;br&gt;
├── manifest.xml&lt;br&gt;
├── README.md&lt;br&gt;
├── DESKTOP_SETUP.md&lt;br&gt;
├── setup_desktop.ps1&lt;br&gt;
├── start_server.bat&lt;br&gt;
│&lt;br&gt;
├── server/&lt;br&gt;
│   └── bridge_server.py&lt;br&gt;
│&lt;br&gt;
├── src/&lt;br&gt;
│   ├── taskpane.html&lt;br&gt;
│   ├── taskpane.css&lt;br&gt;
│   ├── taskpane.js&lt;br&gt;
│   └── excel_actions.js&lt;br&gt;
│&lt;br&gt;
├── assets/&lt;br&gt;
│   ├── screenshots&lt;br&gt;
│   ├── demo media&lt;br&gt;
│   └── icons&lt;br&gt;
│&lt;br&gt;
└── test-data/&lt;br&gt;
    ├── messy_test.xlsx&lt;br&gt;
    ├── sales_test.xlsx&lt;br&gt;
    └── make_test_workbooks.py&lt;/p&gt;

&lt;p&gt;It's intentionally not a giant AI framework.&lt;/p&gt;

&lt;p&gt;It's basically:&lt;/p&gt;

&lt;p&gt;Office.js + JavaScript + Python + OpenCode + Excel.&lt;/p&gt;




&lt;p&gt;Installing It&lt;/p&gt;

&lt;p&gt;The project is primarily aimed at Excel Desktop on Windows.&lt;/p&gt;

&lt;p&gt;The repository contains setup scripts and documentation for the desktop environment.&lt;/p&gt;

&lt;p&gt;The rough flow is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Clone repository&lt;/li&gt;
&lt;li&gt;Install dependencies&lt;/li&gt;
&lt;li&gt;Start local bridge&lt;/li&gt;
&lt;li&gt;Sideload Excel manifest&lt;/li&gt;
&lt;li&gt;Open Excel Desktop&lt;/li&gt;
&lt;li&gt;Open the AI task pane&lt;/li&gt;
&lt;li&gt;Start talking to your workbook&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The repository contains more detailed setup instructions here:&lt;/p&gt;

&lt;p&gt;GitHub:&lt;br&gt;
&lt;a href="https://github.com/akshayai1996/excel-addin-ai" rel="noopener noreferrer"&gt;https://github.com/akshayai1996/excel-addin-ai&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Now I Want Your Honest Feedback&lt;/p&gt;

&lt;p&gt;This is where I need the DEV community.&lt;/p&gt;

&lt;p&gt;I've built the thing.&lt;/p&gt;

&lt;p&gt;I've tested it myself.&lt;/p&gt;

&lt;p&gt;But I'm one person testing my own tool, and that's a terrible way to discover every weakness.&lt;/p&gt;

&lt;p&gt;So if you're an Excel user, developer, automation engineer, data analyst, or just someone who spends too much time inside spreadsheets:&lt;/p&gt;

&lt;p&gt;Try it. Break it. Be brutally honest.&lt;/p&gt;

&lt;p&gt;Don't just tell me:&lt;/p&gt;

&lt;p&gt;«"Nice project!"»&lt;/p&gt;

&lt;p&gt;Tell me:&lt;/p&gt;

&lt;p&gt;«"This doesn't work."»&lt;/p&gt;

&lt;p&gt;«"Why does it do this?"»&lt;/p&gt;

&lt;p&gt;«"This workflow is annoying."»&lt;/p&gt;

&lt;p&gt;«"It should understand this automatically."»&lt;/p&gt;

&lt;p&gt;«"This Excel operation needs to be supported differently."»&lt;/p&gt;

&lt;p&gt;«"The AI generated the wrong action here."»&lt;/p&gt;

&lt;p&gt;«"The UI needs to work like this instead."»&lt;/p&gt;

&lt;p&gt;That's the feedback I'm actually looking for.&lt;/p&gt;

&lt;p&gt;I'd especially love to hear what happens when you throw real-world Excel tasks at it rather than carefully prepared demo prompts.&lt;/p&gt;

&lt;p&gt;Try messy workbooks.&lt;/p&gt;

&lt;p&gt;Try large datasets.&lt;/p&gt;

&lt;p&gt;Try formulas.&lt;/p&gt;

&lt;p&gt;Try formatting.&lt;/p&gt;

&lt;p&gt;Try charts.&lt;/p&gt;

&lt;p&gt;Try pivot tables.&lt;/p&gt;

&lt;p&gt;Try multi-step instructions.&lt;/p&gt;

&lt;p&gt;Try deliberately ambiguous requests.&lt;/p&gt;

&lt;p&gt;Try something that you think an Excel Copilot should be able to understand.&lt;/p&gt;

&lt;p&gt;Then tell me what broke.&lt;/p&gt;




&lt;p&gt;What Should I Improve?&lt;/p&gt;

&lt;p&gt;I don't want to decide that for the community before hearing from people who actually use it.&lt;/p&gt;

&lt;p&gt;Maybe the biggest problem is the UI.&lt;/p&gt;

&lt;p&gt;Maybe it's workbook context.&lt;/p&gt;

&lt;p&gt;Maybe it's the AI's reasoning.&lt;/p&gt;

&lt;p&gt;Maybe it's execution reliability.&lt;/p&gt;

&lt;p&gt;Maybe it's speed.&lt;/p&gt;

&lt;p&gt;Maybe it's handling large workbooks.&lt;/p&gt;

&lt;p&gt;Maybe it's something I haven't even considered.&lt;/p&gt;

&lt;p&gt;Tell me.&lt;/p&gt;

&lt;p&gt;The goal of this project isn't to claim that I've built the perfect Excel AI assistant.&lt;/p&gt;

&lt;p&gt;The goal is to build something useful, test it with real users, and keep improving it.&lt;/p&gt;




&lt;p&gt;The Bigger Idea&lt;/p&gt;

&lt;p&gt;The interesting part of this project isn't really Excel.&lt;/p&gt;

&lt;p&gt;It's the architecture.&lt;/p&gt;

&lt;p&gt;We're entering a world where AI can understand natural language but traditional software still provides the deterministic execution layer.&lt;/p&gt;

&lt;p&gt;That creates a useful pattern:&lt;/p&gt;

&lt;p&gt;Human intent&lt;br&gt;
      ↓&lt;br&gt;
      AI&lt;br&gt;
      ↓&lt;br&gt;
Structured commands&lt;br&gt;
      ↓&lt;br&gt;
Deterministic software&lt;br&gt;
      ↓&lt;br&gt;
Real-world result&lt;/p&gt;

&lt;p&gt;Excel happens to be a particularly interesting environment for this because spreadsheets contain a huge amount of structured information but still require enormous amounts of manual interaction.&lt;/p&gt;

&lt;p&gt;Imagine applying the same pattern to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CAD&lt;/li&gt;
&lt;li&gt;engineering software&lt;/li&gt;
&lt;li&gt;project management&lt;/li&gt;
&lt;li&gt;ERP systems&lt;/li&gt;
&lt;li&gt;data analysis&lt;/li&gt;
&lt;li&gt;reporting tools&lt;/li&gt;
&lt;li&gt;document management&lt;/li&gt;
&lt;li&gt;financial modelling&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The AI doesn't need to replace the application.&lt;/p&gt;

&lt;p&gt;It can become a natural-language control layer on top of the application.&lt;/p&gt;

&lt;p&gt;That's what I'm experimenting with here.&lt;/p&gt;




&lt;p&gt;So… Did I Build "Microsoft Copilot"?&lt;/p&gt;

&lt;p&gt;No.&lt;/p&gt;

&lt;p&gt;And I don't want to pretend I did.&lt;/p&gt;

&lt;p&gt;Microsoft has a massive ecosystem behind Copilot, and this project is nowhere near that scale.&lt;/p&gt;

&lt;p&gt;What I built is something more specific:&lt;/p&gt;

&lt;p&gt;«A personal, extensible, Copilot-style AI interface for native Excel Desktop, where the AI backend can be changed independently through OpenCode.»&lt;/p&gt;

&lt;p&gt;And honestly, that's what makes the project fun.&lt;/p&gt;

&lt;p&gt;I don't need to wait for a vendor to decide what my spreadsheet assistant should be able to do.&lt;/p&gt;

&lt;p&gt;I can build the workflow myself.&lt;/p&gt;




&lt;p&gt;Try It&lt;/p&gt;

&lt;p&gt;The project is open on GitHub:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/akshayai1996/excel-addin-ai" rel="noopener noreferrer"&gt;https://github.com/akshayai1996/excel-addin-ai&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you're an Excel power user, Office.js developer, AI developer, or someone experimenting with AI agents controlling traditional desktop software, I'd genuinely like to know:&lt;/p&gt;

&lt;p&gt;What would you ask an AI assistant to do inside Excel?&lt;/p&gt;

&lt;p&gt;And more importantly:&lt;/p&gt;

&lt;p&gt;What would you change after actually using it?&lt;/p&gt;

&lt;p&gt;Try it.&lt;/p&gt;

&lt;p&gt;Give me the good feedback.&lt;/p&gt;

&lt;p&gt;Give me the bad feedback.&lt;/p&gt;

&lt;p&gt;Give me the "why the hell did it do that?" feedback. 😄&lt;/p&gt;

&lt;p&gt;That's probably where the next version will come from.&lt;/p&gt;




&lt;p&gt;Final thought&lt;/p&gt;

&lt;p&gt;The question that started this project was surprisingly simple:&lt;/p&gt;

&lt;p&gt;«"Why should I have to use one specific AI assistant just because I'm using Excel?"»&lt;/p&gt;

&lt;p&gt;So I built an alternative.&lt;/p&gt;

&lt;p&gt;Not perfect.&lt;/p&gt;

&lt;p&gt;Not finished.&lt;/p&gt;

&lt;p&gt;But it works.&lt;/p&gt;

&lt;p&gt;Now I want other Excel users and developers to tell me what I got wrong — and what I should build next. 🚀&lt;/p&gt;

</description>
      <category>ai</category>
      <category>excel</category>
      <category>showdev</category>
      <category>javascript</category>
    </item>
    <item>
      <title>I Was Tired of Saving Outlook Attachments One-by-One — So I Automated It</title>
      <dc:creator>Akshay Jatin Solanki</dc:creator>
      <pubDate>Mon, 18 May 2026 15:52:41 +0000</pubDate>
      <link>https://dev.to/akshayjatinsolanki/i-was-tired-of-saving-outlook-attachments-one-by-one-so-i-automated-it-2j75</link>
      <guid>https://dev.to/akshayjatinsolanki/i-was-tired-of-saving-outlook-attachments-one-by-one-so-i-automated-it-2j75</guid>
      <description>&lt;h1&gt;
  
  
  I Was Tired of Saving Outlook Attachments One-by-One — So I Automated It
&lt;/h1&gt;

&lt;p&gt;If you work heavily with Microsoft Outlook in a corporate environment, you probably know this painful routine:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Open email&lt;/li&gt;
&lt;li&gt;Download attachment&lt;/li&gt;
&lt;li&gt;Save file&lt;/li&gt;
&lt;li&gt;Repeat again&lt;/li&gt;
&lt;li&gt;Repeat 100 more times&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It sounds small.&lt;/p&gt;

&lt;p&gt;But when your work involves:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;engineering documents&lt;/li&gt;
&lt;li&gt;vendor quotations&lt;/li&gt;
&lt;li&gt;datasheets&lt;/li&gt;
&lt;li&gt;project files&lt;/li&gt;
&lt;li&gt;MOMs&lt;/li&gt;
&lt;li&gt;RFQs&lt;/li&gt;
&lt;li&gt;procurement emails&lt;/li&gt;
&lt;li&gt;client deliverables&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;…it becomes a massive repetitive productivity drain.&lt;/p&gt;

&lt;p&gt;Especially in EPC, engineering, documentation, procurement, and project management workflows.&lt;/p&gt;

&lt;p&gt;At one point I realized:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I was spending more time downloading attachments than actually doing meaningful work.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So I decided to automate it.&lt;/p&gt;




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

&lt;p&gt;Microsoft Outlook still doesn’t provide a clean native way to:&lt;/p&gt;

&lt;p&gt;✅ Select multiple emails&lt;br&gt;
✅ Download all attachments together&lt;br&gt;
✅ Handle duplicate filenames safely&lt;br&gt;
✅ Skip useless signature images&lt;br&gt;
✅ Avoid repetitive clicking&lt;/p&gt;

&lt;p&gt;Instead, the normal workflow looks like this:&lt;/p&gt;

&lt;p&gt;❌ Open email&lt;br&gt;
❌ Download attachment&lt;br&gt;
❌ Save file&lt;br&gt;
❌ Close email&lt;br&gt;
❌ Repeat manually forever&lt;/p&gt;

&lt;p&gt;For a few emails this is okay.&lt;/p&gt;

&lt;p&gt;For hundreds of emails every week?&lt;/p&gt;

&lt;p&gt;Not okay.&lt;/p&gt;




&lt;h1&gt;
  
  
  The Idea
&lt;/h1&gt;

&lt;p&gt;I built a VBA automation tool for Outlook that allows me to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Select multiple emails at once&lt;/li&gt;
&lt;li&gt;Download all attachments automatically&lt;/li&gt;
&lt;li&gt;Handle duplicate filenames&lt;/li&gt;
&lt;li&gt;Skip inline/signature images&lt;/li&gt;
&lt;li&gt;Prevent invalid filenames&lt;/li&gt;
&lt;li&gt;Keep Outlook responsive during large batch operations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now the workflow is:&lt;/p&gt;

&lt;p&gt;✅ Select emails&lt;br&gt;
✅ Run macro&lt;br&gt;
✅ Choose folder&lt;br&gt;
✅ Done&lt;/p&gt;

&lt;p&gt;That’s it.&lt;/p&gt;




&lt;h1&gt;
  
  
  Real Productivity Impact
&lt;/h1&gt;

&lt;p&gt;If you process:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;100–200 emails/day&lt;/li&gt;
&lt;li&gt;multiple attachments per email&lt;/li&gt;
&lt;li&gt;large engineering/project documentation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;this repetitive task alone can waste several hours every week.&lt;/p&gt;

&lt;p&gt;The biggest realization for me was:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Small automation removes huge mental fatigue.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Not just time.&lt;/p&gt;

&lt;p&gt;Mental fatigue.&lt;/p&gt;

&lt;p&gt;Repetitive clicking slowly destroys focus during office work.&lt;/p&gt;

&lt;p&gt;Automation fixes that.&lt;/p&gt;




&lt;h1&gt;
  
  
  Features
&lt;/h1&gt;

&lt;p&gt;The tool includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Bulk Outlook attachment saving&lt;/li&gt;
&lt;li&gt;Duplicate filename handling&lt;/li&gt;
&lt;li&gt;Illegal filename sanitization&lt;/li&gt;
&lt;li&gt;Inline/signature image filtering&lt;/li&gt;
&lt;li&gt;OLE attachment filtering&lt;/li&gt;
&lt;li&gt;MAX_PATH protection&lt;/li&gt;
&lt;li&gt;Outlook UI responsiveness optimization&lt;/li&gt;
&lt;li&gt;Defensive error handling&lt;/li&gt;
&lt;li&gt;Performance optimization&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It evolved from:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“simple VBA macro”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;into:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“production-grade Outlook productivity automation.”&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h1&gt;
  
  
  Example Workflow
&lt;/h1&gt;

&lt;p&gt;Before:&lt;/p&gt;

&lt;p&gt;❌ Open email&lt;br&gt;
❌ Save attachment&lt;br&gt;
❌ Repeat manually&lt;/p&gt;

&lt;p&gt;After:&lt;/p&gt;

&lt;p&gt;✅ Select all emails&lt;br&gt;
✅ Run macro&lt;br&gt;
✅ Everything downloads automatically&lt;/p&gt;




&lt;h1&gt;
  
  
  Who This Is Useful For
&lt;/h1&gt;

&lt;p&gt;This turned out to be surprisingly useful for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Engineering teams&lt;/li&gt;
&lt;li&gt;EPC companies&lt;/li&gt;
&lt;li&gt;Procurement departments&lt;/li&gt;
&lt;li&gt;Documentation teams&lt;/li&gt;
&lt;li&gt;Project managers&lt;/li&gt;
&lt;li&gt;Corporate Outlook-heavy workflows&lt;/li&gt;
&lt;li&gt;Anyone drowning in repetitive email attachments&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Basically:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;anyone who spends too much time inside Outlook.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h1&gt;
  
  
  Why I Shared It Open Source
&lt;/h1&gt;

&lt;p&gt;A lot of office productivity problems are weirdly universal.&lt;/p&gt;

&lt;p&gt;Thousands of people are probably repeating the same boring tasks every day manually because:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;they don’t know automation is possible&lt;/li&gt;
&lt;li&gt;nobody showed them&lt;/li&gt;
&lt;li&gt;or they assume only “developers” can automate workflows&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But small automation tools can genuinely save:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;hours&lt;/li&gt;
&lt;li&gt;frustration&lt;/li&gt;
&lt;li&gt;repetitive effort&lt;/li&gt;
&lt;li&gt;mental exhaustion&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So I decided to publish this project publicly on GitHub.&lt;/p&gt;




&lt;h1&gt;
  
  
  GitHub Repository
&lt;/h1&gt;

&lt;p&gt;Repository:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/akshayai1996/Outlook-Bulk-Attachment-Saver" rel="noopener noreferrer"&gt;https://github.com/akshayai1996/Outlook-Bulk-Attachment-Saver&lt;/a&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  Future Improvements
&lt;/h1&gt;

&lt;p&gt;Some ideas I may add later:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sender-based folder sorting&lt;/li&gt;
&lt;li&gt;Date-wise organization&lt;/li&gt;
&lt;li&gt;CSV logging&lt;/li&gt;
&lt;li&gt;Duplicate hash detection&lt;/li&gt;
&lt;li&gt;ZIP extraction&lt;/li&gt;
&lt;li&gt;Ribbon button integration&lt;/li&gt;
&lt;li&gt;Progress bar&lt;/li&gt;
&lt;li&gt;Power Automate integration&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  Final Thought
&lt;/h1&gt;

&lt;p&gt;One thing I’ve started realizing recently:&lt;/p&gt;

&lt;p&gt;A lot of impactful software is not flashy.&lt;/p&gt;

&lt;p&gt;Sometimes the best tools are simply the ones that remove repetitive friction from everyday work.&lt;/p&gt;

&lt;p&gt;This project started because I got tired of clicking “Save Attachment” hundreds of times.&lt;/p&gt;

&lt;p&gt;Now it saves me hours every week.&lt;/p&gt;

&lt;p&gt;And honestly, I wish Outlook had this feature natively.&lt;/p&gt;




&lt;h1&gt;
  
  
  Tags
&lt;/h1&gt;

&lt;h1&gt;
  
  
  productivity #automation #outlook #vba #office #workflow #opensource #engineering #microsoft #developers
&lt;/h1&gt;

</description>
      <category>automation</category>
      <category>vba</category>
      <category>msoutlook</category>
      <category>attachments</category>
    </item>
    <item>
      <title>From Frustrated to "Pro": Why I Built My Own Screen Annotation Suite from Scratch</title>
      <dc:creator>Akshay Jatin Solanki</dc:creator>
      <pubDate>Fri, 17 Apr 2026 12:11:26 +0000</pubDate>
      <link>https://dev.to/akshayjatinsolanki/from-frustrated-to-pro-why-i-built-my-own-screen-annotation-suite-from-scratch-3p6b</link>
      <guid>https://dev.to/akshayjatinsolanki/from-frustrated-to-pro-why-i-built-my-own-screen-annotation-suite-from-scratch-3p6b</guid>
      <description>&lt;p&gt;The Breaking Point 😫&lt;br&gt;
I spent two days trying to simplify an existing, over-engineered annotation tool. It was full of bugs, heavy, and limited. I realized I was spending more time fighting the code than using the tool.&lt;/p&gt;

&lt;p&gt;So, I did what any developer does when they reach a breaking point: I abandoned the mess and wrote it from scratch.&lt;/p&gt;

&lt;p&gt;Introducing Simpink 🎨&lt;br&gt;
I wanted something better than the "standard" tools like Epic Pen. I wanted something that felt like it belonged in 2026. After a session of intense, high-performance coding, I finished Simpink.&lt;/p&gt;

&lt;p&gt;It’s built using Electron, Vanilla JS, and Hardware-Accelerated Canvas. It’s light, it’s fast, and it looks premium.&lt;/p&gt;

&lt;p&gt;What makes it a "Gem"? 💎&lt;br&gt;
I didn't just build a "drawing" tool; I built a presentation suite:&lt;/p&gt;

&lt;p&gt;The Highlighter Halo: A persistent cursor aura so your audience never loses your mouse during a live demo.&lt;br&gt;
Pro Video Recording: Native VP9 capture at 25 Mbps, featuring a high-fidelity Pause/Resume engine. (No more OBS required!)&lt;br&gt;
Glassmorphic UI: A floating, draggable toolbar that looks like a part of a modern OS.&lt;br&gt;
"The Orb": A unique minimize state that stays out of your way while keeping your tools accessible.&lt;br&gt;
The "Simpink" Philosophy 🚀&lt;br&gt;
I stripped away the bloat and focused on performance. Everything is rendered via the GPU for zero lag. I even converted my demonstration videos to cut the file size by 90% without losing quality—I wanted the smallest possible footprint for the user.&lt;/p&gt;

&lt;p&gt;Open Source &amp;amp; Free 🌍&lt;br&gt;
It is licensed under MIT. It is free for anyone—personal, professional, or commercial. Use it, break it, modify it.&lt;/p&gt;

&lt;p&gt;Check out the code and grab the standalone installer on GitHub: 👉 &lt;a href="https://github.com/akshayai1996/Simpink" rel="noopener noreferrer"&gt;https://github.com/akshayai1996/Simpink&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you've ever felt the urge to start over and build something better, let me know in the comments! Simpink is proof that sometimes, the "scratch" approach is the only way to go.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>productivity</category>
      <category>showdev</category>
      <category>sideprojects</category>
    </item>
    <item>
      <title>What I built in the last year — Excel VBA tools, Python scripts, HTML games &amp; more</title>
      <dc:creator>Akshay Jatin Solanki</dc:creator>
      <pubDate>Mon, 16 Mar 2026 04:21:57 +0000</pubDate>
      <link>https://dev.to/akshayjatinsolanki/what-i-built-in-the-last-year-excel-vba-tools-python-scripts-html-games-more-4g88</link>
      <guid>https://dev.to/akshayjatinsolanki/what-i-built-in-the-last-year-excel-vba-tools-python-scripts-html-games-more-4g88</guid>
      <description>&lt;p&gt;Hi, I'm Akshay Jatin Solanki, an engineer from India.&lt;/p&gt;

&lt;p&gt;Over the past year I've been building small focused tools that solve real problems. Here's a summary of what I've shipped:&lt;/p&gt;

&lt;h2&gt;
  
  
  🎮 Browser Games (HTML/JS)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Space Shooter — canvas-based, Web Audio, mobile + PC scaling&lt;/li&gt;
&lt;li&gt;Chrome Dino clone — custom audio engine with Web Audio API&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  📊 Data Dashboards
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;India Housing Affordability Dashboard — 115 cities with real sqft/price data&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🔧 Excel VBA Add-ins
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Crosshair row/column highlighter&lt;/li&gt;
&lt;li&gt;Merged cell filter&lt;/li&gt;
&lt;li&gt;Navigator arrows&lt;/li&gt;
&lt;li&gt;Delimiter text functions&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🐍 Python &amp;amp; Numerical Tools
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Cubic equation solver&lt;/li&gt;
&lt;li&gt;Numerical integration utilities&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  ♟️ Other
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Chess agent framework with Stockfish WASM in-browser&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All projects are minimal-dependency or single-file.&lt;/p&gt;

&lt;p&gt;👉 GitHub: &lt;a href="https://github.com/akshayai1996" rel="noopener noreferrer"&gt;https://github.com/akshayai1996&lt;/a&gt;&lt;br&gt;
👉 Web projects: &lt;a href="https://akshayai1996.github.io/Htmlfun/" rel="noopener noreferrer"&gt;https://akshayai1996.github.io/Htmlfun/&lt;/a&gt;&lt;br&gt;
👉 LinkedIn Profile: &lt;a href="https://www.linkedin.com/in/akshay-jatin-solanki/" rel="noopener noreferrer"&gt;https://www.linkedin.com/in/akshay-jatin-solanki/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Happy to get feedback on any of these!&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>github</category>
      <category>javascript</category>
      <category>python</category>
    </item>
  </channel>
</rss>
