I built an external context layer for AI agents – most of it already exists, here’s what doesn’t

architecture

Imagine you’re deep into a brainstorming session with an AI, going back and forth for an hour – and then the free tier rate limit hits. Now you have to switch to another AI and re-explain everything from scratch. The context, the problem, what you’ve tried, where you’re stuck. All of it.

Because you’re the only one who knows what you’re working on, to query any AI assistant you have to carry all that knowledge alone, every single time.

So two weeks ago, during an offline hackathon – I built a small version of my idea – Meniscus – a layer that sits outside your tools and holds that knowledge for you. One shared picture of your current working state: what you’ve tried, what’s blocking you, what’s been decided. Any AI you switch to reads from it instead of starting from zero.

The core idea:

Context shouldn’t live inside individual tools. It should live outside as a separate external layer and AI tools should read from it.

Right now, you’re the only one who knows what you’re working on right now and you got to query any AI assistant you got to carry all that knowledge alone. Meniscus is the layer that finally holds that knowledge for you.

It captures user activity across tools, structures it into threads – which are the core working units representing what the user is actively doing – and lets you retrieve relevant context as a subgraph instead of raw history.

The architecture consists of three primitives:

  1. Event is the atomic unit – an immutable, timestamped record of one thing you did. Asked ChatGPT something, watched a YouTube video, made a GitHub commit, updated a Notion page — each one captured, normalized, stored.

  2. An entity is a meaningful concept extracted from an event. Not the full text — just the signal. “JWT”, “middleware”, “refresh token”, “auth” – the keywords that actually tell you what the event was about.

  3. A thread is a cluster of related events – not similar in the textual sense, but connected by shared work context. “I am debugging a JWT auth bug” is a thread. It spans a GitHub commit, a ChatGPT conversation, a Notion architecture doc, a YouTube video on token expiry. Individually those events look unrelated and together they’re one line of work.

The pipeline goes like this:

→ activity comes in
→ entities get extracted
→ each new event gets compared against existing threads by entity overlap and temporal proximity
→ assigned to the right thread or a new one gets created
→ the whole thing is stored as a graph with explicit edges between events, entities, and threads.

architecture

when an agent queries Meniscus, it doesn’t get a raw dump of your history. It gets a subgraph – the relevant thread, its events, its entities. A bounded, structured slice of context instead of everything at once. The agent injects that into its prompt and answers grounded in your actual work.

…

For the demo of the project, here’s what i did:

  • simulated events from ChatGPT, YouTube and GitHub — 4 threads from a realistic day of work, 12 events total.
  • the query system routes through three modes:
    Retrieve (traverses through the entities) –> Overview (cross-thread summary of what you’ve been doing) –> General (conversational, if there’s nothing relevant to retrieve, it says “i don’t know”).

Whenever starting with a project, I like to think on the lines of SHOULDs — how something should be done and question my own decisions aggressively at every step before I can come to an architecture that I deem to be good enough.

Whatever was showed in the demo, it was only a small part of the whole implementation I had planned. When the hackathon ended, after 2 days I decided to sit with my project once again and finish the remaining implementation. However I found some major loopholes and realized whatever I am doing is nothing different from what already exists – Zep, Mem0, Supermemory, Rewind etc.

most of what I built is already there, and in better shape than I could ship.

External memory layers, graph storage, episodic retrieval, agent APIs – these are solved or being actively solved by well-funded teams. Hence no point in redoing the same.

However there’s one specific architectural component that is the only differentiating factor and it got a persisting question surrounding it, which I need to research upon thoroughly before coming to a conclusion.

Every existing system retrieves by similarity – cosine distance, semantic search, ranked chunks. You ask a question, it finds the most textually similar pieces of your history and hands them back.

But “what am I currently working on” isn’t a similarity problem. It’s a working state problem. The agent doesn’t need the most similar chunks. it needs the current state of an ongoing task – what the goal is, what’s been tried, what’s blocking progress, what’s been decided. Those are different questions and similarity search doesn’t answer them cleanly.

Then the obvious question is – what about just dumping everything into a long context window? frontier models like Gemini and Claude have massive context windows. Why not hand them your entire history and let them figure out the working state themselves?

And honestly, they’d do a decent job. give Claude enough of your activity and it can synthesize “what you’re working on” reasonably well.
but three problems:

  • 1st, cost. sending hundreds of thousands of tokens on every single query isn’t free at scale.

  • 2nd, the lost-in-the-middle problem – empirically documented, models perform worse on information buried deep in long contexts. More tokens doesn’t mean better reasoning over those tokens.

  • 3rd, even if the model synthesizes working state correctly from raw history, it’s doing that work fresh every single time you query it. Meniscus does it once and maintains it continuously. The synthesis is already done when the agent needs it.

Here are two hypotheses –

  1. Thread-state packet retrieval produces better agent answers to active working state queries than hybrid search.

  2. Thread-state packet retrieval injects fewer tokens for the same query – because a structured state object is already present there for agent to retrieve.

I might have guessed the answers but need to be very sure and the honest thing to do is build a benchmark, compare thread-state packet retrieval against state of the art retrieval methods on active working state queries, measure token count and answer quality, and write about what I find.

Thanks for reading 🙂

github repo: https://github.com/magic-bubblez/meniscus-

Raw Iron and Closed Pipes: How the New Era of AI Mimics the Verizon Playbook

