<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://omairkhattak.com/feed.xml" rel="self" type="application/atom+xml" /><link href="https://omairkhattak.com/" rel="alternate" type="text/html" /><updated>2026-10-22T01:28:53+00:00</updated><id>https://omairkhattak.com/feed.xml</id><title type="html">Omair Khattak</title><subtitle>Omair Khattak on the Internet</subtitle><author><name>Omair Khattak</name></author><entry><title type="html">ibtk: iOS Backup Toolkit</title><link href="https://omairkhattak.com/2026/09/20/ibtk-ios-backup-toolkit" rel="alternate" type="text/html" title="ibtk: iOS Backup Toolkit" /><published>2026-09-20T00:00:00+00:00</published><updated>2026-09-20T00:00:00+00:00</updated><id>https://omairkhattak.com/2026/09/20/ibtk-ios-backup-toolkit</id><content type="html" xml:base="https://omairkhattak.com/2026/09/20/ibtk-ios-backup-toolkit"><![CDATA[<p>ibtk is a command-line toolkit for recovering your own data from <strong>unencrypted iOS backups</strong>. It exposes one CLI with a subcommand per data type, for example <code class="language-plaintext highlighter-rouge">ibtk extract-messages</code>.</p>

<h2 id="what-it-recovers">What it recovers</h2>

<ul>
  <li>Messages and their attachments</li>
  <li>Photos</li>
  <li>Contacts</li>
  <li>Calendar</li>
  <li>Bookmarks</li>
  <li>Audio</li>
</ul>

<h2 id="why-a-toolkit-and-not-a-one-off-script">Why a toolkit and not a one-off script</h2>

<p>ibtk grew out of a one-off investigation into a single iPhone backup. Generalizing that work meant turning it into a reusable tool with a subcommand for each data type.</p>

<h2 id="how-ios-backups-are-laid-out">How iOS backups are laid out</h2>

<p>An iOS backup does not store files under their original names. Files sit in a flat, hash-named structure, and an index database (<code class="language-plaintext highlighter-rouge">Manifest.db</code>) maps each hashed name back to a logical domain and path. Messages, contacts, calendars, and bookmarks then live inside SQLite databases of their own.</p>

<p>Any extractor therefore has to:</p>

<ol>
  <li>Resolve the real file through the manifest instead of guessing at paths.</li>
  <li>Query the app databases directly.</li>
  <li>Convert Apple’s epoch timestamps into real dates.</li>
</ol>

<p>Skipping any of these gives output that looks plausible but is wrong: missing attachments, or dates decades off.</p>

<h2 id="scope-and-responsible-use">Scope and responsible use</h2>

<p>ibtk works on <strong>unencrypted</strong> backups that you own. It does not defeat backup encryption. It is for recovering your own data, such as photos from a dead phone or a message thread you need to preserve.</p>

<p>🔗 <a href="https://github.com/drwavy/ios-backup-toolkit">Repository on GitHub</a></p>]]></content><author><name>Omair Khattak</name></author><category term="dev" /><category term="ios" /><category term="forensics" /><category term="open-source" /><category term="cli" /><summary type="html"><![CDATA[ibtk is a command-line toolkit for recovering your own data from unencrypted iOS backups. It exposes one CLI with a subcommand per data type, for example ibtk extract-messages.]]></summary></entry><entry><title type="html">Photo Counter: Notes from a Dead Zone</title><link href="https://omairkhattak.com/2026/09/09/photo-counter-book" rel="alternate" type="text/html" title="Photo Counter: Notes from a Dead Zone" /><published>2026-09-09T00:00:00+00:00</published><updated>2026-09-09T00:00:00+00:00</updated><id>https://omairkhattak.com/2026/09/09/photo-counter-book</id><content type="html" xml:base="https://omairkhattak.com/2026/09/09/photo-counter-book"><![CDATA[<p><em>Working title. In progress.</em></p>

<p><strong>Photo Counter</strong> is a book compiled from daily ethnographic notes taken while working the photo counter at a Walgreens. The notes are recorded as daily field observations, with the aim of compiling them into a published book.</p>

