
Fyra — AI Portfolio Assistant
Custom knowledge base assistant that qualifies visitors, recommends projects, and captures leads in real-time.
AI & Full-Stack Engineer
View Details →JM.OS, the admin system behind this site, and Clipivo, my Mac clipboard manager, were both built here. In Guwahati I can sit with your team and build the tool around how they actually work.
Built in Assam · Assam Engineering College alumnus
4+ Years
Building systems
Remote + Onsite (Guwahati Area)
Workflow Mapping → Working Prototype → Hardened Release
Optimization Summary
Most teams don't need a big platform. They need one tool that stops the same hour being wasted every day.
“Data lives in five spreadsheets and nobody trusts the totals.”
One database with validated forms, so every entry is checked as it is made, plus reports and exports that everyone reads from.
“Every website update needs a developer.”
An admin dashboard where your team edits content, uploads images and manages inquiries themselves, with logins and roles.
“Updating firmware on deployed devices means visiting each one with a cable.”
Over-the-air updates: devices check GitHub Releases and install new firmware themselves, the approach behind GitReleaseOTA.
“SaaS charges per seat for features you never use.”
A small tool that does exactly your job, hosted on your own accounts, with no per-user fees.
I build small, focused tools that remove a specific daily pain, and leave you owning the code.
Businesses tracking orders, stock, leads or field visits across spreadsheets and WhatsApp groups, who need one place with validated data and reports.
Businesses that need a developer every time a page changes. I build admin panels like JM.OS, which runs this site's projects, services, QR codes and leads.
Teams that need tooling of their own, like GitReleaseOTA, my open-source library for updating ESP32 firmware from GitHub Releases, published on the PlatformIO Registry.
Users who want a fast native utility rather than another browser tab, like Clipivo, my Mac clipboard manager that also searches text inside screenshots.
Working software, the source, and the accounts it runs on, all in your name.
TypeScript, Swift or Python project in your own Git repository, typed and organised so another developer can work on it.
A web tool deployed to your hosting (e.g. Vercel and Supabase), or a signed desktop build ready to install.
Versioned migrations, row-level security policies and seed data, so the database can be rebuilt from the repository.
Logins for your team with the right permissions, and a short note on how to add or remove people.
How to run it locally, deploy changes, back up data and where every credential lives.
Three kinds of tools I build, each with a working example.
Back offices for websites and teams: content editors, inquiry inboxes, QR codes with visit logs and settings, like JM.OS behind this site (Next.js server actions, Supabase auth and row-level security).
Fast, private desktop apps that work offline. Clipivo (Mac) keeps a searchable history of everything you copy, including text inside screenshots. Retrova (Mac and Windows) gets files off drives that won't open without writing to them, then verifies every copy.
Libraries, CLIs and scripts that remove repetitive engineering work, like GitReleaseOTA for ESP32 updates and the CLI that drafts and publishes the notes on this site.
The tools I reach for, chosen so you can host and maintain the result cheaply.
How I build small tools that teams rely on every day: admin dashboards locked down on the server, desktop apps with instant local search, and developer tools that remove manual release work.
An admin dashboard is the most attractive target on a small business's site: it can edit content, read enquiries and often bypass the database's normal rules. Hiding buttons in the UI is not security. In JM.OS, the dashboard behind this site, every change goes through two independent checks.
Middleware Is the First Lock, Not the Only One
Middleware keeps signed-out visitors away from /jmos pages, but server actions can be called directly. So every action that writes data re-checks the session and the admin allow-list on the server before it touches the privileged database client.
The pattern each server action follows:
"use server";
import { revalidatePath } from "next/cache";
import { requireAdmin } from "@/lib/auth/admin";
import { createAdminClient } from "@/utils/supabase/server";
export async function updateSettings(settings: Record<string, string>) {
// Second lock: verify the signed-in user is on the admin allow-list
await requireAdmin();
// Only now create the client that bypasses row-level security
const admin = createAdminClient();
const rows = Object.entries(settings).map(([key, value]) => ({ key, value }));
const { error } = await admin.from("settings").upsert(rows, { onConflict: "key" });
if (error) throw new Error(`Failed to update settings: ${error.message}`);
// Refresh the cached public pages that read these settings
revalidatePath("/");
}
Row-Level Security for Everything Public
Public pages should read through a client limited by Postgres row-level security policies, so even a bug in a page can only see published rows. Keep the unrestricted client on the server, behind checks like the one above.
A desktop tool earns its place by being instant. Clipivo keeps a history of everything you copy, including text recognised inside screenshots, and search has to stay fast as that history grows into tens of thousands of entries. A plain LIKE '%term%' query scans every row; SQLite's FTS5 full-text index does not.
-- Full-text index that mirrors the clips table
CREATE VIRTUAL TABLE clips_fts USING fts5(
content,
content='clips',
content_rowid='id',
tokenize='unicode61 remove_diacritics 2'
);
-- Keep the index in sync on insert
CREATE TRIGGER clips_ai AFTER INSERT ON clips BEGIN
INSERT INTO clips_fts(rowid, content) VALUES (new.id, new.content);
END;
-- Prefix search, best matches first
SELECT clips.*
FROM clips_fts
JOIN clips ON clips.id = clips_fts.rowid
WHERE clips_fts MATCH 'invoice*'
ORDER BY bm25(clips_fts)
LIMIT 50;
Storing Private Data in Plain Text
Clipboard history contains passwords, addresses and messages. Anything a desktop tool stores locally should be treated as sensitive: keep it on the machine, encrypt what is sensitive (Clipivo uses CryptoKit), and give the user an easy way to exclude apps and clear history.
Updating devices in the field by plugging in a cable does not scale past a handful of units. GitReleaseOTA, my open-source PlatformIO library, lets an ESP32 update itself from a project's GitHub Releases, so publishing a release is the whole deployment process.
The update flow on the device:
Why GitHub Releases Instead of an Update Server
A custom update server is one more thing to host, secure and pay for. GitHub Releases already gives versioned, downloadable binaries and an API, so small hardware teams get over-the-air updates without running any infrastructure of their own.
The same idea runs through all the tooling I build, including the CLI that drafts and publishes the engineering notes on this site: find the step people repeat by hand, and make it one command.
Start from the workflow, ship a usable version early, then harden it.
Phase 1 of 6
We walk through the current process: who enters what, where it goes, and where time is lost. That becomes a short list of what the tool must do.
Dynamic projects fetched from the portfolio database demonstrating execution.