This is a submission for the Google I/O Writing Challenge

Google I/O 2026 arrived with a familiar corporate script. The keynote speakers stood under bright lights, bragging about a staggering milestone where Google is now processing 3.2 quadrillion tokens per month. The presentation frames this as helping guide the global developer ecosystem to reflect on massive areas of success and opportunities for improvement. However, does throwing raw scale at a broken paradigm actually do that?

The answer is a resounding no.

Increasing token usage does not equate to increasing efficiency. It simply creates a more expensive, automated echo chamber. The connection desired by the tech conglomerates is completely lost in translation. When people do not know what they are doing with the data, why would anyone bother to care? Technological breakthroughs are a result of a developer’s genuine passion about representing the solution they are building. The primary fault with this keynote is it fails to inspire genuine passion. Because passion and purpose introduce you to a community where you truly belong, we cannot create belonging through a forced corporate agenda or random infrastructure allocations.

We are watching the AI industry mimic the precise playbook of traditional telecom monopolies like Verizon. We are moving toward a framework where essential compute is never fully accessible, actual service quality degrades under heavy network load, and the provider maintains absolute control over what passes through the pipe. Much like paying a premium for a data plan only to watch your signal throttle, developers are being forced to accept an ecosystem where they own nothing and are at the mercy of a central gatekeeper.

Many times the conversation veers into tech executives asking us what features could improve their cloud ecosystem, which in some ways is a step in the right direction. However, this takes up much of the limited time we have to actually create meaningful software. Instead of fostering a true community during this pivotal shift, it becomes a corporate survey of developers, further hampering efforts to inspire real change.

The irony is that the developer community is filled with individuals passionate about various distinct, independent disciplines, such as open-source software, hardware engineering, digital signal processing, and creative expression. But those unique interests are not being explored during these keynotes. Instead, as conglomerates aggressively pivot toward a new Hardware-as-a-Service paradigm, a severe divide continues to form between consumers and conglomerates. Through massive infrastructure consolidations, like the recent Anthropic partnership ecosystem, the tech giants are hoarding the raw iron. They secure gigawatts of data center capacity to run massive, trillion-parameter cluster scaling on their newest TPU architecture, while the local developer is left trying to optimize a small open-weights model on a single, isolated edge device.

We are expected to bond over generic exercises and highly polished, closed APIs that mean very little to us, led by systems that have not been given the framework for genuine human agency. This architecture forces a massive tension between their cloud-tethered behemoths and the actual desire of the community to run fully local, open-weights reasoning systems where the data never leaves the developer’s own hardware.

The paradox is that Google itself holds the key to solving this disconnect. While the main stage keynotes celebrate the infinite scale of closed APIs, Google’s open-weights initiatives – like the Gemma model ecosystem – represent the exact lifeline independent developers are fighting for. Gemma proves that you don’t need a trillion-parameter cluster to build something meaningful; incredible reasoning can happen locally on consumer-grade edge hardware. Yet, when the marketing narrative ignores these localized, independent communities to force an artificial, cloud-first ecosystem, the result from the developer body is obvious. Silence. Silence from an administration lagging behind actual human needs, silence from platforms that barely know what they are supposed to be accomplishing, and silence from an unconvinced developer body set on apathy.

Nobody belongs to just one tech ecosystem. These keynotes ignore the individual, localized communities already existing within our space. Instead of taking advantage of them, they haphazardly attempt to create artificial ones, forced and entirely disconnected from the intended purpose.

Conglomerates alone possess the absolute power of token creation. Until the power of the token is fully accessible to the consumer, we will live in a world entirely dictated by the will of the AI providers.

The next technological cycle is already unfolding and issues aside I will participate to express my passions. My spirit will hopefully encourage others as I continue fighting for our developer community. Because if we truly want to create a meaningful future, it starts with genuine passion and real connection, in order to build something authentic.

Therefore, I refuse to be Disconnected.

“True sovereignty is not about consuming a corporation’s infinite scale; it is about owning the power to generate your own future when the algorithm demands your compliance.”

Disclaimer: Gemini was helpful for thinking through ideas, organizing thoughts, and editing the writing during the drafting of this piece.

Score Any CVSS Vector Offline – v3.1 and v4.0, Zero Dependencies

A 4 KB JavaScript library that parses and scores CVSS vectors with no network calls, no build step, and no third-party API. Use it in CI or drop a web component into any page.

Every vuln management tool eventually needs to score a CVSS vector. Most of them either call out to NVD’s API (slow, rate-limited, requires network egress from your scanner) or pull in a fat dependency that drags an old crypto library along for the ride.

I built @hailbytes/cvss-calc because I wanted to score vectors inside a CI runner that didn’t have internet access. It’s a single, zero-dependency package that handles both CVSS v3.1 and v4.0.

Score a vector in two lines

import { calculate } from '@hailbytes/cvss-calc';

const result = calculate('CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H');
// { score: 9.8, severity: 'Critical', version: '3.1', vector: '...' }

v4.0 works the same way — the library parses the version from the vector string and dispatches to the right scorer. No flag, no branching at the call site:

const v4 = calculate('CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N');
// { score: 10.0, severity: 'Critical', version: '4.0', vector: '...' }

Or drop it into any page as a web component

<script type="module" src="https://cdn.jsdelivr.net/npm/@hailbytes/cvss-calc/dist/element.js"></script>