<p><em>Subtitle under consideration: Notes from a Dead Zone.</em></p>]]></content><author><name>Omair Khattak</name></author><category term="writing" /><category term="book" /><category term="ethnography" /><summary type="html"><![CDATA[Working title. In progress.]]></summary></entry><entry><title type="html">Automated BPM and Key Tagging for Downloaded Audio</title><link href="https://omairkhattak.com/2026/08/23/audio-bpm-key-tagging" rel="alternate" type="text/html" title="Automated BPM and Key Tagging for Downloaded Audio" /><published>2026-08-23T00:00:00+00:00</published><updated>2026-08-23T00:00:00+00:00</updated><id>https://omairkhattak.com/2026/08/23/audio-bpm-key-tagging</id><content type="html" xml:base="https://omairkhattak.com/2026/08/23/audio-bpm-key-tagging"><![CDATA[<p>A macOS automation pipeline that analyzes downloaded audio and writes <strong>BPM and musical key into the file’s metadata</strong>, so a sample library is searchable by tempo and key in Finder, Logic Pro, and any other tag-aware tool.</p>

<h2 id="tools">Tools</h2>

<ul>
  <li><strong>aubio</strong> detects tempo.</li>
  <li><strong>keyfinder-cli</strong> detects musical key.</li>
  <li><strong>ffmpeg</strong> writes the results back into the file’s tags.</li>
</ul>

<h2 id="why-it-exists">Why it exists</h2>

<p>Analyzing tempo and key once, at download time, means that information is already in the file when it is time to make music.</p>

<h2 id="related">Related</h2>

<p>The same philosophy drives <a href="https://github.com/drwavy/logic-bounce-sync">Logic Bounce Sync</a>: remove manual file management from the studio workflow.</p>]]></content><author><name>Omair Khattak</name></author><category term="dev" /><category term="audio" /><category term="music" /><category term="macos" /><category term="automation" /><summary type="html"><![CDATA[A macOS automation pipeline that analyzes downloaded audio and writes BPM and musical key into the file’s metadata, so a sample library is searchable by tempo and key in Finder, Logic Pro, and any other tag-aware tool.]]></summary></entry><entry><title type="html">Gymneye: Vetted Gym Access for Traveling Professionals</title><link href="https://omairkhattak.com/2026/08/23/gymneye" rel="alternate" type="text/html" title="Gymneye: Vetted Gym Access for Traveling Professionals" /><published>2026-08-23T00:00:00+00:00</published><updated>2026-08-23T00:00:00+00:00</updated><id>https://omairkhattak.com/2026/08/23/gymneye</id><content type="html" xml:base="https://omairkhattak.com/2026/08/23/gymneye"><![CDATA[<p><em>Concept stage. Solo founder.</em></p>

<p>Gymneye is a consumer booking app that routes business travelers to <strong>vetted commercial gyms</strong> near where they are staying. It started as a hotel-gym-access idea and was repositioned toward routing travelers to vetted commercial gyms.</p>

<h2 id="distribution">Distribution</h2>

<p>The plan depends on near-zero customer acquisition cost through corporate travel channels such as Navan, Concur, and travel management companies. Business travelers are already booking through those tools, so Gymneye plugs into the booking moment instead of competing for attention.</p>

<h2 id="what-exists">What exists</h2>

<ul>
  <li>Pitch deck</li>
  <li>Business plan</li>
  <li>Pre-seed financial model</li>
  <li>App mockup planning</li>
</ul>

<blockquote>
  <p>I didn’t research this market. I’ve lived in it my whole life.</p>
</blockquote>]]></content><author><name>Omair Khattak</name></author><category term="startup" /><category term="product" /><summary type="html"><![CDATA[Concept stage. Solo founder.]]></summary></entry><entry><title type="html">Limerance: A Nine-Track Concept Album</title><link href="https://omairkhattak.com/2026/08/23/limerance-concept-album" rel="alternate" type="text/html" title="Limerance: A Nine-Track Concept Album" /><published>2026-08-23T00:00:00+00:00</published><updated>2026-08-23T00:00:00+00:00</updated><id>https://omairkhattak.com/2026/08/23/limerance-concept-album</id><content type="html" xml:base="https://omairkhattak.com/2026/08/23/limerance-concept-album"><![CDATA[<p><em>In development.</em></p>

<p><strong>Limerance</strong> is a nine-track concept album following a rootless man caught in an obsessive emotional loop.</p>

<h2 id="structure">Structure</h2>

<ul>
  <li><strong>A negative loop arc.</strong> This is explicitly not a hero’s journey. The character does not grow, and the structure circles back.</li>
  <li><strong>Two motif threads</strong>, flight and longing, that run through the record.</li>
  <li><strong>A recurring airport sound stamp</strong> on tracks 1, 8, and 9, which frames the loop.</li>
</ul>

