Skip to content
HomeAt Splunk, that means pairing React product work with Python services, operational data, permissions, evaluation, and release controls. Earlier at Deloitte, I built extraction, storage, API, and visualization systems; two removed more than 36,000 hours of annual manual work and cut investment-processing time by 66%.WritingTechnical writing on software engineering, AI engineering, system design, and the trade-offs behind production systems.ProjectsA growing collection of systems and products I’ve built—from current infrastructure work to earlier projects that shaped how I build today.Abdul AhadI’m an AI full-stack engineer with more than five years of experience building data-intensive enterprise software and production AI systems. At Splunk, I drove AI Service and KPI Discovery from an early prototype through technical design, validation, and production delivery. The capability analyzes operational data and recommends service models and health signals within Splunk IT Service Intelligence.Let’s talk.If you’re hiring, building something interesting, or want to compare notes on a difficult engineering problem, send me a message. A few lines is plenty.ColophonHow this portfolio handles static publishing, search, contact delivery, analytics, and releases.Capacity Planning Before Architecture DiagramsA practical method for turning workload assumptions into request, storage, bandwidth, concurrency, and failure-capacity budgets before choosing an architecture.Design Modules Around Change, Not LayersA practical guide to information hiding, volatile decisions, coupling, cohesion, dependency direction, and avoiding abstractions that preserve the wrong boundaries.From Model Call to Reliable AI WorkflowHow one model request grows into retrieval, tools, deterministic workflows, agents, evaluation, observability, and human escalation.Queues, Backpressure, and Idempotency: Designing for FailureHow bounded queues, admission control, idempotency keys, retry budgets, and dead-letter handling turn asynchronous delivery into a controlled reliability system.Refactoring a Legacy Backend Without a Big-Bang RewriteA staged method for understanding, testing, isolating, replacing, observing, and finally deleting legacy backend behavior without one irreversible cutover.MCP in Production: Trust Boundaries, Permissions, and Tool DesignA production-focused guide to MCP hosts, clients, servers, capability discovery, authorization, consent, token audiences, and safely designed tools.How this portfolio worksA walkthrough of how an edit becomes a published page, what happens after someone presses Send, and how the site avoids losing or saving the same message twice.ThreadsPosts, nested replies, profiles, and communities share the same records. This follows one conversation from creation to deletion.Prompt NexusGoogle sign-in leads to a local user, then one saved prompt powers the feed, profile, search, and edit screens.SeedEditors publish articles in HyGraph, readers receive prepared pages, and new comments remain private until they are approved.CactaOne published video creates a media asset, a post record, and temporary browser state. This follows that upload across the product.System DesignCapacity, queues, failure handling, and distributed-system trade-offs.AI EngineeringLLM workflows, tools, evaluation, permissions, and operations.Software EngineeringModules, testing, refactoring, interfaces, and maintainability.System Design from First PrinciplesCapacity planning, queues, backpressure, retries, and failure handling.Production AI EngineeringModel calls, workflows, tools, evaluation, permissions, and operations.

← Back to Projects

2022 · Previous work6 min read

Seed

Editors publish articles in HyGraph, readers receive prepared pages, and new comments remain private until they are approved.

2022Previous work6 min read

Generated article and category pages from structured editorial content instead of querying the content service on every visit.

  • Next.js
  • React
  • TypeScript
  • Tailwind CSS
  • GraphQL
  • HyGraph
  • Sass
Seed publishing application interface
On this page

Seed is a publishing site with a home page, article pages, categories, related posts, and comments. Editors create the content in a structured editing service called HyGraph. Readers visit the separate public site.

The main design question was what should happen between those two moments. An editor may change an article occasionally, while the finished article may be read many times. Seed avoids rebuilding the same page from the content service for every reader.

From an editor's publish action to a reader's page#

An article in HyGraph stores its title, body, image, author, slug, and category relationships. The slug is the readable part of its URL. Categories and authors are separate records, so several articles can point to the same category or author without copying their details.

During a deployment, Seed asks HyGraph for the known article and category slugs. Next.js then requests the content for each route and turns it into HTML. Preparing pages before visitors request them is static generation.