<hailbytes-cvss-calc vector="CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H"></hailbytes-cvss-calc>

The component renders a full interactive calculator. Listen for cvss-calculated events to read the score from JS.

Where I’m using it

  • A pre-deploy CI gate that fails the build if any new CVE in the SBOM scores ≥ 7.0
  • A ticketing integration that auto-prioritizes Jira issues by severity
  • A static status page where each disclosed CVE renders a live, interactive calculator

Scoring follows the official FIRST CVSS v3.1 and v4.0 specs.

npm install @hailbytes/cvss-calc

Source and docs: github.com/hailbytes/cvss-calc — MIT licensed.

Multi-Color 3D Printing Without Material Waste: Is Low-Cost Finally Realistic?

Three Things to Know Up Front

  1. Purge waste during color transitions has historically been the dominant cost driver in multi-color FDM printing — but recent hardware and software innovations are dismantling that cost structure.
  2. Mosaic Manufacturing claims its Array system reduces cost-per-part by up to 95% and raises single-operator throughput by 17×.
  3. Multi-material output is becoming viable on affordable desktop printers, reshaping the economics of prototyping and low-volume mixed production.

Why Multi-Color 3D Printing Has Always Been Expensive

Color switching means repeated material waste

In FDM printing, changing filament color requires purging the residual material from the nozzle before the new color can run cleanly. Every purge cycle discards filament that contributes nothing to the finished part. As color count increases, purge frequency increases, print time grows, and total material consumption can far exceed what the geometry actually requires. That feedback loop cemented the equation: more colors = higher cost, lower efficiency.

Definition — Purge: In multi-material 3D printing, a purge is the process of extruding and discarding residual material from the nozzle when switching between materials or colors. Purge waste directly inflates both material consumption and per-part cost.

High-precision alternatives carry high entry barriers

Inkjet-based processes such as PolyJet can produce precise multi-color parts, but the hardware typically costs hundreds of thousands of dollars — out of reach for most small manufacturers, hardware startups, and independent developers. Mosaic Manufacturing has noted publicly that multi-material capability was effectively the exclusive domain of these high-end inkjet platforms. (Source: Mosaic Unveils Array — 3DPrint.com)

Mosaic Manufacturing’s Palette and Array: Attacking Purge Waste Directly

An add-on that works with existing desktop printers

Founded in 2014, Mosaic Manufacturing has focused on reducing the total cost per part in desktop FDM printing. Their Palette device attaches externally to existing printers and enables multi-material output without requiring a proprietary machine. The subsequent Array system extends this further, integrating Canvas slicing software and a dedicated materials line into an automated production ecosystem. (Source: Mosaic Unveils Array — 3DPrint.com)

The hardware-agnostic approach matters: teams do not need to replace their existing printer fleet to gain multi-material capability.

Claimed performance numbers

Mosaic states that Array can reduce part cost by up to 95% and increase single-operator throughput by 17× compared to prior workflows. As a concrete reference point, they cite parts that previously cost around $20 being producible at a fraction of that figure. These gains are attributed to three simultaneous improvements: minimized purge waste, software-level toolpath optimization, and workflow automation. (Source: Mosaic Unveils Array — 3DPrint.com)

This is not merely an aesthetic upgrade. Reducing purge waste restructures the underlying cost model, which is why the approach is attracting attention beyond hobbyist circles and into small-batch manufacturing.

Material Economics by Process Type

PLA and ABS make FDM the natural battleground

PLA and ABS remain the most widely used FDM materials globally, and their relatively low raw material cost has driven rapid adoption. (Source: Materials and Costs for 3D Manufacturing — ManufacturingTomorrow) In an environment where feedstock is already inexpensive, eliminating purge waste has an outsized impact on total cost. This is precisely why competitive pressure around low-cost multi-color FDM has intensified.

SLS and SLA handle color differently

SLS uses PA 12 (nylon) powder as its standard material, with reported costs typically in the $45–$75 per kilogram range. (Source: Materials and Costs for 3D Manufacturing — ManufacturingTomorrow) Because SLS is a powder-bed process, there is no nozzle to purge — but achieving color requires post-process dyeing rather than in-print color switching. SLA resin printing is similarly single-color by default; multi-color results require post-print painting.

The practical implication: the purge-waste cost reduction story is currently an FDM story. SLS and SLA teams pursuing color variation need to budget for post-processing labor and materials separately.

Market Reality: Technology Alone Is Not Enough

The multi-material printing market is not uniformly healthy. Desktop Metal reported total revenue of approximately $202 million over a recent twelve-month period, but cost of revenue reached $189.5 million, producing an operating loss exceeding $201 million and a net loss of roughly $475 million. (Source: Schaeffler Acquires Multi-Material 3D Printing Division from Desktop Metal — 3DPrint.com)

The Aerosint acquisition — a multi-material powder-bed technology — was valued at $6.1 million at acquisition and reportedly declined to approximately $200,000 in value within a few quarters. (Source: Schaeffler Acquires Multi-Material 3D Printing Division from Desktop Metal — 3DPrint.com)

These figures are a useful counterweight to optimistic projections. Technical capability does not guarantee commercial viability. Cost structure, market timing, and operational efficiency all matter independently.

Practical Implications for Engineering and Manufacturing Teams