<h2 id="touchstones">Touchstones</h2>

<p>The narrative sits alongside <em>The Great Gatsby</em>, <em>(500) Days of Summer</em>, and <em>The Sun Also Rises</em>. The closest poetic parallel is Shakespeare’s Sonnet 147. A living album bible tracks the concept, motifs, and track-by-track structure.</p>

<p>Produced in Logic Pro under the alias <strong>drwavy</strong>.</p>]]></content><author><name>Omair Khattak</name></author><category term="audio" /><category term="writing" /><category term="music" /><category term="album" /><summary type="html"><![CDATA[In development.]]></summary></entry><entry><title type="html">Private Invite-Only Text Social Network</title><link href="https://omairkhattak.com/2026/08/23/private-text-social-network" rel="alternate" type="text/html" title="Private Invite-Only Text Social Network" /><published>2026-08-23T00:00:00+00:00</published><updated>2026-08-23T00:00:00+00:00</updated><id>https://omairkhattak.com/2026/08/23/private-text-social-network</id><content type="html" xml:base="https://omairkhattak.com/2026/08/23/private-text-social-network"><![CDATA[<p>A private, invite-only, text-based social network with <strong>quote-repost</strong> functionality.</p>

<p>Languages / technology used: Python, Django, PostgreSQL, Railway / Render</p>

<h2 id="notes">Notes</h2>

<ul>
  <li><strong>Invite-only access.</strong> Membership is gated by invitation.</li>
  <li><strong>Quote-reposts.</strong> A post can reference and comment on another post, so conversations can branch.</li>
  <li><strong>Deployment.</strong> Deployed on Railway and Render, with PostgreSQL as the datastore.</li>
</ul>]]></content><author><name>Omair Khattak</name></author><category term="dev" /><category term="web" /><category term="python" /><category term="django" /><summary type="html"><![CDATA[A private, invite-only, text-based social network with quote-repost functionality.]]></summary></entry><entry><title type="html">SampleKit: A Native macOS Sample Browser with Local ML</title><link href="https://omairkhattak.com/2026/08/23/samplekit-titledlake" rel="alternate" type="text/html" title="SampleKit: A Native macOS Sample Browser with Local ML" /><published>2026-08-23T00:00:00+00:00</published><updated>2026-08-23T00:00:00+00:00</updated><id>https://omairkhattak.com/2026/08/23/samplekit-titledlake</id><content type="html" xml:base="https://omairkhattak.com/2026/08/23/samplekit-titledlake"><![CDATA[<p><em>In development.</em></p>

<p>SampleKit (working title <strong>TitledLake</strong>) is a native macOS sample browser for music producers. Every ML step runs locally on Apple Silicon, and nothing leaves the machine.</p>

<h2 id="architecture">Architecture</h2>

<p>SampleKit is a Swift Package Manager project split into targets with clear boundaries:</p>

<ul>
  <li><strong>AudioIO</strong>: reading and decoding audio files</li>
  <li><strong>Analysis</strong>: feature extraction</li>
  <li><strong>Embedding</strong>: turning audio into vectors</li>
  <li><strong>IndexStore</strong>: persistence</li>
  <li><strong>Search</strong>: similarity queries</li>
</ul>

<h2 id="storage-and-search">Storage and search</h2>

<ul>
  <li>Metadata is stored with <strong>GRDB.swift</strong> on SQLite.</li>
  <li>Embedding vectors live in <strong>memory-mapped binary files</strong>.</li>
  <li>Similarity search is a single matrix operation using <code class="language-plaintext highlighter-rouge">cblas_sgemm</code> from Accelerate. With normalized vectors, cosine similarity reduces to a dot product, so ranking a whole library is one BLAS call over a mapped buffer, with no per-row loop and no copy into memory.</li>
  <li>A CLI benchmark harness, <strong>slcli</strong>, measures indexing and search performance outside the UI.</li>
</ul>

<h2 id="problems-solved-along-the-way">Problems solved along the way</h2>

<ul>
  <li>Xcode 26 deployment-target mismatches across the package</li>
  <li>Build settings overridden at the project level versus the target level</li>
  <li>Entitlements configuration for a sandboxed app</li>
</ul>

<h2 id="status">Status</h2>

