Douglas Bernstein — Full Stack Engineer
Douglas Bernstein
Full Stack Software Engineer
I'm Douglas- I build performant backends and clean frontends across various industries, including regulated fintech, healthtech, and more. Right now I'm building a wealth platform for individuals and families who don't meet standard financial advisor qualifications, the marketing front door of a healthcare company, and a photo app for med-spas.
This is a selected portfolio of shipped systems I've worked on: regulated fintech at Wing Financial, healthtech at Kodiak Solutions, and SaaS at GlowPro.
Wing Financial
Founding Full Stack Engineer · Jan 2023 – present
Wing Financial is an SEC-registered investment adviser, delivering comprehensive financial advice through partner wealth firms. I joined as the founding full stack engineer in January 2023 and have been maintaining and evolving the platform ever since.
Visit
Apex Clearing Integration
CUSTODIAN INTEGRATION
Wing's investment accounts are held at Apex Clearing, and keeping a person's information matched between the two systems is a critical piece of the platform I constantly maintain and evolve.
Ensuring seamless data synchronization between Wing and Apex Clearing including handling changes in beneficiary information, trusted contact records, and other critical data that must remain consistent across both systems.
Financial Calculators
Wing Financial uses a set of custom financial calculators to provide detailed advice to users. These calculators are self-contained and thoroughly tested to ensure accuracy and reliability.
The calculators cover a wide range of financial topics including retirement planning, debt management, insurance needs, tax calculations, education funding, mortgage affordability, and portfolio construction. Each calculator is designed to provide users with a clear and actionable financial recommendation based on their specific financial situation.
Multi-Tenant Access Control
ACCESS CONTROL SYSTEM
Wing Financial's access control system is designed to ensure that each firm and advisor can only access the data they are authorized to see. This is critical for compliance with regulatory requirements and for maintaining the integrity of the platform.
The access control system is implemented using a combination of role-based access control (RBAC) and organization-based access control (OBAC). Each firm is assigned a unique identifier, and all data is scoped to the firm. Parent firms have access to all data within their organization, including all child firms and their associated advisors and clients. Advisors are assigned to specific firms and can only access data within their assigned firm. Clients are associated with specific advisors and can only access data within their assigned advisor's firm.
Dashboard and Reporting
The dashboard is the main interface for advisors and partner firms to manage their financial accounts and view their financial data.
Advisors and partner firms need to see how their book is doing: assets under management, fees, which relationships are cooling off. The dashboard I architected and built is where they look.
React and TypeScript on top of the same access rules that guard the rest of the platform, so a firm only ever charts its own book. Fee and AUM charts, a US map of where members live, CSV and PDF export, an editable admin screen, and a renderer that lets the backend describe a whole page as data and have the dashboard draw it, so a new report ships without a frontend release.
Data Layer Migration in the Dashboard
DATA LAYER
The data layer was migrated to a more modern architecture using TanStack Query, which provides a unified API for fetching, caching, and updating data across the application.
data layer before → after
fetching useEffect TanStack
+ context Query
hooks 18 hand- 1 shared
written factory
internal API 13 routes none
caching ad-hoc one policy
net result more code less code
Forms System
FORM PACKAGE
Wing's questionnaires decide what to ask you next based on what you've already said. That logic lived in two places, backend and frontend, and two copies of the same rule eventually disagree. A package I built puts it in one: a question registry, a single canonical evaluate(), and a completion counter that returns the same answer on both sides of the wire.
one evaluator — any change to how
evaluate() behaves is a major version
definitions are data — forms compile to
content-hashed JSON bundles
purity enforced by the linter; Zod only
tests: property-based (fast-check),
golden snapshots, semantics suite
ships dual ESM/CJS, with publint and
arethetypeswrong gating releases
Email Pipeline
SERVERLESS PIPELINE
The email pipeline I built is a serverless system that is responsible for sending emails to users. It is built using AWS Lambda and AWS Simple Email Service (SES). The pipeline is designed to be scalable and reliable, and it is also designed to be secure and compliant with regulatory requirements. It includes features such as email templating, encryption of personal data, and a queue system for sending emails.
wing-api ─► SQS ─► Lambda ─► SES
│
├ react-email templates
│
└ AES-256-CTR on anything
personal riding through
Kodiak Solutions
Full Stack Engineer · June 2024 – present
Kodiak Solutions is a healthcare analytics company that provides financial and operational insights to hospital finance teams. The platform covers more than 2,300 U.S. hospitals and 375,000 practice-based physicians.
I joined Kodiak Solutions in June 2024 as a contracted full stack engineer and built (and continue to maintain) the marketing website and other systems that power the company's sales and marketing efforts.
Visit
kodiaksolutions.io
Next.js 16 · Prismic · Azure
I built the site from scratch on Next.js 16, with Prismic behind it so marketing can ship pages without waiting on me, and Azure Static Web Apps serving the result as static files. Since launch I've kept adding to it: a custom search engine, embedded Power BI dashboards, and Salesforce capture on the forms that feed the sales team.
Next.js 16 · Prismic · Azure
│
├ React
│
└ TypeScript
Search Engine Indexing
CUSTOM SEARCH ENGINE
GitHub Action
├► Playwright crawler
│ breadth-first, same-origin only
│ limited concurrency, retry+backoff
│ URL normalization · 500-page cap
└► Prismic indexer
insights · reports · news
webinars · bios
└► two JSON indexes, merged and
searched with Fuse.js
The site is built and deployed as static files, so there's no server waiting to answer a search. The index has to exist before anyone types. A scheduled job crawls the live site and indexes the pages into a JSON index which is then merged with a second indexer that pulls content from the CMS. The result is a single index that can be searched with Fuse.js providing a fast and accurate search experience.
Embedded Dashboards
POWER BI ANALYTICS
Kodiak's clients can see live metrics on the site after registering an email using Salesforce CRM. Those dashboards are Power BI, and the token that unlocks them is minted on the server with service credentials, so no Azure identity ever reaches the browser.
The resulting user experience is a seamless integration of Power BI dashboards into the website, allowing clients to view their data without ever leaving the site.
Chroma Image Generator and Filter
IMAGE GENERATION SYSTEM
Kodiak's marketing team needed images that stay on brand. Chroma started as a side project to build an image filter allowing me to quickly tweak images to stay on brand. The designer and I wanted the team to have easy access to a similar tool that could generate images that suited their brand and have it ready to use. I built both halves from scratch and put them behind one internal login.
Variety was the problem. Left alone it drifts, so it samples from pools of terrain, lighting, and framing so no two images come out the same, and it refuses a prompt before calling any model at all if it's heading somewhere the brand guidelines don't go. This internal tool gives the marketing team a way to generate images that look like Kodiak without having to rely on stock photography or generic AI output.
POST /api/generate
signed in?
└► input validated
└► off-brand words refused here,
before any model is called
└► prompt assembled from the
brand guide + variant pools
└► Imagen 4 or DALL·E 3
└► resized to exact ad
dimensions, as WebP
GlowPro
Full Stack Engineer · Oct 2025 – present
Injectors and med-spa staff take before-and-after photos all day, and those photos are how they show their work and close packages. GlowPro is the iOS app for that: a camera with professional overlays, sessions filed by client automatically, and an encrypted vault so the whole thing stays HIPAA-compliant.
I joined GlowPro in October 2025 as a full stack engineer and built the the marketing website, client portal and contribute to the backend as new features are needed.
Visit
Client Portal
SUBSCRIPTION MANAGEMENT SYSTEM
The client portal is a web application that allows clients to manage their subscriptions, view their photos, and get important metrics on their progress.
It reuses the component library and tokens from the marketing site, so a brand change lands in both at once. The rest is keeping the paths short: check a charge, add someone to the plan, pull up a client's before-and-afters without hunting for them.
Branding and Design System
COMPONENTS · MOTION
The site's look comes out of a component library I built on class-variance-authority, driven by CSS custom properties, so the entire brand moves from one file.
The motion is the motion/react library plus the motion-primitives kit: morphing dialogs, infinite sliders, tilt and glow. By building a design system and component library, I was able to create a consistent and visually appealing user experience across the entire GlowPro platform.
Email System
EMAIL TEMPLATES
In the backend I built a email system that allows the team to send emails to clients as well as event triggered emails to clients and staff. The templates are React components on a small shared library of a button, a hero, a layout, and a step card, with sending kept separate from templating, so a copy change can't put delivery at risk.