Prototyping cost changes first

The most immediate impact for most teams is at the prototype and mockup stage. Previously, producing a multi-color functional mockup meant booking time on expensive equipment or paying for post-print painting. As purge-optimized hardware and software become more accessible, color-accurate prototypes can be reviewed earlier in the design cycle at lower cost.

Functional multi-material design becomes more accessible

Beyond color, multi-material printing enables functional material separation within a single part — rigid and flexible zones, electrically insulating and conductive regions, or varying surface hardnesses. Applications are expanding across advanced electronics, medical devices, and consumer products. (Source: Market and Industry Potential of Multi-Material 3D Printing — 3DPrint.com)

As the entry barrier drops, design teams can begin specifying multi-material part architectures that were previously only feasible at large-volume production scales.

Key questions to evaluate before adopting

  • What is your current purge waste as a percentage of total filament consumed per job?
  • Does your slicer support purge-tower minimization or prime pillar optimization?
  • Is your color-change frequency high enough that an external multi-material unit (e.g., Palette-style) would pay back within your production volume?
  • For SLS or SLA workflows, is post-process dyeing or painting already budgeted, and does it meet your color fidelity requirements?

FAQ

Can affordable desktop printers actually do multi-color output?
Yes. External add-on devices that splice filament before it enters the hotend — Mosaic’s Palette being the most cited example — enable multi-color output on standard single-extruder printers. Software optimization to reduce purge volume is the key variable in whether the economics work.

What is the biggest cost factor in multi-color FDM?
Purge waste and the additional print time it generates. Raw filament unit cost matters less than how much of that filament is discarded during color transitions.

Do SLA or SLS support in-print multi-color?
Not in the conventional sense. Both processes are optimized for single-material output. Color is applied through post-processing — dyeing for SLS, painting for SLA — which requires separate process steps and budget.

Where can multi-material design files be sourced?
Platforms such as Thingiverse, Printables, and MakerWorld host multi-color models. For functional multi-material use, look for files structured as multi-body assemblies with material assignments per body, rather than single-mesh files with painted color regions.

Multi-color and multi-material 3D printing is maturing from a premium novelty into a cost-competitive manufacturing strategy. The convergence of purge-waste reduction, software toolpath optimization, and workflow automation is lowering the entry barrier. Whether that translates into commercial success depends, as the Desktop Metal case illustrates, on getting the cost structure and market timing right — not just the technology.

This article was prepared by eyecontact, a Korean industrial 3D printing service team.

Related reference links for readers who need location, quote, or additional technical context:

I’m Building Schedule Sensei: An Android App That Auto‑Adds Calendar Events from WhatsApp & Gmail

The Problem We All Face
Let me paint a picture.

You’re in a WhatsApp group. A message pops up:

“Tomorrow’s class is shifted to 10 AM instead of 9 AM.”

You see it. You think “okay.” Then tomorrow comes… and you completely forgot. Sound familiar?

Or maybe you get an email: “Meeting rescheduled to Friday at 3 PM in Conference Room B.” You manually open your calendar, type it in… and accidentally put 4 PM.

We receive dozens of time‑sensitive messages every day. Yet we still rely on our fallible human memory or tedious manual entry. There has to be a better way.

💡 The Idea: Schedule Sensei
I’m building an Android app that automatically:

Listens to notifications from WhatsApp, Gmail, and SMS (with your permission, of course)

Extracts date, time, title, and location using on‑device NLP

Adds high‑confidence events directly to your calendar

For uncertain messages, it reminds you with a custom sound to check the app

Works entirely offline – your data never leaves your phone

No more missed classes. No more double‑booking. No more privacy worries.

How It Will Work (Demo Flow)
User grants notification access (one‑time setup)

A WhatsApp message arrives: “Team sync tomorrow at 2 PM”

Schedule Sensei detects it → extracts “tomorrow at 2 PM” → confidence high → auto‑adds to calendar

User receives a silent confirmation (or can disable auto‑add in settings)

If the message is vague: “Maybe the schedule changed?” → low confidence → app plays a custom sound and shows a pending event for user review.

🔐** Privacy First**
I know what you’re thinking: “An app that reads my messages? No thanks.”

Here’s the deal:

All processing happens on your device – nothing is uploaded anywhere.

The app only sees notification content, not your full chat history.

You can turn it off anytime, or disable per source (WhatsApp only, Gmail only, etc.).

The code will be open source – you can audit it yourself.

🙌 Why I’m Posting Here
I’m sharing this early because I believe good ideas get better with community feedback.

I’d love your input on:

What messaging apps would you want supported? (Telegram? Signal? Instagram?)

Would you trust an on‑device notification reader? What would make you feel safer?

What edge cases should I handle? (Multiple dates in one message? Recurring events?)

Should I build a manual forward fallback (user shares a message to the app)?

Platform Engineering with GitHub: Build Your IDP with Copilot, IssueOps, and Golden-Path Repos

Every enterprise team I talk to is drowning in the same problem: toolchain sprawl. Backstage instances nobody maintains. ServiceNow tickets that take 3 days to provision a repo. Confluence pages with onboarding steps from 2022. Developers spending 40% of their time fighting infrastructure instead of shipping product.

Platform engineering promises to fix this — and the industry agrees. Gartner predicts that by 2026, 80% of software engineering organizations will establish platform teams. But here’s what most teams get wrong: they think they need to build another tool.