<p>The package structure, storage layer, and benchmark harness are in place. The audio input path is the current open item: it needs the <code class="language-plaintext highlighter-rouge">device.audio-input</code> entitlement before AudioIO is implemented.</p>]]></content><author><name>Omair Khattak</name></author><category term="dev" /><category term="audio" /><category term="music" /><category term="macos" /><category term="swift" /><category term="ml" /><summary type="html"><![CDATA[In development.]]></summary></entry><entry><title type="html">SSSAR: AR Fare Validation and the Limits of Platform Privacy Policy</title><link href="https://omairkhattak.com/2026/08/23/sssar-ar-fare-validation" rel="alternate" type="text/html" title="SSSAR: AR Fare Validation and the Limits of Platform Privacy Policy" /><published>2026-08-23T00:00:00+00:00</published><updated>2026-08-23T00:00:00+00:00</updated><id>https://omairkhattak.com/2026/08/23/sssar-ar-fare-validation</id><content type="html" xml:base="https://omairkhattak.com/2026/08/23/sssar-ar-fare-validation"><![CDATA[<p>SSSAR is an augmented-reality fare-validation concept, originally built for Apple Vision Pro, where an AR overlay is used to validate fares.</p>

<h2 id="the-research-question">The research question</h2>

<p>Could current headsets track people persistently and overlay information on them? I looked at Apple Vision Pro (M5, visionOS 26 and 27) and Meta Ray-Ban smart glasses.</p>

<h2 id="finding">Finding</h2>

<p>Both are blocked by <strong>platform privacy policy, not hardware limits</strong>. The silicon can run person-tracking models. The operating systems and developer terms deliberately do not allow apps to do this.</p>

<p>That matters for the design. A product built on a capability the platform forbids has a hard dependency on a rule it cannot change.</p>

<h2 id="redesign-direction">Redesign direction</h2>

<p>Two viable directions came out of the research:</p>

<ol>
  <li><strong>Track a physical token</strong> instead of a person.</li>
  <li><strong>A fixed, gate-mounted validation station</strong>, so the sensing hardware is not worn or carried.</li>
</ol>

<p>Both keep the validation problem and drop the person-tracking constraint.</p>]]></content><author><name>Omair Khattak</name></author><category term="dev" /><category term="ar" /><category term="visionos" /><category term="research" /><summary type="html"><![CDATA[SSSAR is an augmented-reality fare-validation concept, originally built for Apple Vision Pro, where an AR overlay is used to validate fares.]]></summary></entry><entry><title type="html">Solving the macOS RAR Problem: From Terminal to Shortcuts</title><link href="https://omairkhattak.com/2025/11/11/apple-shortcuts-unrar-here" rel="alternate" type="text/html" title="Solving the macOS RAR Problem: From Terminal to Shortcuts" /><published>2025-11-11T01:30:00+00:00</published><updated>2025-11-11T01:30:00+00:00</updated><id>https://omairkhattak.com/2025/11/11/apple-shortcuts-unrar-here</id><content type="html" xml:base="https://omairkhattak.com/2025/11/11/apple-shortcuts-unrar-here"><![CDATA[<p>In the future year of 2025 we always envisioned technology as a seamless
extension of our support system. Yet here I am, with a three thousand dollar
computer that can’t open a .rar file. It’s December 2024, the .rar was invented
in 1993, about 32 years ago. For 32 years, no thought to license and integrate
the RAR format. It’s quite admirable really, a testament.</p>

<p>RAR is proprietary and other formats arent so its making a point by not using
it. I shouldn’t have to dig through Homebrew documentation or fall down Reddit
rabbit holes just to open a rar file though. I could install unrar through the
terminal and call it a day, but I didn’t want to open terminal every single
time I want to open a file. I should be able to click on it and it opens. I
would like to experience the computer like a normal person. So I automated the
whole thing.</p>

<ol>
  <li>First in Automator.</li>
  <li>Secondly, <em>I believe sharing is caring…</em></li>
  <li>Thirdly, and finally, converted the automation to Shortcuts.</li>
</ol>

<h2 id="step-one-getting-the-actual-tool">Step One: Getting the Actual Tool</h2>

<p>Before I could automate anything, I needed the extraction tool itself. Homebrew
made this pretty straightforward:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>brew install unrar
</code></pre></div></div>

<p>Once installed, I had to figure out exactly where it lived on the system. This
is important with macOS automation because their tools for some reason don’t
always know where your stuff is.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>which unrar  
	Output: /usr/local/bin/unrar (or /opt/homebrew/bin/unrar)
</code></pre></div></div>

<h2 id="first-try-automator-quick-action">First Try: Automator Quick Action</h2>

