SGShubham Goyal
HomeProjectsBlogContactAvailableHire me ↗

Full-stack developer building scalable systems and clean user experiences.

linkedingithubdiscordtwitterinstagramtelegram

Navigate

HomeProjectsBlogContact

Resources

RésuméGitHubLinkedIn

Get in touch

[email protected]Hire me
© 2026 SHUBHAM GOYAL · ALL RIGHTS RESERVEDPrivacy·Terms· BUILT IN INDIA · v2.0
Blog

Backend Engineering

Building Seekrly: An AI-Powered, Multi-Service SaaS Platform

I spent 500+ hours building Seekrly, an AI-powered career management platform, with a focus on backend architecture, asynchronous processing, dedicated AI workers, and reliable integrations. This case study explores the engineering decisions behind a real SaaS product built with Go, Next.js, MongoDB, Redis, Python, and Docker.

Shubham Goyal

21st October 2026

1
Building Seekrly: An AI-Powered, Multi-Service SaaS Platform

I didn't want to build another CRUD application just to add a project to my portfolio. I wanted to build a product that solved a real problem, required real engineering decisions, and forced me to think beyond individual API endpoints.

That became Seekrly: an AI-powered career management platform that helps job seekers organize applications, save opportunities, manage resumes, assess job fit, and prepare for interviews. Over 500+ hours of building and iterating, I worked across the product, backend services, AI workflows, integrations, and infrastructure.

The interesting part wasn't simply adding features. It was figuring out how to make different services work together, move expensive work out of request handlers, protect user data, and keep background processing reliable as the product grew.

The Problem: A Job Search Is a Workflow, Not a Spreadsheet

A job search involves multiple disconnected activities: discovering roles, saving job descriptions, tailoring resumes, tracking applications, communicating with recruiters, and preparing for interviews. Keeping everything organized across job boards, spreadsheets, documents, and browser tabs creates unnecessary overhead.

Seekrly brings these activities into one platform. Users can save job opportunities, organize their application pipeline, manage resumes, and use AI-powered tools to make their job search more targeted.

From an engineering perspective, these features create different workloads. Saving an application needs a quick response. Parsing a resume or generating interview questions can take longer, consume model resources, and fail for reasons outside the application's control. Treating every operation as a synchronous API request would make the system harder to operate and scale.

Architecture: Separate Responsibilities, Share Business Logic