They don’t. GitHub already is the platform.

Want the complete implementation? This article covers the architecture overview. Newsletter subscribers get the real configs, full code, and step-by-step implementation details. Subscribe to the htek.dev newsletter →

The Problem with “Build Your Own IDP”

I’ve seen it play out the same way at every Fortune 500 company I’ve worked with. A platform team spins up a Backstage instance, spends 6 months building plugins, and ends up with a portal that developers still don’t want to use — because it’s another tab. Another login. Another thing to maintain.

Meanwhile, every developer on the team already lives in GitHub 8 hours a day.

The insight that changed everything for me: the best platform is invisible. It meets developers where they already are — in their IDE, in their pull requests, in their issues. You don’t need a separate portal. You need GitHub, used correctly.

The Golden Path Pattern

A golden path isn’t a locked-down template. It’s an opinionated default that accelerates developers without restricting them. Think of it like Rails conventions — you can deviate, but the default path is so good that most people don’t need to.

In the GitHub ecosystem, golden paths are starter repos + Copilot context:

  • copilot-instructions-starter — Drop-in .github/copilot-instructions.md templates that give Copilot the context to understand your org’s conventions from day one.
  • copilot-agent-starter — Scaffold custom Copilot CLI agents with proper extension architecture, hooks, and skill files.
  • copilot-life-os-starters — Full starter kits for building agentic systems on top of Copilot CLI.

When a new developer joins the team and creates a repo from your golden-path template, they inherit the right CI/CD pipelines, the right Copilot context, the right linting rules, and the right security policies. Onboarding drops from days to minutes.

IssueOps: Eliminate the Ticketing Layer

Why send developers to ServiceNow when they can just open a GitHub Issue?

IssueOps turns GitHub Issues into the interface for platform operations. Need a new environment? Open an issue with a specific label. Need a database provisioned? Issue template with the right inputs. GitHub Actions picks it up, runs the automation, and comments back with the result.

The gh-aw-overview repo demonstrates this pattern — using GitHub’s native primitives (Issues, Actions, labels, comments) as the control plane for platform operations. Developers never leave GitHub. No context switching. No ticket queue.

Hookflows: Governance Without Friction

The hardest part of platform engineering isn’t building the golden path — it’s keeping people on it without becoming a bottleneck.

This is where hookflows change the game. Hookflows intercept actions at the agent layer — validating commits, enforcing branch naming, checking policy compliance — before they hit the repo. They’re governance guardrails that run automatically.

Combined with copilot-hooks-starter, you get a pre-built framework for intercepting and validating agent operations. The copilot-ci-pipeline repo extends this into CI — giving you a full feedback loop from commit to deployment.

I wrote more about this pattern in my article on governing AI agents in git — the principles apply equally to human and AI-driven workflows.

Newsletter subscribers get the real configs. The full hookflow definitions, the IssueOps action templates, and the architecture diagrams that connect all 7 repos into a cohesive platform. Get the implementation details →

The 7-Repo Stack

Here’s the full stack, all open source and production-tested:

Repo Purpose
copilot-instructions-starter Org-wide Copilot context templates
copilot-agent-starter Custom Copilot CLI agent scaffolding
copilot-hooks-starter Agent-layer governance hooks
copilot-ci-pipeline CI feedback loop for AI-assisted dev
gh-hookflow Governed git operations framework
gh-aw-overview IssueOps platform operations pattern
copilot-life-os-starters Full agentic system starter kits

These aren’t demos. I built and validated this stack while running a DevOps enablement platform at a Fortune 500 energy company — supporting hundreds of repos and dozens of development teams. The patterns scale.

Why GitHub IS the Platform

The realization that unlocked all of this: you don’t need a separate platform layer. GitHub already has:

  • Identity & access (Teams, CODEOWNERS, branch protection)
  • Service catalog (repo topics, README conventions, copilot-instructions.md)
  • Self-service provisioning (IssueOps + Actions)
  • Compliance & governance (hookflows, required checks, audit logs)
  • Developer AI (GitHub Copilot with full repo context)
  • Deployment (Actions + environments + OIDC)

Every piece of Backstage functionality has a native GitHub equivalent — and developers already know how to use it. Your platform team’s job isn’t to build a portal. It’s to configure GitHub as a platform and encode golden paths that make the right thing the easy thing.

Go Deeper

If you’re building (or rebuilding) an internal developer platform, I wrote a full implementation guide as part of The Agentic Development Blueprint — including architecture diagrams, configuration files, and the decision framework for what goes in golden paths versus what stays flexible.

For related patterns, check out my guide to Copilot CLI extensions and how hookflows enforce governed git for AI agents.

This was the architecture overview. The newsletter issue has the step-by-step implementation — exact configs, IssueOps templates, hookflow definitions, and the full wiring diagram connecting all 7 repos into one cohesive IDP.

Subscribe to the htek.dev newsletter →

What Does Vue 3 `ref()` Compile to in React with VuReact?

VuReact compiles Vue 3 code into standard, maintainable React code. In this article, we will focus on one of the most frequently used Vue APIs: ref() and shallowRef().

If you write them in Vue, what does VuReact turn them into on the React side?

A Quick Note Before We Start