<p>My first move was to build a macOS Quick Action. This would let me right-click
a file in Finder and run a custom command from the menu. I threw together a
Shell Script workflow with pretty straightforward logic: grab the selected
file, find its directory, and run unrar.</p>

<h3 id="the-script">The Script</h3>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>for f in "$@"  
do  
    cd "$(dirname "$f")"  
    /usr/local/bin/unrar x "$f"  
done
</code></pre></div></div>

<h3 id="the-annoying-part"><strong>The Annoying Part</strong></h3>

<p>Notice I couldn’t just write <code class="language-plaintext highlighter-rouge">unrar x "$f"</code> and be done with it.</p>

<p>When Automator (or Shortcuts) runs a shell script, it doesn’t load your user
profile. No .zshrc, no .bash_profile, nothing. So it has zero clue where
Homebrew puts things. I had to hardcode the full path: <code class="language-plaintext highlighter-rouge">/usr/local/bin/unrar</code>.</p>

<p>This worked, but it felt dated. Sharing Automator workflows is a pain. You have
to physically send the .workflow file, the recipient has to install it in some
specific library folder, there’s signing, there’s permissions. I wanted
something cleaner.</p>

<h2 id="second-try-moving-to-shortcuts"><strong>Second Try: Moving to Shortcuts</strong></h2>

<p>I decided to rebuild everything in Shortcuts. Better UI, easier sharing (just
an iCloud link), and it syncs across all my Macs automatically.</p>

<p>The core logic stayed the same, but the implementation felt way cleaner.</p>

<p>I created a new Shortcut, enabled it for Quick Actions in Finder, and used the
Run Shell Script action with /bin/zsh as the shell.</p>

<h3 id="the-setup"><strong>The Setup</strong></h3>

<ul>
  <li><strong>Input:</strong> Receives Files from Quick Actions</li>
  <li><strong>Action:</strong> Run Shell Script</li>
  <li><strong>Shell:</strong> /bin/zsh</li>
  <li><strong>Pass Input:</strong> as arguments</li>
</ul>

<p>Same as before, I had to be explicit with the file path:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>for f in "$@"  
do  
    cd "$(dirname "$f")"  
    /usr/local/bin/unrar x "$f"  
done
</code></pre></div></div>

<h2 id="the-end-result"><strong>The End Result</strong></h2>

<p>Now when I download a RAR file, I don’t touch the terminal at all. Right-click,
hit “Unrar Here,” and the folder just appears. I uploaded the shortcut to 
RoutineHub so I can manage updates and versions without any hassle.</p>

<p><a href="https://routinehub.co/shortcut/24410/">Download on RoutineHub</a><br />
<a href="https://routinehub.co/user/omairkhattak">My Profile on RoutineHub</a></p>]]></content><author><name>Omair Khattak</name></author><category term="dev" /><category term="macos" /><category term="automation" /><summary type="html"><![CDATA[In the future year of 2025 we always envisioned technology as a seamless extension of our support system. Yet here I am, with a three thousand dollar computer that can’t open a .rar file. It’s December 2024, the .rar was invented in 1993, about 32 years ago. For 32 years, no thought to license and integrate the RAR format. It’s quite admirable really, a testament.]]></summary></entry><entry><title type="html">Master Archivist for The Yung Jake Archive</title><link href="https://omairkhattak.com/2025/03/23/yung-jake-archive" rel="alternate" type="text/html" title="Master Archivist for The Yung Jake Archive" /><published>2025-03-23T00:00:00+00:00</published><updated>2025-03-23T00:00:00+00:00</updated><id>https://omairkhattak.com/2025/03/23/Yung-Jake-Archive</id><content type="html" xml:base="https://omairkhattak.com/2025/03/23/yung-jake-archive"><![CDATA[<p>Part of a team building an archive of artist Jake Patterson (Yung Jake) using Sanity CMS.</p>

<p>Part of my work has involved me using skills learnt from a previous personal project <a href="https://omairkhattak.com/2024/11/15/smddmdwriter">SMDDMDWRITER</a> to build a custom CLI tool to streamline NDJSON metadata management.</p>

<p>Languages / Technology used: Python, JavaScript, Sanity.io, NDJSON</p>

<p><em>Project is still in-progress.</em></p>]]></content><author><name>Omair Khattak</name></author><category term="dev" /><category term="work" /><category term="archive" /><category term="metadata" /><category term="python" /><summary type="html"><![CDATA[Part of a team building an archive of artist Jake Patterson (Yung Jake) using Sanity CMS.]]></summary></entry></feed>