Custom knowledge base assistant that qualifies visitors, recommends projects, and captures leads in real-time.
AI & Full-Stack Engineer
View Details →
A native macOS clipboard manager that remembers everything you copy, even the text inside screenshots.
Design & Engineering
View Details →
A free, open-source desktop app that gets your files off drives that won't open, without writing a byte to them.
Design & Engineering
View Details →Off-the-shelf software is great until your process doesn't match it. A focused custom tool fits your process and costs nothing per seat.
| What Matters | Custom Tool (My Approach) | Typical Off-the-Shelf SaaS |
|---|---|---|
| Fit to Your Process | ✓ Built around how your team already works. | ⚠️ Your team adapts to the product's workflow. |
| Ongoing Cost | ✓ Hosting only; no per-seat fees. | ⚠️ Monthly fee per user, rising with headcount. |
| Data Ownership | ✓ Your database, exportable at any time. | ⚠️ Data lives in the vendor's system and format. |
| Changes When You Need Them | ✓ Add the feature you need, when you need it. | ❌ Wait for the vendor's roadmap, or work around it. |
In Guwahati I can sit with your team for a day, watch how the work is done, and come back with a tool that fits it.
For clients elsewhere in India (Bengaluru, Hyderabad, Pune, Mumbai, Delhi NCR) and abroad, I work remotely through GitHub, with a live staging link you can try at every step.
Answers to what clients ask me most.
Tell me what eats your team's time. I'll suggest the smallest tool that fixes it, with an estimate after a first call.