To keep the examples easy to read, this article follows two simple conventions:

  1. All Vue and React snippets show core logic only, with full component wrappers and unrelated configuration omitted.
  2. The discussion assumes you are already familiar with the API and behavior of Vue 3 ref and shallowRef.

Compilation Mapping

Vue ref() -> React useVRef()

ref() is one of the most fundamental reactive APIs in Vue 3, and easily one of the most commonly used in day-to-day development.

Here is the simplest possible example:

  • Vue
<script setup>
import { ref } from 'vue';

// Primitive reactive state
const count = ref(0);
</script>
  • Compiled React
import { useVRef } from '@vureact/runtime-core';

// Compiled into a dedicated Hook that mirrors Vue ref semantics
const count = useVRef(0);

As you can see, Vue’s ref() is compiled directly into the React Hook useVRef().

VuReact’s useVRef is the runtime adapter for ref. You can think of it as a React-side equivalent of Vue ref, designed to preserve the same mental model and behavior, including reactive updates, .value access, and predictable view re-rendering.

TypeScript Support Stays Intact

In real-world projects, TypeScript is the default rather than the exception. VuReact preserves generic type annotations so React-side type safety and editor hints stay intact.

  • Vue
<script lang="ts" setup>
const title = ref<string>(''); // string
const isLoading = ref<boolean>(false); // boolean
const userList = ref<Array<{ id: number; name: string }>>([]); // array of objects
const config = ref<Record<string, any>>({ theme: 'dark' }); // record type
</script>
  • Compiled React
const title = useVRef<string>('');
const isLoading = useVRef<boolean>(false);
const userList = useVRef<Array<{ id: number; name: string }>>([]);
const config = useVRef<Record<string, any>>({ theme: 'dark' });

No manual type adaptation is required. VuReact keeps the original type annotations so the generated React code remains just as type-safe as the Vue source.

Vue shallowRef() -> React useShallowVRef()

shallowRef() is Vue 3’s shallow reactive variant. It is especially useful when you want to react to top-level reference changes without deeply tracking nested properties.

  • Vue
<script setup>
import { shallowRef } from 'vue';

// Only tracks top-level reference changes
const count = shallowRef({ a: { b: 1, c: { d: 2 } } });
</script>
  • Compiled React
import { useShallowVRef } from '@vureact/runtime-core';

// Preserves shallowRef-style shallow reactivity
const count = useShallowVRef({ a: { b: 1, c: { d: 2 } } });

The mapping follows the same pattern: Vue shallowRef() becomes useShallowVRef().

VuReact’s useShallowVRef is the runtime adapter for shallowRef. In practice, that means only top-level reference changes trigger updates, while nested property mutations do not. This lines up well with React’s update model and is especially helpful for performance-sensitive scenarios involving complex objects.

The Art of Sound: Why Every Musician Needs an Online Equalizer

Discover how an online equalizer can transform your listening experience, from casual streaming to professional mixing. Learn the science, the tools, and the creative freedom behind digital frequency control—no downloads required.

The Sonic Landscape: A Mess We’ve Learned to Love
Sound is never neutral. Every room, every pair of headphones, every streaming platform bends and colors what you hear. A song that sounds punchy on your studio monitors might turn muddy in your car. A podcast voice that feels crisp on your laptop could become boomy on your phone’s speaker. For decades, solving this required hardware—graphic equalizers with physical sliders, rack-mounted units, or expensive audio interfaces. But the internet changed everything.

Enter the online equalizer. No installation. No cables. Just a browser tab and the power to reshape frequency response in real time. Whether you’re a bedroom producer, a critical listener, or someone who just wants their old MP3s to breathe again, this tool has quietly become one of the most democratizing forces in digital audio.

But let’s step back. What does an equalizer actually do? In simple terms, it adjusts the balance of frequency components within an audio signal. Low frequencies (20–250 Hz) give you bass and kick drum weight. Mids (250 Hz–4 kHz) carry vocals, guitars, and most melodic information. Highs (4 kHz–20 kHz) add air, cymbals, and detail. An equalizer lets you boost or cut specific frequency ranges, effectively reshaping the instrument’s voice.

An online equalizer does all of this inside a web application. You drag virtual sliders or click preset curves. The audio from your microphone, system output, or a local file passes through a real-time processor. What you hear changes instantly. This is not a simulation—it’s actual audio processing powered by JavaScript and Web Audio API. The same mathematical filters found in thousand-dollar hardware are now running freely on any connected device.

Beyond Presets: Why Your Ears Need Control
Most music listeners have never touched an EQ. They rely on manufacturer tuning, streaming service normalization, or vague “bass boost” switches. That’s a shame. Every recording, every playback device, and every ear canal is different. A one-size-fits-all frequency response is like saying one pair of glasses works for every eye.

Here’s a practical example. Open your favorite streaming platform and play a rock song from the 1970s. Listen to the cymbals. They might sound harsh or sizzling. That’s not necessarily bad mixing—it’s often the result of master tapes, vinyl transfers, and modern DACs interacting with your headphones’ treble peak. Now open an online equalizer and gently lower frequencies around 6–8 kHz by 3 dB. The harshness softens. The vocals move forward. The snare drum feels rounder. You haven’t ruined the song; you’ve adapted it to your ears.

Conversely, try a low-budget laptop recording from 2005. Vocals sound thin and nasal. Boost around 200–400 Hz for warmth, add a slight shelf at 2 kHz for presence. Suddenly, a demo sounds like a proper release. The online equalizer becomes a forensic tool—not to fix bad recordings, but to understand why they feel different.

