Back to Portfolio
Engaze

Engaze

Professional networking reimagined

Software Development EngineerDecember 2024 - Present

Professional networking platform for job seekers and recruiters with real-time chat, job listings, and AI-powered matching.

Building a career platform from professional identity to placement.

Engaze connects professional networking, job applications, long-form publishing, and resume creation in one product. The strongest work is in the state transitions between those experiences—not isolated screens.

Professional networking

Discovery, follows, connections, requests, profiles, and conversations

Placement journey

Job discovery, eligibility, applications, interviews, and offers

Markdown editor

A reusable block engine for posts, blogs, chat, and rich content

Resume system

Editable templates, design controls, history, preview, and PDF output

Selected problems, solved end to end.

A focused view of the product problems, system boundaries, and engineering decisions behind the work.

A career platform has to preserve intent across more than a feed. A person can discover another professional, build a credible profile, open a job while signed out, complete missing information, attach a resume, answer screening questions, and return later to an application whose status has changed. Each hand-off crosses identity, relationship state, content, files, and backend policy.

I worked across the Next.js and Flutter clients, Redux state, Express APIs, PostgreSQL models, object storage, and document-generation paths. I focused on making complex journeys continuous: modelling transitions explicitly, recovering interrupted work, reusing content infrastructure, and ensuring what a recruiter receives matches what the candidate created.

Four systems worth explaining.

Each story follows the user journey, its failure modes, and the decisions that made the system dependable.

Networking modelled as relationships—not a follow button.

Problem

Professional networking contains several independent states: following, being followed, sent and received connection requests, accepted connections, recommendations, and removal. Treating them as one boolean creates contradictory actions and stale cards across discovery, profile, and network screens.

Result

People can move predictably from discovery to a professional relationship and then into conversation. Requests, recommendations, follower lists, and accepted connections converge on the same relationship state after every action.

System path

Discover people
Follow or connect
Request lifecycle
Accepted network
Profile or conversation

Engineering decisions

Separate relationship semantics

Follows remain directional, while connections use a two-sided request lifecycle. The UI can therefore present the correct action without collapsing different professional relationships into one state.

Explicit request transitions

Sent, received, viewed, accepted, declined, withdrawn, and removed states are handled deliberately, including moving records between pending and accepted collections.

One coordinated network state

Redux hydrates connections, followers, following, and recommendations together. Mutations update both the canonical lists and any recommendation cards that represent the same person.

Relationships lead somewhere

Network rows connect directly to profiles and conversations, turning discovery into an actionable workflow instead of leaving it as a vanity count.

One application flow that survives every interruption.

Problem

Applying is not a single form submission. Jobs can have eligibility rules, required profile fields and social links, saved or uploaded resumes, screening questions, and authentication gates. Losing this work on a refresh or sign-in redirect breaks the highest-intent journey in the product.

Result

A candidate can move from job discovery through a validated application and continue into queries, interviews, offers, or withdrawal. Drafts and attachments survive normal interruptions without weakening account boundaries or leaving abandoned uploads behind.

System path

Discover a job
Eligibility + profile checks
Resume + screening
Validated application
Interview, offer, or status

Engineering decisions

Policy-aware entry points

Public and institution-linked jobs share the experience while the backend applies the correct employer, student, and placement rules for each job context.

Account-scoped recovery

Seven-day drafts are namespaced per user and job. A short-lived same-tab marker allows a guest draft to continue after sign-in without exposing it to the next account on a shared browser.

Upload only on commitment

Fresh resumes and screening attachments stay in the recoverable draft and upload during submission, avoiding orphaned objects when a candidate abandons the application.

Recruiter-ready artifacts

A selected builder resume is rendered through the same template used by the editor, converted to PDF, and attached to the application alongside screening responses and required profile data.

A custom Markdown editor shared across the product.

Problem

Blogs, posts, comments, job descriptions, and messages need different editing constraints but must render the same stored content consistently. Separate editors would duplicate parsing, keyboard behaviour, uploads, previews, and display logic—and drift over time.

Result

One reusable block engine powers short and long-form experiences while Markdown remains the portable source format. Hosts can choose a compact composer or a full editor without rebuilding the editing model.

System path

Markdown source
Parsed block model
Edit + command layer
Media handling
Consistent renderer

Engineering decisions

Block model over raw contentEditable

Headings, paragraphs, lists, checklists, code, callouts, tables, polls, and media are explicit typed blocks that can be edited independently and converted back to Markdown.

Keyboard-first command system

A searchable slash menu, toolbar actions, shortcuts, selection-aware inline formatting, and predictable block creation keep rich editing fast without hiding the underlying format.

Media as part of the document

Images, video, files, resizing, previews, and upload callbacks use the same block contract. Each host decides whether media appears inline or at the end of a compact composer.

Shared parsing and display

The same parser and display components render feeds, blogs, chat, comments, resumes, classroom posts, and job descriptions, keeping authored and published output aligned.

Resume data, design, and export kept in sync.

Problem

A resume builder has three sources of complexity: structured career data, an editable visual layout, and a PDF that must preserve that layout. Template changes, section reordering, custom styles, and undo operations cannot corrupt the underlying resume or produce a different application artifact.

Result

Candidates can edit a structured resume visually, change its presentation without re-entering content, preview the result, and generate a multi-page PDF from the same rendering system used in the editor and application flow.

System path

Structured resume
Template renderer
Inline editing + layout
Preview
Multi-page PDF

Engineering decisions

Structure separated from presentation

Database-backed headers, sections, and items hold the content, while a React template registry controls its visual rendering. Switching templates changes presentation without rebuilding the resume.

Editing without a second form

Editable templates support inline fields, sortable sections and items, visibility controls, custom sections, and column assignment so the canvas itself becomes the primary editor.

Unified change history

Redux checkpoints track both content and customization through undo and redo, preventing a design change or section move from restoring only half of the resume state.

Export from the real renderer

PDF generation captures the rendered resume at high resolution, filters editor-only controls, and slices long content across pages instead of maintaining a separate approximation of the template.

Tech Stack

Flutter
Flutter
Dart
Dart
Node.js
Node.js
PostgreSQL
PostgreSQL
WebSocket
WebSocket
Stripe
Stripe
Firebase
Firebase

Interested in working together?

I can help take your next digital product from idea to production.

Get in Touch