| 1 | export type ProjectSlug = |
| 2 | | "voice-learn" |
| 3 | | "cortex" |
| 4 | | "frameground" |
| 5 | | "aero" |
| 6 | | "voto" |
| 7 | | "saturn" |
| 8 | |
| 9 | export interface Project |
| 10 | name: string; |
| 11 | slug: ProjectSlug |
| 12 | image: { |
| 13 | url: string |
| 14 | alt: string |
| 15 | width: number |
| 16 | height: number |
| 17 | source?: string |
| 18 | }; |
| 19 | urls: { |
| 20 | githubUrl?: string |
| 21 | liveUrl?: string |
| 22 | [key: |
| 23 | }; |
| 24 | tags: string[] |
| 25 | } |
| 26 | |
| 27 | export const Projects = |
| 28 | { |
| 29 | name: "Saturn", |
| 30 | slug: "saturn", |
| 31 | image: { |
| 32 | url: "https://saturn.procrastinator.fyi/api/og?page=Saturn", |
| 33 | width: 1200, |
| 34 | height: 630, |
| 35 | alt: "Saturn", |
| 36 | }, |
| 37 | urls: { |
| 38 | liveUrl: "https://saturn.procrastinator.fyi", |
| 39 | githubUrl: "https://github.com/phantomknight287/saturn", |
| 40 | }, |
| 41 | tags: [ |
| 42 | "Next.js", |
| 43 | "Typescript", |
| 44 | "Drizzle", |
| 45 | "PostgreSQL", |
| 46 | "Better Auth", |
| 47 | "Polar", |
| 48 | "Tailwind CSS", |
| 49 | ], |
| 50 | }, |
| 51 | { |
| 52 | name: "Cortex Chat", |
| 53 | slug: "cortex", |
| 54 | image: { |
| 55 | url: "https://cortex.procrastinator.fyi/logo.png", |
| 56 | alt: "Cortex Chat", |
| 57 | height: 100, |
| 58 | width: 100, |
| 59 | }, |
| 60 | tags: [ |
| 61 | "Flutter", |
| 62 | "OpenRouter", |
| 63 | "Hono", |
| 64 | "Postgres", |
| 65 | "Better Auth", |
| 66 | "Prisma", |
| 67 | ], |
| 68 | urls: { liveUrl: " |
| 69 | }, |
| 70 | { |
| 71 | name: "Voice Learn", |
| 72 | slug: "voice-learn", |
| 73 | image: { |
| 74 | url: "https://voicelearn.procrastinator.fyi/logo.png", |
| 75 | alt: "Voice Learn", |
| 76 | height: 381, |
| 77 | width: 495, |
| 78 | }, |
| 79 | tags: [ |
| 80 | "Flutter", |
| 81 | "Nest.js", |
| 82 | "Postgres", |
| 83 | "Prisma", |
| 84 | "Socket.io", |
| 85 | "LLM", |
| 86 | "Gemini", |
| 87 | "OpenAI", |
| 88 | "XILabs", |
| 89 | "Next.js", |
| 90 | ], |
| 91 | urls: { |
| 92 | liveUrl: "https://voicelearn.procrastinator.fyi", |
| 93 | }, |
| 94 | }, |
| 95 | { |
| 96 | name: "FrameGround", |
| 97 | slug: "frameground", |
| 98 | image: { |
| 99 | url: "/frameground.png", |
| 100 | width: 1418, |
| 101 | height: 414, |
| 102 | alt: "Frameground", |
| 103 | }, |
| 104 | urls: { |
| 105 | githubUrl: "https://github.com/phantomknight287/frameground", |
| 106 | liveUrl: "https://frameground-web.vercel.app", |
| 107 | }, |
| 108 | tags: ["Next.js", |
| 109 | }, |
| 110 | { |
| 111 | name: "Aero", |
| 112 | slug: "aero", |
| 113 | image: { |
| 114 | url: "https://raw.githubusercontent.com/PhantomKnight287/aero/refs/heads/main/landing/public/features/og.png", |
| 115 | width: 1274, |
| 116 | height: 956, |
| 117 | alt: "Aero", |
| 118 | }, |
| 119 | urls: { |
| 120 | liveUrl: "https://aero.procrastinator.fyi", |
| 121 | githubUrl: "https://github.com/phantomknight287/aero", |
| 122 | }, |
| 123 | tags: ["Flutter", |
| 124 | }, |
| 125 | { |
| 126 | name: "Voto", |
| 127 | slug: "voto", |
| 128 | urls: { |
| 129 | liveUrl: "https://voto.com.ng", |
| 130 | }, |
| 131 | image: { |
| 132 | url: "/voto.png", |
| 133 | width: 417, |
| 134 | height: 234, |
| 135 | alt: "Voto", |
| 136 | }, |
| 137 | tags: [ |
| 138 | "Next.js", |
| 139 | "Express", |
| 140 | "Typescript", |
| 141 | "Cloudinary", |
| 142 | "PostgreSQL", |
| 143 | "Prisma", |
| 144 | "Socket.io", |
| 145 | "Tailwind CSS", |
| 146 | "Mantine", |
| 147 | "Chart.js", |
| 148 | ], |
| 149 | }, |
| 150 | |
| 151 | ] as Project[] |
| 152 | |
| 153 | export interface Experience |
| 154 | role: string; |
| 155 | company: string; |
| 156 | url?: string |
| 157 | /** "2024-01" or "2024-01-15" */ |
| 158 | start: string; |
| 159 | /** omit for current role */ |
| 160 | end?: string |
| 161 | /** one bullet per line, shown when the entry is expanded */ |
| 162 | points: string[] |
| 163 | tags: string[] |
| 164 | } |
| 165 | |
| 166 | export const Experiences: |
| 167 | { |
| 168 | role: "Full Stack Developer", |
| 169 | company: "Ideanomic", |
| 170 | url: "https://ideanomic.com", |
| 171 | start: "2023-10", |
| 172 | points: [ |
| 173 | "Own projects end to end across several client engagements at a time, from API design through the frontend to deployment.", |
| 174 | "Built a job platform on Next.js, Nest.js, Prisma and PostgreSQL with separate employer and candidate journeys, supporting full-time, milestone-based and hourly hiring.", |
| 175 | "Automated onboarding and payroll syncing through a Dayforce and Famly integration, taking a sync that ran for 13 hours down to roughly 1.", |
| 176 | "Designed an IFS Cloud ERP integration around a declarative endpoint config, so new sync endpoints are added without writing code.", |
| 177 | "Replaced a manual audit with a reconciliation tool that diffs records across two IFS versions and repairs the mismatches it finds.", |
| 178 | ], |
| 179 | tags: [ |
| 180 | "Next.js", |
| 181 | "Nest.js", |
| 182 | "TypeScript", |
| 183 | "Prisma", |
| 184 | "PostgreSQL", |
| 185 | "Dayforce", |
| 186 | "IFS Cloud", |
| 187 | ], |
| 188 | }, |
| 189 | { |
| 190 | role: "Full Stack Developer", |
| 191 | company: "WLBS", |
| 192 | url: "https://wlbs.dev", |
| 193 | start: "2024-04", |
| 194 | end: "2025-11", |
| 195 | points: [ |
| 196 | "Worked across the agency's product portfolio, shipping most of my work on Karm, Godaam and the Vogueshots CRM, from database schema to deployment.", |
| 197 | "Karm, an HR platform on Remix, Prisma and PostgreSQL: built fortnightly payroll with TDS and payslips, attendance corrections, leave and break balances, task carry-forward cronjobs, Google auth, web push and SSE notifications.", |
| 198 | "Cut Karm's page loads by moving heavy routes to Remix defer, adding server-timing instrumentation, real skeletons and nuqs-backed URL state, and moved avatar processing to sharp with background removal through Replicate.", |
| 199 | "Godaam, a cold-storage monitoring product on the T3 turbo stack with a Next.js dashboard: added warehouse, stack and device management, bulk CSV device import, corporation-admin roles and permissions, and reworked group alerting.", |
| 200 | "Built the sensor pipeline behind it: a Hono service that polls devices on a cron, filters readings against per-device thresholds into PostgreSQL, and an AWS Lambda that serves time-bucketed aggregates from a DynamoDB table of raw readings.", |
| 201 | "Vogueshots wedding CRM: guest and template management with OCR-assisted card parsing, invitation and RSVP flows over the Interakt WhatsApp API, scheduled reminder cronjobs, S3 attachments and a planner analytics dashboard.", |
| 202 | "Put the guardrails in on Godaam: turned off the build's lint and type-error suppression, cleared the backlog of errors across every package, and added lint and typecheck GitHub Actions so they stayed at zero.", |
| 203 | ], |
| 204 | tags: [ |
| 205 | "Remix", |
| 206 | "Next.js", |
| 207 | "tRPC", |
| 208 | "Prisma", |
| 209 | "PostgreSQL", |
| 210 | "Redis", |
| 211 | "Hono", |
| 212 | "AWS", |
| 213 | "Docker", |
| 214 | ], |
| 215 | }, |
| 216 | { |
| 217 | role: "Full Stack Intern", |
| 218 | company: "Giga Growth Ventures", |
| 219 | url: "https://gigagrowthventures.com/", |
| 220 | start: "2023-08", |
| 221 | end: "2023-10", |
| 222 | points: [ |
| 223 | "Built Growth Grid, a communication platform where startups and investors keep profiles, connect and share updates, in a Turborepo monorepo: Next.js frontend, Nest.js API, Prisma and PostgreSQL.", |
| 224 | "Shipped the flagship email-threaded comments feature: being tagged in a thread mails you the whole discussion, and replying to that mail posts your reply straight back into the thread, no login needed.", |
| 225 | "Matched inbound replies to their thread by hiding the thread metadata in the outgoing email body and parsing it back out in the Mailgun route webhook, then stripping quoted history from the reply.", |
| 226 | "Kept tag notifications from turning into spam with a per-user hourly cooldown and a six-hourly cron that batches pending threads into a single digest.", |
| 227 | "Added realtime chat and search over Socket.io gateways, and a dashboard charting startup, investor and funding activity month over month.", |
| 228 | ], |
| 229 | tags: [ |
| 230 | "Next.js", |
| 231 | "Nest.js", |
| 232 | "Prisma", |
| 233 | "PostgreSQL", |
| 234 | "Socket.io", |
| 235 | "Turborepo", |
| 236 | "Mailgun", |
| 237 | "Resend", |
| 238 | ], |
| 239 | }, |
| 240 | ]; |