Seekrly evolved into a multi-service application. Instead of forcing every responsibility into a single backend process, I separated the user-facing application, core backend functionality, background processing, and AI execution into components with clearer responsibilities.

  • Next.js and React: The user-facing application, dashboards, application workflows, and product interfaces.
  • Go services and workers: Backend operations, integrations, scheduled tasks, and background processing where independent execution is useful.
  • MongoDB: Persistent application data, including user-related records and job-search information.
  • Redis: Queueing and stream-based coordination for asynchronous work.
  • Python AI worker: A dedicated execution environment for AI-powered workflows, model integrations, and structured AI outputs.
  • Docker and Docker Compose: Containerized services and a repeatable deployment setup.
  • The key design decision was to separate responsibilities without unnecessarily duplicating business logic. Multiple entry points should not develop their own conflicting versions of the same rules.

    The Shared Service Layer: One Set of Rules

    As a product grows, the same business operation may be triggered from the web application, an API client, a browser extension, or an external integration. Implementing the same operation separately in every entry point creates inconsistency and increases the chance of security bugs.

    I structured the backend around reusable service-layer operations so that different interfaces could invoke the same business logic rather than independently implementing database access and application rules.

  • Centralized validation and business rules instead of scattering them across route handlers.
  • User-scoped data access to help prevent one account from accessing another account's records.
  • Consistent permission checks and input validation across supported interfaces.
  • Activity tracking for important operations, helping make user actions easier to audit and troubleshoot.
  • This approach makes adding another integration less expensive. A new interface can reuse established operations instead of becoming another independent implementation of the product's business rules.

    The AI Worker: Keeping Expensive Work Out of Request Handlers

    One of the most important architectural decisions was giving AI processing its own worker instead of mixing model execution directly into the main application request lifecycle.

    Seekrly's AI features handle documents, job descriptions, user context, and generated content. Model calls can be slow, return malformed output, encounter rate limits, or fail temporarily. They also have different compute and cost characteristics from ordinary CRUD operations.

    A dedicated AI worker creates a boundary between accepting an operation and executing it. The application can validate and enqueue eligible work, while the worker handles processing, model communication, retries, and result persistence.

    AI Features Built Around Real Job-Search Tasks

  • Resume parsing: Extracting structured information from uploaded resumes so the platform can work with a candidate's experience, skills, and qualifications.
  • Job fit scoring: Comparing a candidate's profile and resume with a job description to produce a structured assessment of the match.
  • Interview preparation: Generating role-relevant interview questions and preparation material using the candidate's background and target opportunity.
  • Resume tailoring: Helping adapt resume content to the requirements and language of a particular role.
  • Job-search assistance: Using AI to support application-related workflows and make job information more actionable.
  • These are not all the same AI task. Resume parsing needs structured extraction; job fit scoring needs a consistent comparison; interview preparation needs useful, role-specific content. Keeping them within a common processing system allows shared infrastructure while preserving feature-specific instructions and output validation.

    How the AI Processing Pipeline Works

    The worker follows a controlled processing flow rather than treating every model response as trustworthy output.

  • Accept and validate the task: Check the requested operation, input size, and required context before processing.
  • Prepare the input: Convert supported attachments into processable content and apply appropriate input safeguards.
  • Protect sensitive information: Where applicable, replace personally identifying details with placeholders before sending content for model processing.
  • Handle usage and credits: Apply usage controls before expensive work begins so requests are subject to the platform's limits.
  • Select a model route: Choose an appropriate model configuration based on the task's needs, balancing quality, latency, and cost.
  • Validate the response: Check for expected structure and usable output instead of assuming every model response is valid.
  • Recover or fail safely: Apply retries and fallback behavior for eligible failures, while avoiding endless reprocessing.
  • Persist the outcome: Store the result, handle temporary inputs according to the workflow, and acknowledge the task only after the appropriate outcome is recorded.
  • This pipeline matters because AI reliability is not just a prompt-engineering problem. It also involves input boundaries, usage accounting, model failures, output validation, sensitive data, and the lifecycle of a background job.

    Redis Streams and Reliable Background Processing

    Background jobs introduce their own failure modes. A worker can crash after receiving a task. A model provider can time out. A process can restart before the result is saved. Simply putting work in a queue does not automatically make the system reliable.

    Seekrly uses Redis-based queueing and stream processing to coordinate asynchronous work. Consumer groups provide a foundation for distributing tasks across worker instances and managing pending messages.

  • Separate task acceptance from task execution so longer operations do not have to occupy the original request.
  • Acknowledge messages after the appropriate processing outcome rather than immediately upon receipt.
  • Recover abandoned pending work when a worker stops unexpectedly.
  • Use retries and backoff for transient failures, with controlled handling for tasks that repeatedly fail.
  • Design processing steps with duplicate delivery and repeated execution in mind.
  • The important distinction is that queue delivery and business-operation completion are not the same thing. A robust worker must account for what happens when execution stops between those two events.

    Scheduled Jobs and Idempotency

    Not every background task starts with a user request. Scheduled workflows also need to run at the right time, avoid duplicate execution, and recover from missed runs or service interruptions.

    For scheduled processing, I use atomic claiming and idempotency-oriented design to reduce the risk of two workers executing the same logical operation. Catch-up and sweep mechanisms help account for work that was missed while a service was unavailable.

    These mechanisms are important for any SaaS product with reminders, recurring tasks, notifications, or time-dependent workflows. They also force you to define what a successful operation means and how the system should behave after a partial failure.

    More Than a Web App: Chrome Extension, APIs, and MCP

    Seekrly is designed to fit into the user's existing job-search workflow rather than requiring every interaction to begin in the web dashboard.

    Chrome Extension

    The browser extension helps users capture job opportunities while browsing job sites. This creates an integration boundary between external pages and Seekrly's application data, where input normalization, authentication, and consistent backend rules matter.

    REST API

    An API provides a structured way for supported clients and integrations to interact with Seekrly. Reusing backend services keeps API behavior aligned with the core application instead of creating a separate set of business rules.

    MCP Integration

    Seekrly also supports an MCP integration, enabling compatible AI clients to interact with supported job-search workflows through tools. This introduces additional engineering concerns beyond exposing an endpoint: authentication, authorization scopes, clear tool contracts, and safeguards around operations that modify user data.

    For sensitive or destructive operations, a safer integration should make the requested action and its consequences clear rather than allowing an external agent to silently perform unrestricted changes.

    Security and Data Handling

    A career platform stores information that users expect to remain private, including resumes, employment history, contact information, and application details. Security therefore needs to be part of the architecture, not a final checklist.

  • Authentication and session handling: Use appropriately protected sessions and secure cookie settings.
  • API credentials: Store API keys as hashes where verification is sufficient, rather than retaining their original values.
  • Encrypted secrets: Use authenticated encryption such as AES-256-GCM when a secret must later be recovered for a legitimate operation.
  • Authorization: Apply user-scoped access checks and validate permissions at the relevant service boundaries.
  • AI input handling: Limit input size, treat uploaded and external content as untrusted, and avoid exposing unnecessary personal information to model providers.
  • Data lifecycle: Handle temporary files, deletion, and references to stored files deliberately so data does not remain accessible unintentionally.
  • The goal is to minimize unnecessary exposure while keeping the product useful. In an AI-enabled application, that means thinking about the complete data path: upload, processing, model request, output storage, and eventual deletion.

    Infrastructure and Operations

    I also worked on deploying and operating the application, using Docker-based services and a self-managed cloud environment. The stack includes application services, MongoDB, Redis, and integrations for email delivery and other product workflows.

    Running multiple services introduces operational work that is easy to overlook when building only a local prototype: configuration management, service connectivity, persistent storage, credentials, logs, restarts, and debugging failures across process boundaries.

    I approached infrastructure as part of the product rather than treating deployment as a one-time step. The objective was to make the system understandable and maintainable while keeping the operating setup appropriate for an independently built SaaS.

    Engineering Trade-offs and Lessons

    1. A Monolith Is Not the Enemy; Unclear Boundaries Are

    Splitting every feature into a separate service creates deployment and debugging overhead. The useful separation is where workloads, responsibilities, or failure modes differ. The dedicated AI worker is valuable because AI execution has distinct operational needs, while shared business services reduce unnecessary duplication.

    2. Asynchronous Processing Requires Failure Design

    Moving a task to a queue is only the beginning. You also need to decide how to retry, when to acknowledge work, how to recover abandoned messages, and what to do with permanently failing tasks. These decisions determine whether background processing is dependable.

    3. AI Features Need Software Engineering Around the Model

    The model is one component in a larger system. Input validation, privacy, cost controls, structured output, error handling, and persistence all influence the quality and reliability of an AI feature. A clever prompt cannot replace those engineering controls.

    4. Integrations Multiply the Importance of Consistent Rules

    A web dashboard, browser extension, REST API, and MCP client may all trigger related actions. Centralizing business logic and enforcing authorization consistently makes it easier to add interfaces without weakening the product's security model.

    5. Building the Product Changes How You Think

    Building Seekrly required me to think about more than writing code that works on the happy path. I had to consider service boundaries, failure recovery, data ownership, integration contracts, operational complexity, and the trade-offs between shipping a feature and maintaining it.

    What This Demonstrates About My Backend Engineering

    Seekrly is a practical example of the kind of backend work I want to continue doing: building systems that support real product workflows, separating asynchronous and resource-intensive workloads, designing reusable service layers, integrating AI capabilities, and operating a multi-service application.

  • Backend architecture and service boundaries across a multi-service product.
  • Go-based backend and worker development, with shared business logic across application interfaces.
  • Redis-based asynchronous processing, retries, recovery, and idempotency-oriented workflows.
  • AI integration using a dedicated worker for resume parsing, job fit scoring, interview preparation, and related workflows.
  • API design, browser integrations, and MCP-based tool access.
  • Security-conscious data handling, encrypted secrets, authorization, and operational infrastructure.
  • I am especially interested in backend engineering roles at startups where engineers take ownership of systems end to end: from API contracts and data models to workers, infrastructure, reliability, and production debugging.

    What’s Next

    Building Seekrly has given me hands-on experience taking a product from idea to deployment—from backend architecture and asynchronous workers to AI integrations and infrastructure.

    I'm interested in backend engineering opportunities where I can take ownership of meaningful technical problems, work closely with a small team, and help build products that scale with their users.

    Explore the Engineering Behind Seekrly/project/seekrly(opens in a new tab)

    Try Seekrlyseekrly.com(opens in a new tab)

    Responses

    0 comments

    No responses yet. Be the first to share your thoughts.

    Leave a response

    Tags

    #golang#backend#system-design#microservices#redis#mongodb#ai#llm#python#nextjs#docker#saas#api-design#distributed-systems

    Want to work together?

    Get in touch ↗
    All posts