For musicians, the use case is even sharper. Mixing in untreated rooms is a nightmare. Bass traps and acoustic panels are expensive. But a simple spectral analysis paired with an online equalizer lets you compensate for room nodes. Place your laptop at your listening position. Play pink noise. Use the EQ to flatten the most obvious room resonances. It’s not perfect, but it beats guessing. Many online EQs also offer mid/side processing, allowing you to EQ the center (vocals, bass) separately from the sides (reverb, pads). That’s pro-level control without pro-level costs.

The Hidden Engineering Inside Your Browser
How does an online equalizer achieve low-latency processing? The Web Audio API, supported by Chrome, Firefox, Safari, and Edge, creates an audio graph. You connect nodes: a source (mic, file, or system audio), a filter node (the equalizer), and a destination (speakers or headphones). The filter node runs biquad filters—second-order infinite impulse response filters that can create low-shelf, high-shelf, peaking, low-pass, high-pass, and notch curves. A typical 10-band graphic EQ chains ten peaking filters with fixed center frequencies (31, 62, 125, 250, 500 Hz, 1k, 2k, 4k, 8k, 16k Hz). Each slider controls the gain (typically +/- 12 dB) at that center frequency with a fixed Q (bandwidth).

The math happens in the browser’s background thread, often at sample rates of 44.1 or 48 kHz. Latency hovers around 10–20 milliseconds—barely perceptible. More advanced online equalizers implement zero-latency filters or use IIR filters with phase compensation. Some even offer spectrum analyzers rendered via Canvas or WebGL, showing real-time frequency content. You see the bass hit, watch the treble shimmer, and adjust sliders accordingly. This was science fiction fifteen years ago. Today, it’s a right-click away.

But engineering alone isn’t enough. The best online equalizer provides workflow features: preset saving, keyboard shortcuts, drag-and-drop audio file loading, and even parametric modes (gain, frequency, Q individually adjustable). Some integrate with virtual cables (like Loopback or VB-Cable) to process Spotify, YouTube, or game audio system-wide. Others include per-channel memory, A/B comparison, and exportable EQ curves. The gap between a browser tool and a desktop DAW plugin has shrunk to almost nothing.

Practical Applications: From Casual to Critical
Let’s walk through three real-world scenarios where an online equalizer outperforms hardware or paid software.

Scenario one: Remote collaboration. You’re a vocalist recording takes at home. Your producer sends a rough mix. You listen on your earbuds and feel the bass is overwhelming, masking your voice. Instead of guessing, you load the track into an online EQ, cut 100–150 Hz by 6 dB, and send back a screen recording of your adjusted curve. The producer understands immediately. No back-and-forth about “turn down the low end” vs. “no, it’s fine.” Visual + sonic clarity.

Scenario two: Accessibility. A friend with high-frequency hearing loss wants to enjoy jazz again. Traditional hearing aids are expensive and not designed for music. You open an online equalizer, boost 2–8 kHz selectively, notch out problematic feedback frequencies, and save the curve as a URL. They bookmark it. Every time they listen through their browser, music becomes audible again. That’s empowerment.

Scenario three: Archival restoration. You digitized a cassette tape from 1988. The recording has rumble (low-frequency noise) and hiss (high-frequency noise). A DAW could fix this, but you don’t have one installed. Online EQ: high-pass filter at 60 Hz to remove rumble. Low-pass filter at 12 kHz to reduce hiss. Then a wide boost at 1.5 kHz to bring back vocal clarity. The result is listenable. Not studio-grade, but vastly better than raw.

These are not edge cases. They are the daily reality of anyone who touches audio without a dedicated studio. The online equalizer has become the Swiss Army knife of the digital sound world—always available, always free (in most cases), and surprisingly deep.

Why This Matters Beyond Sound
There is a deeper lesson here. For decades, audio processing was gatekept by proprietary software, hardware dongles, and steep learning curves. The online equalizer breaks that pattern. It runs on a $200 Chromebook. It works on public library computers. It requires zero installation, zero accounts, zero payment. That is radical. It means a teenager in a rural area can learn how frequency masking works by dragging a slider and listening. It means a visually impaired user can rely on keyboard-controlled EQ bands without navigating cluttered interfaces. It means your grandmother can boost dialogue frequencies on her favorite podcast without calling tech support.

Democratization of audio is not a marketing slogan. It is happening right now in your browser. The same web standards that enable video conferencing and interactive maps also enable surgical frequency shaping. And because the online equalizer lives in a browser, it inherits cross-platform support, automatic updates, and privacy-by-default (no upload required if you process locally). That last point is critical: many online EQs never send your audio to a server. All processing happens in RAM on your local machine. Your singing, your private recordings, your voice notes—they never leave your device.

Limitations and the Future
Of course, an online equalizer is not a magic wand. Browser-based processing cannot yet match the zero-latency performance of dedicated DSP hardware or native apps. The Web Audio API does not support surround sound or high channel counts easily. Some browsers throttle background tab performance, causing audio glitches. And because each equalizer implementation varies, curve interpolation and filter quality differ dramatically. A 10 dB boost in one online EQ might sound clean; in another, it could alias or distort.

