- January 2024 - present · Next.js, TypeScript, Tailwind CSS, Convex & Vercel · featured · Active
SGMC Health Internal Medicine Residency newsletter**Status:** Active**Timeline:** January 2024 - present**Visit site:** [azaleareport.com](https://azaleareport.com)**Technologies:** Next.js, TypeScript, Tailwind CSS, Convex & Vercel---The Azalea Report is the official newsletter of the SGMC Health Internal Medicine Residency program. I built it as a web app so residency news, academic updates, and community highlights all live in one place instead of getting buried in email threads.The goal was straightforward: give the program a professional way to share accomplishments, upcoming events, and educational content with residents, faculty, and staff, and make it easy to keep current.## ArchitectureIt's a TypeScript monorepo run with Turborepo. Inside are two Next.js 14 apps and a handful of shared packages: the public newsletter site (`@azalea/web`), a content-management dashboard (`@azalea/admin`), a shared UI library (`@azalea/ui`), shared types and utilities (`@azalea/shared`), and a set of reusable content blocks (`@azalea/sections`).The backend runs on Convex, a serverless platform with a real-time cloud database. It holds issues, sections, media, users, birthdays, and editing locks so two editors don't clobber each other's work. The frontend deploys to Vercel with continuous deployment, the backend lives on Convex Cloud, and a few custom scripts handle production deploys and storage migrations.## The admin dashboardMost of the work went into the CMS. Editors create, edit, publish, and archive issues, and build each one from 18+ section types like spotlight, chief's corner, events, carousel, podcast, and birthdays. Rich text editing uses Tiptap, sections reorder with drag-and-drop via dnd-kit, and images come in through a media library built on react-dropzone. There's sign-in, concurrent-editing locks, a stats overview for issues and drafts, and a light or dark toggle.## Styling and integrationsStyling is Tailwind CSS 3.4 with the typography and forms plugins, a custom Azalea palette (green `#016f53`, peach `#FFE6D6`), and Montserrat paired with Georgia. Convex drives all the real-time queries and mutations. An OG image proxy route keeps links previewing correctly in WhatsApp and other apps, and anything user-facing is run through sanitize-html and DOMPurify to keep XSS out.
- 2024 - present · React, TypeScript, Netlify · featured · Active
Searchable clinical resource hub for internal medicine residents**Status:** Active**Timeline:** 2024 - present**Visit site:** [sgmc-resident-guide.netlify.app](https://sgmc-resident-guide.netlify.app)**Technologies:** React, TypeScript, Netlify---The Resident Guide is a single place for SGMC Health internal medicine residents and interns to find what they need on shift: clinical references, ward notes, specialty guidelines, and on-call resources, all searchable.During residency the useful stuff tends to scatter across emails, paper handoffs, and shared drives, and none of it is searchable when you actually need it. This pulls the most-used resources into one fast page that works well on a phone at the bedside.What's in it:- A searchable library of clinical resources by specialty (cardiology, pulmonology, infectious disease, nephrology, and more)
- Sections for rotations, committees, policies, didactics, and on-call guidance
- Documentation templates and quick references
- A clean, distraction-free reading view
- 2026 - present · HTML, JavaScript, Tailwind CSS, PWA & Netlify · clinical · Active
Albumin dosing and Epic order builder for large-volume paracentesis**Status:** Active**Timeline:** 2026 - present**Visit site:** [albumincalculator.netlify.app](https://albumincalculator.netlify.app)**Technologies:** HTML, JavaScript, Tailwind CSS, PWA & Netlify---This calculator works out how much albumin to give after a large-volume paracentesis and builds the full Epic order to match. You enter the liters removed; it returns the dose, rounds it to whole 25 g bottles, works out the volume and rate, and tells you whether albumin is even indicated.The math is simple, 8 grams per liter removed, but the order around it is fiddly: rounding to bottles, a volume that changes with the product, a rate that has to match the duration, and an Epic order set with dozens of fields for what is really a single one-time dose. The tool keeps those small decisions in one place so they aren't carried in your head at the bedside.A few things it does:- Doses at 8 g per liter removed, rounded to whole 25 g bottles, with the raw and rounded amounts shown side by side
- Flags when albumin isn't needed (5 L or less), when it's indicated regardless of volume (ACLF), and when a session goes past 8 L
- Links volume, rate, and duration so setting any one fills in the rest, for both 25% and 5% albumin
- Builds a complete, copyable Epic order with frequency preset to Once
- Installs to a home screen, works offline, and has light and dark modeIt's a single HTML file with vanilla JavaScript and Tailwind CSS, shipped as a progressive web app on Netlify. It's a clinical decision support tool, meant to back up clinical judgment, not replace it.
- 2026 - present · Next.js, Tailwind CSS, PWA & Netlify · clinical · Active
Examiner-style ABIM board-prep flashcards**Status:** Active**Timeline:** 2026 - present**Visit site:** [decklabs.netlify.app](https://decklabs.netlify.app)**Technologies:** Next.js, Tailwind CSS, PWA & Netlify---DeckLabs is a private study app I built for ABIM board prep. It takes dense review decks and turns them into clean, examiner-style flashcards. The front of each card is a real exam-style question and the back is a focused explanation. You log in, study by subject, flip through cards, rate how well you knew each one, and the app remembers where you left off so you can pick back up later.The idea came from how I actually study. Long review documents are thorough but hard to drill from. Rewriting that material into one question per card, phrased the way the exam asks it, turns each card into a quick self-test instead of a wall of text to reread. Right now there are around 10,900 cards organized by subject, so I can work through one area at a time.A few things it does:- Examiner-style cards, with a real question on the front and the explanation on the back
- Cards grouped by subject so each study session stays focused
- A quick rating on every card to flag what needs another pass
- Saved progress that picks up exactly where you left off
- Private, members-only access behind a login
- Installs to a home screen and runs without a reliable connectionOn the build side, it is a Next.js app on the App Router, styled with Tailwind CSS in a bold, high-contrast look. It ships as a progressive web app with a web manifest and offline support, and it deploys on Netlify.
- 2026 - present · React, Vite, PWA & Netlify · clinical · Active
Empiric antibiotic guidance from clinical guidelines and a local antibiogram**Status:** Active**Timeline:** 2026 - present**Visit site:** [abxadvisor.netlify.app](https://abxadvisor.netlify.app)**Technologies:** React, Vite, PWA & Netlify---Abx Advisor helps you pick empiric antibiotics. You give it the infection syndrome and a few patient details, point it at your hospital's antibiogram, and it returns a ranked set of regimens with first-line and alternative options. The recommendations follow Sanford Guide, IDSA, and OpenEvidence. It installs as a progressive web app, so it works on a phone at the bedside even without a solid connection.Empiric coverage is a lot to hold in your head at once. You're weighing the likely bugs for the site of infection against local resistance, the patient's allergies, and their renal function, usually while the clock is running. The app keeps that reasoning in one flow so you can start something defensible and narrow it down once cultures are back.You start by choosing the infection site: skin and soft tissue, respiratory, ENT, genitourinary, intra-abdominal, bloodstream, pelvic, tick-borne, and more. Then you add context like a penicillin or beta-lactam allergy, MRSA or Pseudomonas risk, and whether you want oral or IV.A few things it does that I find useful:- Tunes coverage to your own antibiogram (E. coli, Klebsiella, Pseudomonas, MRSA and MSSA, S. pneumoniae, Enterococcus, and others)
- Drops beta-lactams and offers safe alternatives when there's a penicillin allergy
- Adjusts doses for creatinine clearance
- Groups options by drug class, including antifungal, antiviral, and antiparasitic agents
- Installs to a home screen and runs without a reliable connection
- Stays clearly educational, meant to back up clinical judgment rather than replace it
- 2024 - present · React, TypeScript, Netlify · clinical · Active
Estimates 90-day heart failure hospitalization and death risk at discharge**Status:** Active**Timeline:** 2024 - present**Visit site:** [ahf-predischarge-risk-calculator.netlify.app](https://ahf-predischarge-risk-calculator.netlify.app)**Technologies:** React, TypeScript, Netlify---This calculator estimates the chance of heart failure hospitalization or death within 90 days of discharge. It runs on four inputs and is meant to be quick enough to use on rounds.Readmissions after an acute heart failure stay are stubborn, and a lot rides on the discharge decision. A fast risk estimate helps with the call on disposition, how closely to follow up, and whether someone needs more optimization before they leave.It asks for four things: NT-proBNP, systolic blood pressure, left atrial volume index, and lung ultrasound B-lines. From those it places the patient on a 0 to 4 risk scale with plain-language guidance. You can expand any parameter to see what it means, which is handy for teaching, and copy a short summary straight into your note. The layout is built for a phone.
- 2024 - present · React, Vite, Netlify · clinical · Active
Patient-controlled analgesia dose calculator**Status:** Active**Timeline:** 2024 - present**Visit site:** [pcacalc.netlify.app](https://pcacalc.netlify.app)**Technologies:** React, Vite, Netlify---A dosing calculator for patient-controlled analgesia pumps. It helps inpatient teams set the infusion, demand dose, and lockout consistently instead of redoing the arithmetic by hand each time.PCA orders involve a handful of interlocking numbers (basal rate, demand dose, lockout interval, hourly limit), and they're easy to get wrong when you're busy. The tool does the math and shows sensible ranges for the common agents.It has agent-specific flows, calculates the basal, demand dose, lockout, and both the 1-hour and 4-hour limits, starts from conservative defaults with guidance inline, and works on a phone for on-call use.
- 2024 - present · React, Netlify · clinical · Active
Discharge planning tool for hospitalized patients**Status:** Active**Timeline:** 2024 - present**Visit site:** [dcplanner.netlify.app](https://dcplanner.netlify.app)**Technologies:** React, Netlify---DCPlanner helps internal medicine teams keep track of everything a hospital discharge involves: medications, follow-up, equipment, transportation, and patient education.A good discharge prevents readmissions, but it means coordinating a long checklist across nursing, case management, pharmacy, and outpatient clinics. This keeps that checklist in one place so the team can see what's still outstanding.The checklist is grouped by domain (meds, follow-up, equipment, education), items toggle on and off with a clear visual state, and you can copy a handoff summary to paste elsewhere. It's built to use on rounds from a phone.
- 2026 - present · SvelteKit, Tailwind CSS & Netlify · clinical · Active
Equity-focused advance care planning support for African-American patients**Status:** Active**Timeline:** 2026 - present**Visit site:** [acperitool.netlify.app](https://acperitool.netlify.app)**Technologies:** SvelteKit, Tailwind CSS & Netlify---The ACP-Equity Risk Index is a clinical decision support tool for advance care planning, built around a problem that is well documented but rarely tooled for. African-American patients complete advance care plans at much lower rates, and the reasons usually come down to trust, communication, and culture rather than the medicine itself.At the bedside you work through a checklist, ticking the barriers that apply to the patient. The tool scores them into a composite risk index, surfaces the barrier domains that are driving it, and then generates tailored intervention recommendations with conversation guidance you can use in the room.The barriers are grouped into domains such as medical trust (say, a patient who voices distrust of providers or the health system), health literacy, religious and spiritual values, family dynamics, and language and communication. Each domain carries its own weight, so the result points you at what matters most for this particular person instead of a flat checklist.The intervention side is where the AI augmentation comes in. Based on the dominant domains, it suggests concrete next steps like bringing in palliative care, involving a faith community leader, switching to language-concordant materials, or adjusting the pace and framing of the conversation, each tied to evidence on what actually moves ACP completion in this population.I built it in SvelteKit with Tailwind and put it on Netlify. It is a decision aid, not a substitute for knowing your patient.
- 2024 - present · React, Netlify · clinical · Active
Internal medicine clinical knowledge quiz game**Status:** Active**Timeline:** 2024 - present**Visit site:** [ddilemma.netlify.app](https://ddilemma.netlify.app)**Technologies:** React, Netlify---A quiz game modeled on the American College of Physicians' Doctor's Dilemma competition. I built it so residents can practice rapid-recall trivia across specialties in the same game-show format.Doctor's Dilemma is a long-running ACP tradition where residency teams go head to head on medical trivia. Between the live events there's nowhere to rehearse, so this gives residents a way to drill, solo or in teams, with questions spanning the IM subspecialties.It runs on a buzzer-style flow, tracks scores, and supports both team and solo play. The question bank covers cardiology, pulmonology, infectious disease, nephrology, GI, endocrine, rheumatology, and more, and the whole thing is mobile-friendly.
- 2024 - present · React, Netlify · clinical · Active
Clinical note formatting and cleanup tool**Status:** Active**Timeline:** 2024 - present**Visit site:** [noteclean.netlify.app](https://noteclean.netlify.app)**Technologies:** React, Netlify---NoteClean tidies up messy clinical text. Paste in copy-pasted EHR output and it strips the artifacts, fixes spacing, normalizes section headers, and hands back something clean enough to paste straight back into the chart.Notes pulled out of an EHR usually arrive full of navigation junk, duplicate headers, ragged line breaks, and odd capitalization. Fixing all that by hand is slow and easy to botch, so NoteClean does the pass for you.It works paste-in, clean-out. It removes boilerplate header and footer text, normalizes whitespace and casing, and leaves the real structure (assessment, plan, problem list) intact. Everything runs in the browser, so no PHI ever leaves your machine.
- 2025 - present · React, Firebase, EmailJS, Netlify · developer · Active
Subspecialty lecture booking system for IM residency didactics**Status:** Active**Timeline:** 2025 - present**Visit site:** [didactics-scheduler.netlify.app](https://didactics-scheduler.netlify.app)**Technologies:** React, Firebase, EmailJS, Netlify---A scheduling app for booking subspecialty lectures for the SGMC Health Internal Medicine Residency program's 2026 to 2027 academic year. It replaced the old email-and-spreadsheet routine.Lining up didactic talks across subspecialists, residents, and chiefs is a recurring headache. The app shows which slots are open, takes a booking with the topic and format (virtual or in person), and emails the administrator, which turns a multi-day email chain into a couple of clicks.Under the hood it's a React single-page app on Netlify. Firebase holds the slot availability and booking state, and EmailJS sends the confirmations and admin alerts. The booking UI is public, while edits after a booking go through the administrator.The main pieces are a calendar of open and booked slots, a booking form that captures name, email, topic, and format, virtual or in-person selection, automatic confirmation emails, and a contact path for changes. It's mobile-friendly.
- 2024 - present · React, Netlify · developer · Active
Searchable repository of Epic EHR dot phrases and templates**Status:** Active**Timeline:** 2024 - present**Visit site:** [dotphrasesearch.netlify.app](https://dotphrasesearch.netlify.app)**Technologies:** React, Netlify---A searchable catalog of Epic dot phrases and note templates. The idea is to find the right shortcut for a situation without scrolling through a wall of cryptic trigger names.Dot phrases are one of the better productivity wins in Epic, but institutional libraries grow into hundreds of entries with names nobody remembers. This indexes them by what they actually contain and what they're for, so you can search by intent rather than by trigger.You get full-text search across both the names and the expanded content, a preview of what each template expands to, one-click copy of the trigger, and tags by specialty and note type. It works on a phone.
- 2024 - present · React, PDF.js, Netlify · developer · Active
PDF viewer and presentation tool with file management**Status:** Active**Timeline:** 2024 - present**Visit site:** [pdfpresent.netlify.app](https://pdfpresent.netlify.app)**Technologies:** React, PDF.js, Netlify---A browser-based PDF viewer and presentation tool with sign-in and file selection. I made it to present slides and documents in a clean, fullscreen view without installing a separate viewer or slide app.Lecture slides, journal-club PDFs, and grand-rounds decks often need a presentation-grade viewer: fullscreen, simple controls, and reliable on whatever device is in the room. PDFPresent does that with nothing to install.It gives you presentation controls for viewing, file selection and management, and authentication for private documents. Rendering runs on PDF.js, and because it all happens in the browser it works on anything with a browser.
- January 2022 - present · Next.js 12, React 17, TypeScript, Styled-Components & Netlify · platform · Active
Personal website**Status:** Active**Timeline:** January 2022 - present**Visit site:** [samueledusa.com](https://www.samueledusa.com)**Technologies:** Next.js 12, React 17, TypeScript, Styled-Components & Netlify---My personal website and portfolio. It's where my medical career and my software work sit side by side, as a running resume, a blog, and a place to show projects.I'm a physician who also builds software, and I wanted one site that could hold both halves of that without picking a side. This is it.## How it's builtIt's a Next.js 12 app that statically generates its pages, so it's fast and cheap to host. Pages live under `src/pages/` (medicine, software, blog, presentations, projects, contact), reusable components under `src/components/`, blog posts as Markdown with YAML front matter under `src/posts/`, and nearly all of the resume and project content sits in a single `siteconfig.json` so I can change content without touching components.The frontend is React 17 with TypeScript and Styled-Components for theming, using next/image for images and react-icons for icons. Posts are parsed with gray-matter, rendered with react-markdown plus rehype-raw, and code blocks are highlighted with react-syntax-highlighter in a custom dark theme. Reading time comes from the reading-time library, and the RSS feed is generated with Feed.## Look and extrasThere's a full light and dark mode that remembers your choice. Light is a warm cream (`#fff1e5`), dark is near-black (`#111`), and the accent is a tropical-rainforest teal (`#0a5e66`). Type is Lora for titles, Lato for body, and Yellowtail for the script header.A few things beyond the basics: a built-in PDF viewer (via `@react-pdf-viewer`) for slides and certificates, a set of Netlify serverless functions that push messages and files to Telegram, PWA support through next-pwa, and privacy-friendly analytics with next-plausible. It deploys to Netlify from Bitbucket and exports statically for the CDN, and the only server-side bits are those Telegram functions.
- November 2021 - present · StencilJS 2.14, Ionic Core 6, TypeScript, Markdown, Netlify & Bitbucket · platform · Active
Official website of Samalla Clinic Ltd.**Status:** Active**Timeline:** November 2021 - present**Visit site:** [samallaclinicltd.com](https://www.samallaclinicltd.com)**Technologies:** StencilJS 2.14, Ionic Core 6, TypeScript, Markdown, Netlify & Bitbucket---The official site for Samalla Clinic Ltd., a healthcare facility in New Gbawe, Accra, Ghana. It covers the clinic's services, staff, health blog, and contact details for patients and visitors.The clinic wanted a proper presence online: somewhere patients could see what services are offered, check operating hours, read health articles, and find out how to get in touch. The blog side carries pieces on hypertension, diabetes, malaria, and other common concerns.## The stackIt's built with StencilJS 2.14 and Ionic Core 6, which compile down to standard Web Components, so it loads fast and runs about anywhere. TypeScript handles type safety and stencil-router-v2 does the routing. Blog posts are written in Markdown and rendered with the marked library.There's no database and no admin panel. Content lives in static TypeScript data files and Markdown, and updates happen in code and get redeployed from Bitbucket. Hosting is Netlify, including a small serverless function (getArticles.js) for the markdown. Contact-form submissions go to the clinic's Telegram channel through the Telegram Bot API, and Tawk.to provides live chat. Styling is hand-rolled CSS with variables, Playfair Display and Open Sans, and Ionic's utilities, with no external CSS framework. It's set up as a PWA with a manifest and icons, with the service worker turned off.## On the site- A services listing (OPD, in-patient care, ultrasound, laboratory, family planning, nutrition counseling, oncology)
- A Markdown-powered health blog
- Staff profiles and a Board of Directors section with resumes
- A contact form with validation and Telegram notifications
- The Tawk.to live-chat widget
- Location and contact details with a Google Maps link
- History and mission and vision pages
- A mobile-first layout with breakpoints at 480, 768, 1024, and 1200px
- September 2020 - present · StencilJS 2.14, Ionic Core 6, TypeScript, Telegram Bot API & Netlify · platform · Active
Private beach house at Prampram, Ghana**Status:** Active**Timeline:** September 2020 - present**Visit site:** [samallabeachhouse.com](https://www.samallabeachhouse.com)**Technologies:** StencilJS 2.14, Ionic Core 6, TypeScript, Telegram Bot API & Netlify---A site for a beachfront rental in Prampram, Ghana. It shows the property off with photos and gives guests what they need to book a coastal stay.The Samalla Beach House needed a presence online to bring in visitors and lay out the property, the amenities, and how to reserve a stay on the coast.## Under the hoodThe site is built with StencilJS 2.14, which compiles reusable UI into Web Components, paired with Ionic Core 6 for the mobile-friendly pieces like slides, modals, and icons. It's TypeScript with TSX templates, routed by stencil-router-v2, and built and prerendered through the Stencil CLI. Stencil's Jest-based spec and e2e runners cover the tests. The output is a static site that drops onto Netlify or any static host. The whole thing comes to about 15 custom Web Components (hero, gallery, amenities, rooms, location, contact modal, and the rest).There's no database. Reservation forms post straight to a private Telegram channel through the Telegram Bot API, which doubles as a lightweight booking dashboard. Guests can also reach out over WhatsApp, Instagram, Facebook, Twitter, or email, and an embedded Google Map shows where the house is.## What's on it- A photo gallery with a swipeable slider and navigation controls
- A reservation form wired to Telegram notifications, so bookings land in real time
- Sleeping arrangements (two bedrooms with queen beds and one sofa bed)
- 17 amenities, including a kitchen, A/C, beachfront access, and free parking
- An embedded Google Map with directions
- A house-rules section
- Contact options across WhatsApp, email, phone, and social media
- Fast-loading Web Components with optional prerendering
- January 2020 - present · Ionic, Bitbucket & Netlify. · platform · Active
Samalla Clinic Ltd. billing applicationA billing and invoicing app I built for Samalla Clinic Ltd. to handle patient billing, generate invoices, and track payments.The clinic wanted to get off paper and run its billing in one place. The app takes the whole flow, from registering a patient through generating an invoice and recording the payment.It's built with Ionic, so the same app works on desktop and mobile, and it's deployed on Netlify with the code kept in Bitbucket. It covers patient billing, invoice generation, and payment tracking, and being cloud-hosted it's reachable from any device.