[{"data":1,"prerenderedAt":2061},["ShallowReactive",2],{"portfolio-works-en":3},[4,1380,1821],{"id":5,"title":6,"body":7,"description":1355,"extension":1356,"meta":1357,"navigation":1373,"path":1374,"seo":1375,"stem":1376,"__hash__":1377,"baseSlug":13,"localeTag":1378,"image":1359,"category":1358,"stack":1360,"tags":1379,"date":1372,"featured":1373},"portfolio/portfolio/urbee.md","URBEE",{"type":8,"value":9,"toc":1307},"minimark",[10,14,19,32,35,42,72,87,91,94,123,127,189,193,196,201,204,221,224,228,233,236,263,266,283,287,293,296,316,319,333,337,342,345,377,380,397,400,404,410,413,436,439,450,453,457,460,463,480,485,499,502,506,509,512,541,544,564,568,572,583,600,603,607,610,633,636,640,643,646,663,666,670,673,693,696,700,703,706,720,723,727,730,733,750,753,757,761,764,767,806,809,813,816,866,869,873,876,896,899,903,909,913,916,936,939,943,946,966,969,973,976,979,990,993,997,1004,1007,1021,1025,1028,1065,1068,1072,1075,1110,1113,1117,1120,1123,1143,1146,1150,1154,1157,1161,1164,1168,1171,1175,1178,1182,1185,1204,1207,1211,1214,1252,1258,1262,1297,1300],[11,12,6],"h1",{"id":13},"urbee",[15,16,18],"h2",{"id":17},"project-overview","Project Overview",[20,21,22,23,27,28,31],"p",{},"URBEE is a ",[24,25,26],"strong",{},"mobile-first event discovery platform"," I designed and engineered as a multi-app product covering ",[24,29,30],{},"consumer discovery, lightweight social planning, and ingestion-oriented backend operations",".",[20,33,34],{},"The core idea was to make urban discovery feel cleaner, faster, and more trustworthy than traditional event platforms. Instead of treating events like a noisy classifieds feed, URBEE treats them as curated experiences with stronger context: category, neighborhood, timing, price, organizer identity, social proof, and map proximity.",[20,36,37,38,41],{},"The product is structured as a ",[24,39,40],{},"pnpm + Turborepo monorepo"," with:",[43,44,45,53,59,65],"ul",{},[46,47,48,49,52],"li",{},"a ",[24,50,51],{},"mobile app"," focused on discovery and planning,",[46,54,48,55,58],{},[24,56,57],{},"NestJS API"," for catalog, auth, social, source management, ingestion, review flows, and automation callbacks,",[46,60,48,61,64],{},[24,62,63],{},"web app foundation"," for future multi-surface expansion,",[46,66,67,68,71],{},"and ",[24,69,70],{},"shared packages"," for cross-app types and UI.",[20,73,74,75,78,79,82,83,86],{},"This project matters because it combines ",[24,76,77],{},"consumer product UX",", ",[24,80,81],{},"location-based interaction design",", and ",[24,84,85],{},"backend pipeline thinking"," in the same system. It is not just a frontend concept. It is a product architecture for keeping event data usable, current, and socially actionable.",[15,88,90],{"id":89},"my-role","My Role",[20,92,93],{},"I built URBEE as an end-to-end product and engineering project, including:",[43,95,96,99,102,105,108,111,114,117,120],{},[46,97,98],{},"Product definition and information architecture",[46,100,101],{},"Mobile UX for discovery, event detail, social feed, lists, and profile flows",[46,103,104],{},"Monorepo architecture with shared packages",[46,106,107],{},"API design with NestJS + Fastify",[46,109,110],{},"Domain modeling for users, organizers, venues, events, lists, posts, follows, sources, ingestion jobs, and review queue items",[46,112,113],{},"Prisma persistence design and seed strategy",[46,115,116],{},"OpenAPI/Swagger contract generation",[46,118,119],{},"Ingestion workflow design with review and automation hooks",[46,121,122],{},"Frontend/backend integration patterns with React Query and authenticated requests",[15,124,126],{"id":125},"stack","Stack",[43,128,129,135,141,147,153,159,165,171,177,183],{},[46,130,131,134],{},[24,132,133],{},"Monorepo:"," pnpm, Turborepo",[46,136,137,140],{},[24,138,139],{},"Mobile:"," Expo, React Native, Expo Router, TypeScript",[46,142,143,146],{},[24,144,145],{},"Data Fetching:"," TanStack React Query",[46,148,149,152],{},[24,150,151],{},"UI/UX:"," Expo Image, Expo Haptics, Expo Location, React Native Maps, Blur/Glass effects",[46,154,155,158],{},[24,156,157],{},"API:"," NestJS, Fastify, TypeScript",[46,160,161,164],{},[24,162,163],{},"Persistence:"," Prisma, PostgreSQL",[46,166,167,170],{},[24,168,169],{},"Infra Services:"," Redis, Docker Compose",[46,172,173,176],{},[24,174,175],{},"Contracts:"," Swagger / OpenAPI",[46,178,179,182],{},[24,180,181],{},"Automation:"," n8n callback integration",[46,184,185,188],{},[24,186,187],{},"Shared Packages:"," workspace types and UI",[15,190,192],{"id":191},"product-vision","Product Vision",[20,194,195],{},"URBEE was designed around a simple product goal:",[20,197,198],{},[24,199,200],{},"Help people discover what is happening in the city and turn that discovery into an actual plan.",[20,202,203],{},"That means the app has to solve more than search. It has to support:",[43,205,206,209,212,215,218],{},[46,207,208],{},"quick browsing when the user does not know what they want yet,",[46,210,211],{},"filtering by moment, category, price, and distance,",[46,213,214],{},"confidence in event details,",[46,216,217],{},"a map-first decision flow,",[46,219,220],{},"and lightweight social mechanics so discovery can become coordination.",[20,222,223],{},"The product direction is especially strong for large urban environments like Sao Paulo, where event supply is broad, fragmented, and often poorly organized across source websites and social posts.",[15,225,227],{"id":226},"what-i-built","What I Built",[229,230,232],"h3",{"id":231},"_1-mobile-first-discovery-experience","1) Mobile-First Discovery Experience",[20,234,235],{},"The mobile app is organized around five core navigation areas:",[43,237,238,243,248,253,258],{},[46,239,240],{},[24,241,242],{},"Hoje",[46,244,245],{},[24,246,247],{},"Explorar",[46,249,250],{},[24,251,252],{},"Mapa",[46,254,255],{},[24,256,257],{},"Social",[46,259,260],{},[24,261,262],{},"Perfil",[20,264,265],{},"This structure mirrors how real users browse city plans:",[43,267,268,271,274,277,280],{},[46,269,270],{},"start from a daily feed,",[46,272,273],{},"branch into category exploration,",[46,275,276],{},"switch to map mode when proximity matters,",[46,278,279],{},"check what friends or followed organizers are doing,",[46,281,282],{},"and save or revisit plans from profile/lists.",[229,284,286],{"id":285},"_2-home-feed-designed-for-fast-discovery","2) Home Feed Designed for Fast Discovery",[20,288,289,290,292],{},"The ",[24,291,242],{}," tab is built as a layered discovery feed instead of a flat list.",[20,294,295],{},"It includes:",[43,297,298,301,304,307,310,313],{},[46,299,300],{},"a search input for direct lookup,",[46,302,303],{},"quick chips for date and tag-based shortcuts,",[46,305,306],{},"a trending section with visual cards,",[46,308,309],{},"event cards with image, date, neighborhood, tags, and price,",[46,311,312],{},"save and share actions directly on the card,",[46,314,315],{},"and a social feed section that shows activity around events.",[20,317,318],{},"This gives the user multiple entry points into discovery:",[43,320,321,324,327,330],{},[46,322,323],{},"browse by momentum,",[46,325,326],{},"browse by theme,",[46,328,329],{},"browse by social context,",[46,331,332],{},"or jump directly into a specific event.",[229,334,336],{"id":335},"_3-category-based-exploration","3) Category-Based Exploration",[20,338,289,339,341],{},[24,340,247],{}," area turns broad discovery into a more intentional browsing flow.",[20,343,344],{},"Users can enter categories such as:",[43,346,347,350,353,356,359,362,365,368,371,374],{},[46,348,349],{},"Musica",[46,351,352],{},"Arte",[46,354,355],{},"Cinema",[46,357,358],{},"Teatro",[46,360,361],{},"Gastronomia",[46,363,364],{},"Cursos",[46,366,367],{},"Bem-estar",[46,369,370],{},"Esportes",[46,372,373],{},"Infantil",[46,375,376],{},"Festa",[20,378,379],{},"Inside each category, the experience supports:",[43,381,382,385,388,391,394],{},[46,383,384],{},"temporal filters such as today, tomorrow, and weekend,",[46,386,387],{},"price filters from free to budget ranges,",[46,389,390],{},"sorting modes such as trending, earliest, and cheapest,",[46,392,393],{},"infinite scrolling,",[46,395,396],{},"and modal-based filter controls that keep the browsing experience clean on mobile.",[20,398,399],{},"This is important because discovery apps fail when they force the same layout on every user. URBEE gives both fast browsing and more structured narrowing.",[229,401,403],{"id":402},"_4-map-based-event-discovery","4) Map-Based Event Discovery",[20,405,406,407,409],{},"One of the strongest usability features is the ",[24,408,252],{}," tab.",[20,411,412],{},"On native mobile devices, I implemented:",[43,414,415,418,421,424,427,430,433],{},[46,416,417],{},"live location permission handling,",[46,419,420],{},"a map centered on the user or a Sao Paulo default region,",[46,422,423],{},"event markers with visible price labels,",[46,425,426],{},"marker selection tied to a collapsible bottom sheet,",[46,428,429],{},"date and radius filters,",[46,431,432],{},"a \"search in this area\" interaction after region movement,",[46,434,435],{},"and a list view of nearby events beneath the map.",[20,437,438],{},"This supports a very practical user behavior:",[43,440,441,444,447],{},[46,442,443],{},"\"show me what is happening near me\",",[46,445,446],{},"\"show me what is happening in this neighborhood tonight\",",[46,448,449],{},"or \"I am going to another part of the city, what is around there?\"",[20,451,452],{},"The usability value here is high because event decisions are often geographic before they are thematic.",[229,454,456],{"id":455},"_5-social-planning-layer","5) Social Planning Layer",[20,458,459],{},"URBEE is not a full social network. It uses social features where they add utility to planning.",[20,461,462],{},"The current structure supports:",[43,464,465,468,471,474,477],{},[46,466,467],{},"personal saved lists,",[46,469,470],{},"feed activity related to events,",[46,472,473],{},"organizer following,",[46,475,476],{},"posts and event updates in the feed,",[46,478,479],{},"and profile-level stats that make saved/planned behavior visible.",[20,481,289,482,484],{},[24,483,257],{}," tab displays user activity tied to events, including:",[43,486,487,490,493,496],{},[46,488,489],{},"who wants to go,",[46,491,492],{},"what event they are referencing,",[46,494,495],{},"a short comment,",[46,497,498],{},"and quick actions such as like, comment intent, and share.",[20,500,501],{},"This is a deliberate product choice. The social layer exists to reduce planning friction and increase confidence through shared discovery, not to overwhelm the product with generic engagement mechanics.",[229,503,505],{"id":504},"_6-event-detail-as-the-conversion-screen","6) Event Detail as the Conversion Screen",[20,507,508],{},"The event detail screen is where browsing turns into intent.",[20,510,511],{},"I built it to consolidate the most decision-critical information:",[43,513,514,517,520,523,526,529,532,535,538],{},[46,515,516],{},"hero media,",[46,518,519],{},"title and tags,",[46,521,522],{},"full date/time presentation,",[46,524,525],{},"venue and neighborhood context,",[46,527,528],{},"ticket or free-entry state,",[46,530,531],{},"attendee count/social proof,",[46,533,534],{},"full description,",[46,536,537],{},"save and share actions,",[46,539,540],{},"and a primary CTA that adapts between \"Confirmar presenca\" and \"Comprar ingresso\".",[20,542,543],{},"This screen is structured to answer the practical questions quickly:",[43,545,546,549,552,555,558,561],{},[46,547,548],{},"What is this?",[46,550,551],{},"When is it?",[46,553,554],{},"Where is it?",[46,556,557],{},"Is it free or paid?",[46,559,560],{},"Are other people interested?",[46,562,563],{},"Do I want to save it, share it, or go now?",[15,565,567],{"id":566},"detailed-usability-and-user-flows","Detailed Usability and User Flows",[229,569,571],{"id":570},"onboarding-and-access","Onboarding and Access",[20,573,574,575,578,579,582],{},"The app includes dedicated ",[24,576,577],{},"login"," and ",[24,580,581],{},"registration"," flows with:",[43,584,585,588,591,594,597],{},[46,586,587],{},"clear credential fields,",[46,589,590],{},"validation for missing data,",[46,592,593],{},"password visibility toggle,",[46,595,596],{},"loading states,",[46,598,599],{},"and guarded navigation so unauthenticated users are redirected before accessing the main tabs.",[20,601,602],{},"This creates a straightforward path from account creation into the product without unnecessary friction.",[229,604,606],{"id":605},"fast-scanning-and-decision-making","Fast Scanning and Decision-Making",[20,608,609],{},"Across the mobile experience, the UI is optimized for rapid scanning:",[43,611,612,615,618,621,624,627,630],{},[46,613,614],{},"strong visual cards,",[46,616,617],{},"short metadata rows,",[46,619,620],{},"persistent use of neighborhood and price,",[46,622,623],{},"compact tag pills,",[46,625,626],{},"loading skeletons,",[46,628,629],{},"empty states,",[46,631,632],{},"and haptic feedback on key interactions.",[20,634,635],{},"The result is a product that helps users make a decision in seconds rather than forcing them to parse dense event listings.",[229,637,639],{"id":638},"filtering-without-overcomplication","Filtering Without Overcomplication",[20,641,642],{},"Filtering is treated as a lightweight decision tool, not as a heavy search form.",[20,644,645],{},"The usability approach is:",[43,647,648,651,654,657,660],{},[46,649,650],{},"show the most common filters first,",[46,652,653],{},"keep the category screen focused on results,",[46,655,656],{},"move advanced filter choices into a bottom sheet/modal,",[46,658,659],{},"make active filters visible,",[46,661,662],{},"and keep sort selection easy to change during browsing.",[20,664,665],{},"This balances speed and control, which is essential for a discovery product.",[229,667,669],{"id":668},"proximity-driven-exploration","Proximity-Driven Exploration",[20,671,672],{},"The map flow was designed around actual mobile behavior:",[43,674,675,678,681,684,687,690],{},[46,676,677],{},"the user grants location,",[46,679,680],{},"sees events plotted spatially,",[46,682,683],{},"adjusts radius,",[46,685,686],{},"pans to another region,",[46,688,689],{},"taps \"search here\",",[46,691,692],{},"and opens the event directly from the sheet or marker context.",[20,694,695],{},"This is more useful than a passive map embed. It becomes a real discovery surface.",[229,697,699],{"id":698},"saved-content-and-return-visits","Saved Content and Return Visits",[20,701,702],{},"Saved events and lists are an important retention mechanic.",[20,704,705],{},"The current product design supports:",[43,707,708,711,714,717],{},[46,709,710],{},"saving from the feed,",[46,712,713],{},"saving from event detail,",[46,715,716],{},"automatic/default saved-list logic in the backend,",[46,718,719],{},"and surfacing list totals in the profile area.",[20,721,722],{},"This makes URBEE useful both for immediate decisions and for slower planning across the week.",[229,724,726],{"id":725},"social-proof-without-noise","Social Proof Without Noise",[20,728,729],{},"The social experience is intentionally restrained.",[20,731,732],{},"Instead of trying to become a generic content feed, URBEE ties activity back to event intent:",[43,734,735,738,741,744,747],{},[46,736,737],{},"people wanting to attend,",[46,739,740],{},"short commentary,",[46,742,743],{},"likes,",[46,745,746],{},"organizer-follow relationships,",[46,748,749],{},"and organizer-related updates.",[20,751,752],{},"This improves relevance and keeps the feed aligned with the product purpose.",[15,754,756],{"id":755},"backend-and-product-architecture","Backend and Product Architecture",[229,758,760],{"id":759},"monorepo-structure","Monorepo Structure",[20,762,763],{},"I organized the codebase into a shared monorepo so product contracts are not duplicated across surfaces.",[20,765,766],{},"The main areas are:",[43,768,769,776,782,788,794,800],{},[46,770,771,775],{},[772,773,774],"code",{},"apps/mobile"," for the Expo app",[46,777,778,781],{},[772,779,780],{},"apps/api"," for the NestJS API",[46,783,784,787],{},[772,785,786],{},"apps/web"," for the web surface foundation",[46,789,790,793],{},[772,791,792],{},"packages/types"," for shared domain contracts",[46,795,796,799],{},[772,797,798],{},"packages/ui"," for shared web UI",[46,801,802,805],{},[772,803,804],{},"packages/config"," for linting, formatting, and TypeScript standards",[20,807,808],{},"This setup improves consistency and makes it easier to evolve the product across mobile and web without drifting models.",[229,810,812],{"id":811},"api-modules","API Modules",[20,814,815],{},"The backend is split into focused modules:",[43,817,818,824,830,836,842,848,854,860],{},[46,819,820,823],{},[24,821,822],{},"identity"," for auth and current-user access",[46,825,826,829],{},[24,827,828],{},"catalog"," for event and organizer retrieval",[46,831,832,835],{},[24,833,834],{},"social"," for lists, follows, and feed assembly",[46,837,838,841],{},[24,839,840],{},"sources"," for source configuration",[46,843,844,847],{},[24,845,846],{},"ingestion"," for pipeline runs and job auditing",[46,849,850,853],{},[24,851,852],{},"review"," for human approval/rejection of low-confidence extraction items",[46,855,856,859],{},[24,857,858],{},"automation"," for secure n8n callbacks",[46,861,862,865],{},[24,863,864],{},"system"," for health checks",[20,867,868],{},"This gives the API a clear product-oriented shape rather than a generic CRUD structure.",[229,870,872],{"id":871},"authenticated-product-flows","Authenticated Product Flows",[20,874,875],{},"The backend supports:",[43,877,878,881,884,887,890,893],{},[46,879,880],{},"register and login endpoints,",[46,882,883],{},"JWT-based authenticated access,",[46,885,886],{},"current-user retrieval,",[46,888,889],{},"authenticated list access,",[46,891,892],{},"authenticated follow actions,",[46,894,895],{},"and authenticated ingestion/review operations.",[20,897,898],{},"That separation matters because URBEE includes both consumer-facing features and operational tooling.",[15,900,902],{"id":901},"event-data-trust-and-ingestion","Event Data, Trust, and Ingestion",[20,904,905,906,31],{},"One of the strongest parts of URBEE as a portfolio project is that it addresses the hard side of event products: ",[24,907,908],{},"data quality",[229,910,912],{"id":911},"source-management","Source Management",[20,914,915],{},"The backend includes source definitions with configuration such as:",[43,917,918,921,924,927,930,933],{},[46,919,920],{},"source name,",[46,922,923],{},"base URL,",[46,925,926],{},"city,",[46,928,929],{},"source type,",[46,931,932],{},"confidence weight,",[46,934,935],{},"and rate limit configuration.",[20,937,938],{},"This is the foundation for treating event ingestion as a managed system rather than a manual spreadsheet problem.",[229,940,942],{"id":941},"ingestion-pipeline-thinking","Ingestion Pipeline Thinking",[20,944,945],{},"The ingestion module supports:",[43,947,948,951,954,957,960,963],{},[46,949,950],{},"triggering ingestion by source or city,",[46,952,953],{},"creating ingestion jobs,",[46,955,956],{},"recording extraction attempts,",[46,958,959],{},"storing execution records,",[46,961,962],{},"tracking confidence levels,",[46,964,965],{},"and requiring review when extraction confidence falls below threshold.",[20,967,968],{},"This is valuable because event platforms are only as useful as their freshness and reliability.",[229,970,972],{"id":971},"human-in-the-loop-review","Human-in-the-Loop Review",[20,974,975],{},"URBEE includes a review queue model for low-confidence extraction results.",[20,977,978],{},"That means the platform is designed for a practical hybrid workflow:",[43,980,981,984,987],{},[46,982,983],{},"automation where confidence is high,",[46,985,986],{},"human approval when confidence is weaker,",[46,988,989],{},"and auditable state transitions for review items.",[20,991,992],{},"This is a more production-aware approach than simply scraping pages and trusting everything blindly.",[229,994,996],{"id":995},"automation-hooks","Automation Hooks",[20,998,999,1000,1003],{},"I also built a secure ",[24,1001,1002],{},"n8n callback endpoint"," so external workflows can report job execution status back into the platform.",[20,1005,1006],{},"This enables URBEE to grow into more robust operational patterns such as:",[43,1008,1009,1012,1015,1018],{},[46,1010,1011],{},"scheduled ingestion,",[46,1013,1014],{},"failure handling,",[46,1016,1017],{},"async enrichment,",[46,1019,1020],{},"and multi-step automation flows.",[15,1022,1024],{"id":1023},"data-modeling","Data Modeling",[20,1026,1027],{},"The domain model spans the core product entities needed for this kind of platform:",[43,1029,1030,1033,1036,1039,1042,1045,1048,1051,1053,1056,1059,1062],{},[46,1031,1032],{},"users",[46,1034,1035],{},"organizer profiles",[46,1037,1038],{},"venues",[46,1040,1041],{},"events",[46,1043,1044],{},"lists and list items",[46,1046,1047],{},"follows",[46,1049,1050],{},"posts",[46,1052,840],{},[46,1054,1055],{},"ingestion jobs",[46,1057,1058],{},"extraction attempts",[46,1060,1061],{},"ingestion executions",[46,1063,1064],{},"review queue items",[20,1066,1067],{},"This is important in portfolio terms because it shows product systems thinking, not just screen building.",[15,1069,1071],{"id":1070},"seeded-product-context","Seeded Product Context",[20,1073,1074],{},"To make the system usable in development, I seeded realistic Sao Paulo-flavored entities including:",[43,1076,1077,1089,1104,1107],{},[46,1078,1079,1080,78,1083,82,1086],{},"organizers such as ",[24,1081,1082],{},"Mamba Negra",[24,1084,1085],{},"Gop Tun",[24,1087,1088],{},"Casa Natura",[46,1090,1091,1092,78,1095,78,1098,82,1101],{},"venues such as ",[24,1093,1094],{},"Audio Club",[24,1096,1097],{},"MIS",[24,1099,1100],{},"SESC Pompeia",[24,1102,1103],{},"Parque Ibirapuera",[46,1105,1106],{},"multiple public events with categories, tags, pricing, source URLs, and confidence scores",[46,1108,1109],{},"and posts associated with organizers and members",[20,1111,1112],{},"This helped validate the discovery, social, and ingestion flows against a believable urban event context.",[15,1114,1116],{"id":1115},"design-and-frontend-direction","Design and Frontend Direction",[20,1118,1119],{},"The mobile interface is intentionally not built like a generic utility app.",[20,1121,1122],{},"The design direction focuses on:",[43,1124,1125,1128,1131,1134,1137,1140],{},[46,1126,1127],{},"dark, nightlife-friendly visual treatment,",[46,1129,1130],{},"large media cards,",[46,1132,1133],{},"contrast-forward metadata presentation,",[46,1135,1136],{},"tactile interactions through haptics,",[46,1138,1139],{},"map-first discovery on native devices,",[46,1141,1142],{},"and motion/feedback patterns that make the app feel active and modern.",[20,1144,1145],{},"I treated the experience as a lifestyle/discovery product rather than a plain events directory.",[15,1147,1149],{"id":1148},"engineering-decisions-that-matter","Engineering Decisions That Matter",[229,1151,1153],{"id":1152},"_1-mobile-first-product-architecture","1) Mobile-First Product Architecture",[20,1155,1156],{},"I prioritized the native mobile experience because event discovery, location context, and last-minute planning are naturally mobile behaviors.",[229,1158,1160],{"id":1159},"_2-shared-contracts-across-apps","2) Shared Contracts Across Apps",[20,1162,1163],{},"The monorepo structure and shared package strategy reduce duplication and create a cleaner path for scaling the product across surfaces.",[229,1165,1167],{"id":1166},"_3-operational-backoffice-thinking","3) Operational Backoffice Thinking",[20,1169,1170],{},"The API does more than serve lists of events. It also models ingestion jobs, review states, source management, and automation callbacks. That makes the project much more realistic as a product system.",[229,1172,1174],{"id":1173},"_4-clear-separation-between-discovery-ux-and-operational-infrastructure","4) Clear Separation Between Discovery UX and Operational Infrastructure",[20,1176,1177],{},"Users see a polished discovery product, while the backend is prepared for source orchestration and trust workflows. That separation is a strong engineering choice for long-term maintainability.",[15,1179,1181],{"id":1180},"current-product-state","Current Product State",[20,1183,1184],{},"URBEE today is best described as:",[43,1186,1187,1193,1198],{},[46,1188,48,1189,1192],{},[24,1190,1191],{},"substantially built mobile discovery product",",",[46,1194,48,1195,1192],{},[24,1196,1197],{},"well-structured backend foundation for catalog/social/ingestion workflows",[46,1199,1200,1201,31],{},"and a ",[24,1202,1203],{},"web surface ready for expansion rather than already feature-complete",[20,1205,1206],{},"That distinction matters. I would rather present the product honestly as a serious mobile + API system with a growing web layer than inflate what the web app currently does.",[15,1208,1210],{"id":1209},"why-this-project-matters-in-my-portfolio","Why This Project Matters in My Portfolio",[20,1212,1213],{},"URBEE demonstrates that I can deliver:",[43,1215,1216,1221,1227,1232,1237,1242,1247],{},[46,1217,1218,1220],{},[24,1219,77],{},", not just landing pages",[46,1222,1223,1226],{},[24,1224,1225],{},"mobile app architecture"," with real navigation and state flows",[46,1228,1229],{},[24,1230,1231],{},"location-aware discovery interfaces",[46,1233,1234],{},[24,1235,1236],{},"social utility features tied to product purpose",[46,1238,1239],{},[24,1240,1241],{},"backend systems for operational reliability",[46,1243,1244],{},[24,1245,1246],{},"data modeling for multi-entity platforms",[46,1248,1249],{},[24,1250,1251],{},"API and automation design beyond simple CRUD",[20,1253,1254,1255,31],{},"It shows my ability to work across the full stack of a product where ",[24,1256,1257],{},"content quality, trust, usability, and architecture all matter at the same time",[15,1259,1261],{"id":1260},"freelance-keywords-services","Freelance Keywords / Services",[43,1263,1264,1267,1270,1273,1276,1279,1282,1285,1288,1291,1294],{},[46,1265,1266],{},"Mobile app development with Expo and React Native",[46,1268,1269],{},"Event discovery platform development",[46,1271,1272],{},"Location-based product design",[46,1274,1275],{},"Social planning and saved-content features",[46,1277,1278],{},"NestJS API architecture",[46,1280,1281],{},"Prisma + PostgreSQL backend systems",[46,1283,1284],{},"OpenAPI and API contract design",[46,1286,1287],{},"Ingestion workflow architecture",[46,1289,1290],{},"Human-in-the-loop review systems",[46,1292,1293],{},"Monorepo architecture with shared TypeScript contracts",[46,1295,1296],{},"Product-focused full-stack development",[1298,1299],"hr",{},[20,1301,1302,1303,1306],{},"If you need a ",[24,1304,1305],{},"mobile-first product"," that combines strong UX, real backend structure, and thoughtful domain modeling, URBEE represents the kind of system I build.",{"title":1308,"searchDepth":1309,"depth":1309,"links":1310},"",2,[1311,1312,1313,1314,1315,1324,1332,1337,1343,1344,1345,1346,1352,1353,1354],{"id":17,"depth":1309,"text":18},{"id":89,"depth":1309,"text":90},{"id":125,"depth":1309,"text":126},{"id":191,"depth":1309,"text":192},{"id":226,"depth":1309,"text":227,"children":1316},[1317,1319,1320,1321,1322,1323],{"id":231,"depth":1318,"text":232},3,{"id":285,"depth":1318,"text":286},{"id":335,"depth":1318,"text":336},{"id":402,"depth":1318,"text":403},{"id":455,"depth":1318,"text":456},{"id":504,"depth":1318,"text":505},{"id":566,"depth":1309,"text":567,"children":1325},[1326,1327,1328,1329,1330,1331],{"id":570,"depth":1318,"text":571},{"id":605,"depth":1318,"text":606},{"id":638,"depth":1318,"text":639},{"id":668,"depth":1318,"text":669},{"id":698,"depth":1318,"text":699},{"id":725,"depth":1318,"text":726},{"id":755,"depth":1309,"text":756,"children":1333},[1334,1335,1336],{"id":759,"depth":1318,"text":760},{"id":811,"depth":1318,"text":812},{"id":871,"depth":1318,"text":872},{"id":901,"depth":1309,"text":902,"children":1338},[1339,1340,1341,1342],{"id":911,"depth":1318,"text":912},{"id":941,"depth":1318,"text":942},{"id":971,"depth":1318,"text":972},{"id":995,"depth":1318,"text":996},{"id":1023,"depth":1309,"text":1024},{"id":1070,"depth":1309,"text":1071},{"id":1115,"depth":1309,"text":1116},{"id":1148,"depth":1309,"text":1149,"children":1347},[1348,1349,1350,1351],{"id":1152,"depth":1318,"text":1153},{"id":1159,"depth":1318,"text":1160},{"id":1166,"depth":1318,"text":1167},{"id":1173,"depth":1318,"text":1174},{"id":1180,"depth":1309,"text":1181},{"id":1209,"depth":1309,"text":1210},{"id":1260,"depth":1309,"text":1261},"A mobile-first event discovery platform with social planning, map-based exploration, and ingestion-oriented backend architecture.","md",{"category":1358,"image":1359,"stack":1360,"tags":1361,"date":1372,"featured":1373},"Mobile","/images/works/urbee.png","Expo, React Native, NestJS, Fastify, Prisma, PostgreSQL, Turborepo",[1362,1363,1364,1365,1366,1367,1368,1369,1370,1371],"Expo","React Native","NestJS","Fastify","Prisma","PostgreSQL","Product Design","Geolocation","Event Discovery","Monorepo","2026-03-09",true,"/portfolio/urbee",{"title":6,"description":1355},"portfolio/urbee","0oS-UVEOu5-gAN9G_VsPczFJzttc9cGhAc1qj_a7ZYM","default",[1362,1363,1364,1365,1366,1367,1368,1369,1370,1371],{"id":1381,"title":1382,"body":1383,"description":1801,"extension":1356,"meta":1802,"navigation":1373,"path":1815,"seo":1816,"stem":1817,"__hash__":1818,"baseSlug":1819,"localeTag":1378,"image":1804,"category":1803,"stack":1806,"tags":1820,"projectUrl":1805,"date":1814,"featured":1373},"portfolio/portfolio/cenas-nitrogen.md","CENAS x NITROGEN",{"type":8,"value":1384,"toc":1781},[1385,1387,1402,1405,1412,1414,1417,1446,1448,1498,1500,1504,1527,1531,1553,1556,1560,1564,1575,1579,1590,1593,1597,1611,1615,1629,1633,1648,1652,1655,1682,1685,1687,1690,1704,1707,1709,1712,1737,1739,1773,1775],[15,1386,18],{"id":17},[20,1388,1389,1390,1393,1394,1397,1398,1401],{},"CENAS is a ",[24,1391,1392],{},"headless Shopify storefront"," I designed and developed end-to-end using ",[24,1395,1396],{},"Nuxt 4"," and the ",[24,1399,1400],{},"Nitrogen architecture"," (a Nuxt approach inspired by Shopify Hydrogen).",[20,1403,1404],{},"This project started as a strong visual concept and evolved into a production-ready commerce platform with a full customer journey: catalog discovery, product pages, cart, checkout handoff, account area, address management, search, localization, newsletter, and back-in-stock flows.",[20,1406,1407,1408,1411],{},"The goal was not just to build a beautiful storefront, but to build a ",[24,1409,1410],{},"stable, scalable, maintainable e-commerce application"," I could confidently run in production.",[15,1413,90],{"id":89},[20,1415,1416],{},"I built this project solo and owned the entire delivery lifecycle:",[43,1418,1419,1422,1425,1428,1431,1434,1437,1440,1443],{},[46,1420,1421],{},"Product thinking and UX direction",[46,1423,1424],{},"Frontend architecture and component system",[46,1426,1427],{},"Shopify Storefront API integration",[46,1429,1430],{},"Data modeling with GraphQL fragments/operations",[46,1432,1433],{},"State management with Pinia",[46,1435,1436],{},"Performance and SEO optimization",[46,1438,1439],{},"API hardening (validation, payload limits, rate limiting)",[46,1441,1442],{},"Testing and CI quality gates",[46,1444,1445],{},"Ongoing refactoring for long-term maintainability",[15,1447,126],{"id":125},[43,1449,1450,1456,1462,1468,1474,1480,1486,1492],{},[46,1451,1452,1455],{},[24,1453,1454],{},"Framework:"," Nuxt 4, Vue 3, TypeScript",[46,1457,1458,1461],{},[24,1459,1460],{},"Commerce:"," Shopify Storefront API (GraphQL)",[46,1463,1464,1467],{},[24,1465,1466],{},"Architecture:"," Nitrogen-style composables + server proxy + typed operations",[46,1469,1470,1473],{},[24,1471,1472],{},"State:"," Pinia + persisted state plugin",[46,1475,1476,1479],{},[24,1477,1478],{},"Styling/UI:"," Tailwind CSS v4, custom typography system",[46,1481,1482,1485],{},[24,1483,1484],{},"Media/UX:"," Nuxt Image, Embla Carousel, GSAP, OGL, Lenis",[46,1487,1488,1491],{},[24,1489,1490],{},"Marketing/Tracking:"," Klaviyo, Google Analytics/gtag, Vercel Analytics & Speed Insights",[46,1493,1494,1497],{},[24,1495,1496],{},"Tooling:"," GraphQL Code Generator, ESLint, Vitest, GitHub Actions CI",[15,1499,227],{"id":226},[229,1501,1503],{"id":1502},"full-headless-commerce-experience","Full Headless Commerce Experience",[43,1505,1506,1509,1512,1515,1518,1521,1524],{},[46,1507,1508],{},"Dynamic collection/category pages with filtering, sorting, and pagination",[46,1510,1511],{},"Product detail pages with media galleries, variants, size guide, recommendations, and rich product content",[46,1513,1514],{},"Cart drawer and cart line management (add/update/remove)",[46,1516,1517],{},"Authentication flows: register, login, recover password, reset password",[46,1519,1520],{},"Account area: profile context, orders, saved addresses (add/edit/delete + default address)",[46,1522,1523],{},"Predictive and full search experience",[46,1525,1526],{},"Localization-aware storefront behavior (country/language/currency)",[229,1528,1530],{"id":1529},"modular-server-layer-for-shopify","Modular Server Layer for Shopify",[20,1532,1533,1534,78,1537,78,1540,78,1543,78,1546,78,1549,1552],{},"I implemented a server-side proxy and organized operations by domain (",[772,1535,1536],{},"cart",[772,1538,1539],{},"customer",[772,1541,1542],{},"product",[772,1544,1545],{},"collection",[772,1547,1548],{},"search",[772,1550,1551],{},"localization","), with typed GraphQL operations and reusable fragments.",[20,1554,1555],{},"This structure keeps the frontend clean, secures credentials, and makes feature work faster and safer.",[15,1557,1559],{"id":1558},"engineering-solutions-that-made-it-stable","Engineering Solutions That Made It Stable",[229,1561,1563],{"id":1562},"_1-typed-graphql-workflow","1) Typed GraphQL Workflow",[43,1565,1566,1569,1572],{},[46,1567,1568],{},"Codegen-generated TypeScript types for queries/mutations",[46,1570,1571],{},"Typed operation wrappers for each commerce domain",[46,1573,1574],{},"Safer refactors and fewer runtime surprises",[229,1576,1578],{"id":1577},"_2-hardened-api-proxies","2) Hardened API Proxies",[43,1580,1581,1584,1587],{},[46,1582,1583],{},"Request body validation",[46,1585,1586],{},"Content-length guards against oversized payloads",[46,1588,1589],{},"In-memory rate limiting per endpoint namespace/IP",[20,1591,1592],{},"This reduced risk in external integrations (Shopify/Klaviyo) and improved resilience under invalid or abusive traffic.",[229,1594,1596],{"id":1595},"_3-performance-first-decisions","3) Performance-First Decisions",[43,1598,1599,1602,1605,1608],{},[46,1600,1601],{},"Nuxt image optimization and modern formats",[46,1603,1604],{},"Non-blocking client bootstrap for smoother initial rendering",[46,1606,1607],{},"Bounded GraphQL cache strategy (TTL + LRU behavior)",[46,1609,1610],{},"Deferred analytics/lenis initialization to avoid competing with critical rendering",[229,1612,1614],{"id":1613},"_4-seo-foundation-for-commerce","4) SEO Foundation for Commerce",[43,1616,1617,1620,1623,1626],{},[46,1618,1619],{},"Canonical URLs",[46,1621,1622],{},"Open Graph and Twitter metadata on key pages",[46,1624,1625],{},"Runtime-config-driven site URL support",[46,1627,1628],{},"Better discoverability for product/collection/search pages",[229,1630,1632],{"id":1631},"_5-quality-gates-and-maintainability","5) Quality Gates and Maintainability",[43,1634,1635,1638,1645],{},[46,1636,1637],{},"Linting, Nuxt type-checking, and unit tests as recurring quality gates (including CI workflows)",[46,1639,1640,1641,1644],{},"Typed error helpers replacing broad ",[772,1642,1643],{},"any","-style handling",[46,1646,1647],{},"Clear improvement roadmap executed in incremental commits",[15,1649,1651],{"id":1650},"delivery-story-from-visual-build-to-production-hardening","Delivery Story (From Visual Build to Production Hardening)",[20,1653,1654],{},"A key part of this project was the progression:",[1656,1657,1658,1664,1670,1676],"ol",{},[46,1659,1660,1663],{},[24,1661,1662],{},"Visual and UX build-out"," (new interface, mobile improvements, richer product/collection experiences)",[46,1665,1666,1669],{},[24,1667,1668],{},"Core commerce features"," (cart, auth, account, filters, search, localization, Klaviyo)",[46,1671,1672,1675],{},[24,1673,1674],{},"Technical hardening"," (analytics unification, proxy security, tests + CI, type-safety, caching, SEO, runtime config)",[46,1677,1678,1681],{},[24,1679,1680],{},"Final stabilization pass"," (lint/typecheck cleanup and operational consistency)",[20,1683,1684],{},"This is exactly how I like to deliver freelance commerce projects: fast iteration first, then systematic hardening until the app is reliable.",[15,1686,1116],{"id":1115},[20,1688,1689],{},"CENAS was built with a deliberate visual voice:",[43,1691,1692,1695,1698,1701],{},[46,1693,1694],{},"Strong editorial typography",[46,1696,1697],{},"Custom hero and category interactions",[46,1699,1700],{},"Motion and transitions that support brand feel without sacrificing UX clarity",[46,1702,1703],{},"Responsive behavior tailored for mobile and desktop shopping journeys",[20,1705,1706],{},"The result is a storefront that feels distinctive while remaining practical and conversion-oriented.",[15,1708,1210],{"id":1209},[20,1710,1711],{},"This case study demonstrates that I can deliver:",[43,1713,1714,1719,1725,1731],{},[46,1715,1716],{},[24,1717,1718],{},"End-to-end headless commerce implementation",[46,1720,1721,1724],{},[24,1722,1723],{},"Nuxt + Shopify architecture"," that is production-ready",[46,1726,1727,1730],{},[24,1728,1729],{},"Performance, SEO, and integration hardening"," beyond surface-level UI work",[46,1732,1733,1736],{},[24,1734,1735],{},"Long-term maintainability"," with typed systems and clear engineering standards",[15,1738,1261],{"id":1260},[43,1740,1741,1744,1747,1749,1752,1755,1758,1761,1764,1767,1770],{},[46,1742,1743],{},"Headless Shopify development",[46,1745,1746],{},"Nuxt.js e-commerce development",[46,1748,1427],{},[46,1750,1751],{},"Custom storefront architecture",[46,1753,1754],{},"Shopify Hydrogen-inspired builds with Nuxt",[46,1756,1757],{},"Performance optimization for e-commerce",[46,1759,1760],{},"Technical SEO for headless storefronts",[46,1762,1763],{},"Conversion-focused frontend engineering",[46,1765,1766],{},"GraphQL + TypeScript commerce architecture",[46,1768,1769],{},"Klaviyo integration (newsletter / back-in-stock)",[46,1771,1772],{},"CI/CD quality setup for frontend teams",[1298,1774],{},[20,1776,1777,1778,1780],{},"If you need a custom ",[24,1779,1392],{}," with strong branding and serious engineering quality, this is the type of project I deliver.",{"title":1308,"searchDepth":1309,"depth":1309,"links":1782},[1783,1784,1785,1786,1790,1797,1798,1799,1800],{"id":17,"depth":1309,"text":18},{"id":89,"depth":1309,"text":90},{"id":125,"depth":1309,"text":126},{"id":226,"depth":1309,"text":227,"children":1787},[1788,1789],{"id":1502,"depth":1318,"text":1503},{"id":1529,"depth":1318,"text":1530},{"id":1558,"depth":1309,"text":1559,"children":1791},[1792,1793,1794,1795,1796],{"id":1562,"depth":1318,"text":1563},{"id":1577,"depth":1318,"text":1578},{"id":1595,"depth":1318,"text":1596},{"id":1613,"depth":1318,"text":1614},{"id":1631,"depth":1318,"text":1632},{"id":1650,"depth":1309,"text":1651},{"id":1115,"depth":1309,"text":1116},{"id":1209,"depth":1309,"text":1210},{"id":1260,"depth":1309,"text":1261},"Headless Shopify storefront em Nuxt 4 com arquitetura Nitrogen, foco em performance, SEO técnico e engenharia escalável.",{"category":1803,"image":1804,"projectUrl":1805,"stack":1806,"tags":1807,"date":1814,"featured":1373},"Code","/images/works/cenas.png","https://cenas.com.br/","Nuxt 4 + Shopify Storefront API + TypeScript + GraphQL",[1396,1808,1809,1810,1811,1812,1813],"Shopify","Headless Commerce","GraphQL","TypeScript","SEO","Performance","2026-03-01","/portfolio/cenas-nitrogen",{"title":1382,"description":1801},"portfolio/cenas-nitrogen","4Jyv0uL6qJ70-ACNxm_PzZRiUgr5lADfK4qyZOxCeb8","cenas-nitrogen",[1396,1808,1809,1810,1811,1812,1813],{"id":1822,"title":1823,"body":1824,"description":2039,"extension":1356,"meta":2040,"navigation":1373,"path":2055,"seo":2056,"stem":2057,"__hash__":2058,"baseSlug":2059,"localeTag":1378,"image":2042,"category":2041,"stack":2044,"tags":2060,"projectUrl":2043,"date":1992,"featured":1373},"portfolio/portfolio/email-platform-lab.md","Email Platform Lab",{"type":8,"value":1825,"toc":2024},[1826,1830,1837,1841,1847,1861,1865,1873,1897,1904,1925,1932,1949,1953,1970,1974,1994,1998,2001],[15,1827,1829],{"id":1828},"project-summary","Project Summary",[20,1831,1832,1833,1836],{},"Email Platform Lab is a production-style email platform I built end-to-end to showcase advanced email templating and campaign operations.",[1834,1835],"br",{},"\nThe project evolved from a static template exercise into a complete workflow system with rendering safeguards, QA checkpoints, and internal tooling for campaign approvals.",[15,1838,1840],{"id":1839},"why-i-built-it","Why I Built It",[20,1842,1843,1844,1846],{},"I wanted a portfolio project that proves practical delivery, not just UI polish.",[1834,1845],{},"\nEmail is a high-friction channel where small HTML/CSS mistakes can break business-critical communication, so I built this lab to demonstrate:",[43,1848,1849,1852,1855,1858],{},[46,1850,1851],{},"robust responsive email template development;",[46,1853,1854],{},"cross-client compatibility engineering;",[46,1856,1857],{},"workflow automation for marketing operations;",[46,1859,1860],{},"maintainable architecture for fast iteration.",[15,1862,1864],{"id":1863},"platform-structure","Platform Structure",[229,1866,1868,1869,1872],{"id":1867},"_1-email-lab-appsemail-lab","1) Email Lab (",[772,1870,1871],{},"apps/email-lab",")",[43,1874,1875,1878,1891,1894],{},[46,1876,1877],{},"Handcrafted HTML templates for newsletter, promo, and transactional use cases.",[46,1879,1880,1881,78,1884,78,1887,1890],{},"Component-style partials (",[772,1882,1883],{},"header",[772,1885,1886],{},"button",[772,1888,1889],{},"footer",") with token hydration.",[46,1892,1893],{},"Build pipeline that sanitizes output, compiles templates, and generates a preview index.",[46,1895,1896],{},"Payload size tracking to avoid Gmail clipping and improve deliverability readiness.",[229,1898,1900,1901,1872],{"id":1899},"_2-growth-admin-portal-appsadmin-portal","2) Growth Admin Portal (",[772,1902,1903],{},"apps/admin-portal",[43,1905,1906,1909,1919,1922],{},[46,1907,1908],{},"React + TypeScript interface to manage campaign status and review flow.",[46,1910,1911,1912],{},"Zustand state model with guarded transitions:\n",[43,1913,1914],{},[46,1915,1916],{},[772,1917,1918],{},"Draft -> In Review -> Approved/Rejected",[46,1920,1921],{},"Role-based permissions and audit events for traceability.",[46,1923,1924],{},"QA and content validation before approval to reduce publishing errors.",[229,1926,1928,1929,1872],{"id":1927},"_3-visual-email-builder-appsemail-builder","3) Visual Email Builder (",[772,1930,1931],{},"apps/email-builder",[43,1933,1934,1940,1943,1946],{},[46,1935,1936,1937,31],{},"Next.js + React drag-and-drop editor with ",[772,1938,1939],{},"@dnd-kit",[46,1941,1942],{},"Block-based composition for reusable email sections.",[46,1944,1945],{},"Inspector controls for spacing, typography, and content overrides.",[46,1947,1948],{},"JSON import/export to bridge visual prototyping and production templates.",[15,1950,1952],{"id":1951},"technical-decisions-and-solutions","Technical Decisions and Solutions",[43,1954,1955,1958,1961,1964,1967],{},[46,1956,1957],{},"Implemented bulletproof CTA behavior with Outlook VML fallback and standard links for modern clients.",[46,1959,1960],{},"Added sanitization rules to normalize problematic markup patterns and reduce rendering regressions.",[46,1962,1963],{},"Included dark mode resilience patterns to handle forced inversion and logo swapping safely.",[46,1965,1966],{},"Created accessibility/localization test templates to validate long text, RTL, and semantic structure.",[46,1968,1969],{},"Built a realistic QA checklist around Apple Mail, Gmail, Outlook, and Yahoo behavior.",[15,1971,1973],{"id":1972},"build-timeline-from-git-history","Build Timeline (from Git History)",[1656,1975,1976,1982,1988],{},[46,1977,1978,1981],{},[772,1979,1980],{},"2026-02-09",": initial scaffold of the course-driven email lab and admin workflow.",[46,1983,1984,1987],{},[772,1985,1986],{},"2026-02-22",": launch of the visual email builder and expanded documentation.",[46,1989,1990,1993],{},[772,1991,1992],{},"2026-02-23",": naming and structural refinements after stabilization.",[15,1995,1997],{"id":1996},"freelancer-relevant-outcomes","Freelancer-Relevant Outcomes",[20,1999,2000],{},"This project demonstrates the exact capabilities needed for modern freelance email engineering:",[43,2002,2003,2006,2009,2012,2015,2018,2021],{},[46,2004,2005],{},"responsive HTML email coding;",[46,2007,2008],{},"newsletter template systems;",[46,2010,2011],{},"transactional email implementation;",[46,2013,2014],{},"Outlook/Gmail compatibility fixes;",[46,2016,2017],{},"email QA process design;",[46,2019,2020],{},"internal tooling for marketing and CRM teams;",[46,2022,2023],{},"full-stack product ownership from architecture to release quality.",{"title":1308,"searchDepth":1309,"depth":1309,"links":2025},[2026,2027,2028,2036,2037,2038],{"id":1828,"depth":1309,"text":1829},{"id":1839,"depth":1309,"text":1840},{"id":1863,"depth":1309,"text":1864,"children":2029},[2030,2032,2034],{"id":1867,"depth":1318,"text":2031},"1) Email Lab (apps/email-lab)",{"id":1899,"depth":1318,"text":2033},"2) Growth Admin Portal (apps/admin-portal)",{"id":1927,"depth":1318,"text":2035},"3) Visual Email Builder (apps/email-builder)",{"id":1951,"depth":1309,"text":1952},{"id":1972,"depth":1309,"text":1973},{"id":1996,"depth":1309,"text":1997},"A complete email engineering lab with handcrafted templates, an approval portal, and a visual block builder.",{"category":2041,"image":2042,"projectUrl":2043,"stack":2044,"tags":2045,"date":1992,"featured":1373},"Full-Stack Application","/images/works/work8.jpg","https://github.com/alefb/kake/tree/main","Node.js, React, TypeScript, Next.js, Vite, Tailwind CSS, Zustand, dnd-kit",[2046,2047,2048,2049,2050,2051,1811,2052,2053,2054],"Email Development","HTML Email Templates","Newsletter Builder","Transactional Emails","React","Next.js","Tailwind CSS","QA Workflow","CI/CD","/portfolio/email-platform-lab",{"title":1823,"description":2039},"portfolio/email-platform-lab","7usylsOCFH1l6kVaCMQsI7chZzZsKKGqumvZUK74Fco","email-platform-lab",[2046,2047,2048,2049,2050,2051,1811,2052,2053,2054],1773091123680]