But these limitations are shrinking. WebAssembly now allows near-native performance for audio codecs and filters. The Web Audio API continues to evolve, with proposals for advanced convolution reverbs and more flexible routing. Meanwhile, hardware continues to move into the cloud. Future online equalizers will likely incorporate AI-assisted curve matching, where you feed a reference track and the EQ automatically approximates its frequency balance. Or real-time loudness matching, so boosting bass doesn’t trick your ear into thinking it’s louder (and therefore “better”).

Until then, the current generation of online equalizers already delivers professional utility. Whether you use a simple 3-band EQ for podcast monitoring or a full 31-band graphic EQ for mastering checks, the tool is there. No rent. No license expiry. No “update available” popup.

Final Listening Test
Close this article. Open a new tab. Search for a free online equalizer—there are dozens. Any will do. Load a song you know intimately, preferably one you’ve heard on multiple systems. Start flat. Then slowly create an exaggerated curve: crank the lows, scoop the mids, blast the highs. Listen to how the song breaks apart. Reset. Now make subtle cuts only where something bothers you. A little less snare ring. A little more vocal warmth. A tiny lift in the air frequencies. Listen again.

You are not hearing the song as the engineer heard it in the control room. You are hearing it as you need to hear it—right now, on this device, in this room, with your ears. That is not cheating. That is the entire point of an equalizer. And the fact that it happens in a browser tab, for free, instantly, is nothing short of miraculous.

The online equalizer is not a toy. It is not a placeholder until you buy “real” software. It is a legitimate, powerful, and beautiful tool for anyone who believes sound should serve the listener—not the other way around. Use it well.

Gemini’s New UI + 3.5 Flash: Google Is Building an AI-Native Developer Experience

Gemini’s New UI + 3.5 Flash

Gemini’s New UI + 3.5 Flash

Google just gave Gemini a major glow-up at Google I/O 2026, and this feels less like a chatbot refresh and more like the beginning of an AI-native operating experience for developers.

The new Gemini UI looks cleaner, faster, and far more focused on workflow. The redesigned “Ask Gemini” interface, smoother animations, contextual tools, and simplified model selector make the experience feel lightweight while still being powerful.

Google is clearly moving toward an AI-first UX where the assistant becomes part of the workflow instead of just a separate chat window.

What Stands Out in the New UI

  • Minimal and distraction-free design
  • Faster access to models and tools
  • Better workflow-oriented layout
  • Cleaner interaction experience
  • More integrated AI workspace feel

The overall interface now feels closer to a productivity environment rather than a traditional AI chat app.

Gemini 3.5 Flash Looks Interesting for Developers

What caught my attention most is Gemini 3.5 Flash.

Google is positioning 3.5 Flash as a high-speed model optimized for:

  • Coding workflows
  • Agentic tasks
  • UI generation
  • Iterative development
  • Long-context execution
  • Fast response generation

The speed improvements genuinely look impressive.

This is where things start becoming exciting for developers.

We’re entering an era where:

  • AI assists during the actual build process
  • Prototyping becomes conversational
  • Frontend generation becomes iterative in real time
  • Agents can execute multi-step workflows instead of only answering prompts

Why This Matters

Gemini’s redesign reflects a larger shift happening across the AI ecosystem.

AI tools are no longer just assistants.
They’re becoming development environments.

The new UI reflects that direction:

  • Minimal distractions
  • Contextual actions
  • Faster workflow switching
  • Better tool accessibility
  • Workspace-style interactions

Google still has strong competition from OpenAI, Anthropic, and the open-source ecosystem, but Gemini 3.5 Flash feels like Google finally aligning:

  • Infrastructure
  • Multimodal AI
  • Developer tooling
  • UI/UX polish
  • Workflow integration

into one ecosystem.

Final Thoughts

The next phase of software development may not just be about writing code faster.

It may be about:

Designing, testing, debugging, generating, and deploying — all through AI-native workflows.

And Gemini’s new UI combined with 3.5 Flash feels like a strong step in that direction.

Bubble Sort Explained Simply — Algorithm, Code & Complexity

Bubble Sort isn’t used in production — but it’s the best algorithm to learn sorting logic because every step is visible and intuitive.

🔹 The Idea

Repeatedly compare adjacent elements. If wrong order, swap. Larger elements “bubble up” to the end.

📋 Step-by-Step: [5, 3, 8, 2]

Pass 1: 5↔3 → 5 vs 8 → 8↔2 → [3, 5, 2, **8**]
Pass 2: 3 vs 5 → 5↔2 → [3, 2, **5**, 8]
Pass 3: 3↔2 → [**2**, **3**, 5, 8] ✅

💻 Optimised JavaScript

function bubbleSort(arr) {
  const n = arr.length;
  for (let i = 0; i < n - 1; i++) {
    let swapped = false;
    for (let j = 0; j < n - i - 1; j++) {
      if (arr[j] > arr[j + 1]) {
        [arr[j], arr[j + 1]] = [arr[j + 1], arr[j]];
        swapped = true;
      }
    }
    if (!swapped) break; // Early exit — O(n) best case
  }
  return arr;
}

⏱ Complexity

Case Time Space Stable
Best (sorted) O(n) O(1) ✅
Average O(n²) O(1) ✅
Worst (reversed) O(n²) O(1) ✅

Part 7 of the Bitveen DSA Series. Originally published at bitveen.com