The completed HTML is cached and served to readers. A normal article visit therefore does not wait for HyGraph to answer or for React to assemble the main body in the browser.

View diagram source
flowchart TB
    E["Editor publishes an article in HyGraph"] --> Q["Next.js requests article data"]
    Q --> H["Build complete HTML"]
    H --> C["Store the prepared page in cache"]
    C --> R["Reader opens the article"]

Seed uses GraphQL for those content requests. GraphQL lets each screen name the fields it needs. The home page asks for card-sized article data; an article page asks for the full body, author, image, and categories; a category page asks for articles connected to one category.

Showing edits without rebuilding the whole site#

A prepared page can become old after an editor changes the article. Seed gives each route a refresh window. Once that time has passed, a request can start generating a newer copy. Until the new copy is ready, readers continue receiving the last completed page instead of waiting on an unfinished response.

Next.js calls this incremental static regeneration. In practical terms, the site keeps the speed of a prepared page while allowing that page to be replaced after publishing.

The home page used a longer refresh window than article and category pages. That was a product decision rather than a framework rule: an individual article is more likely to need a recent correction, while a slightly older home listing is less disruptive.

Publishing a new article after deployment#

The build can prepare only the slugs that exist at that time. An editor may add a completely new article later, before another deployment runs.

For a valid slug that has not been built yet, Seed generates the page on the first request and waits until that page is complete before responding. The completed result is cached for later visitors. Next.js calls this a blocking fallback.

This avoids returning “not found” until the next deployment, while also avoiding a live content query on every visit. The trade-off is that the first reader of a new slug pays the generation time.

If I rebuilt this flow now, a signed publishing webhook could request the new page as soon as the editor publishes it. The page would still be prepared once and reused; the editor's action, rather than the first reader, would trigger that work.

Loading the article and its supporting sections#

The main article body is part of the prepared HTML. Recent posts, related posts, categories, and comments were requested later from the browser.

That means the article remains readable if one of those secondary requests fails. It also means supporting sections can appear after the layout has loaded, each visitor repeats similar requests, and search engines do not receive all of that context in the initial HTML.

The related-post query itself is specific: it looks for articles sharing a category with the current article and excludes the current slug. The data request follows what that screen needs instead of downloading the full content store.

A rebuild would keep the article in the initial HTML and prepare more of the useful supporting content with it. Recent and related posts are secondary, but they are still predictable at page-generation time.

From comment submission to publication#

Reading an article uses public cached data. Submitting a comment changes shared content and needs a private credential, so it follows a different route.

The browser sends the commenter's name, email, text, and article slug to a Next.js API endpoint. That endpoint holds the private HyGraph token. It creates a comment connected to the article but leaves the comment unpublished.

An editor reviews the draft in HyGraph and chooses whether to publish it. Public comment queries return only published records. The content editor therefore doubles as the moderation screen.

View diagram source
sequenceDiagram
    participant R as Reader
    participant S as Seed server
    participant H as HyGraph
    participant E as Editor

    R->>S: Submit a comment for an article slug
    S->>S: Check the submitted fields
    S->>H: Create an unpublished comment
    H-->>S: Draft comment created
    S-->>R: Confirm receipt
    E->>H: Review and publish the draft
    R->>H: Request published comments
    H-->>R: Return the approved list

Keeping the token on the server prevents browser code from using the private credential directly. The archived route still needed stricter field validation, rate limiting, spam controls, clearer email handling, and better failure feedback. Manual review stops an unwanted comment from appearing immediately; it does not protect the submission endpoint by itself.

Before publishing another version#

I would keep prepared pages for the public reading path and connect publishing events to targeted page refreshes. Article-side recommendations and category context would move into the generated HTML where possible. Content responses would be checked against explicit schemas before page generation.

The comment route would receive the larger change: validated input, abuse controls, a clear privacy policy for email addresses, and observable errors when HyGraph rejects a write.

The request path remains separated by responsibility. Editors write structured content; deployments or publishing events prepare pages; readers reuse those pages; and the smaller set of operations that change shared data pass through a trusted server.