From b3a1c495a6de4458e68daf0f20489412ac62fbc3 Mon Sep 17 00:00:00 2001 From: Adam Jolicoeur Date: Thu, 1 Oct 2026 14:24:12 -0400 Subject: [PATCH] feat: rewrite and restructure portfolio items --- .eleventy.js | 25 + .nvmrc | 2 +- social/template.html | 4 +- src/404.html | 6 +- src/_data/meta.js | 8 +- src/_data/redirects.js | 14 + src/_includes/blank.njk | 50 + src/_includes/case-study-nav.njk | 16 + src/_includes/markdown.njk | 3 + src/_includes/page.njk | 2 + src/_includes/work-cards.njk | 18 + src/assets/AdamJolicoeur-Resume.pdf | Bin 46504 -> 97638 bytes src/feed.njk | 2 +- src/index.md | 52 +- src/pages/about/adam.md | 12 +- src/pages/about/resume.md | 25 +- src/pages/apps/TimeTrackerPro.md | 6 +- src/pages/apps/index.md | 2 +- src/pages/apps/privacy.md | 2 +- src/pages/apps/taskstat-privacy.md | 4 +- src/pages/apps/taskstat.md | 6 +- src/pages/case-studies.md | 77 +- src/pages/designs/designs.json | 4 - src/pages/development/archparser.md | 377 ---- src/pages/portfolio.md | 52 +- src/pages/{designs => portfolio}/alm.md | 27 +- src/pages/portfolio/archparser.md | 196 ++ src/pages/portfolio/casim.md | 63 + .../color-picker.md | 13 +- .../component-library.md | 15 +- .../customer-engagement.md | 4 +- .../dashboard-analytics.md | 0 src/pages/portfolio/portfolio.json | 4 + .../soccertracker.md | 29 +- src/pages/{designs => portfolio}/task-it.md | 20 +- .../{development => portfolio}/timetracker.md | 82 +- src/pages/timetraked/timetraked.html | 1743 +++++++++++++++++ src/pages/timetraked/timetraked.json | 4 + src/redirects.njk | 21 + 39 files changed, 2356 insertions(+), 634 deletions(-) create mode 100644 src/_data/redirects.js create mode 100644 src/_includes/blank.njk create mode 100644 src/_includes/case-study-nav.njk create mode 100644 src/_includes/work-cards.njk delete mode 100644 src/pages/designs/designs.json delete mode 100644 src/pages/development/archparser.md rename src/pages/{designs => portfolio}/alm.md (89%) create mode 100644 src/pages/portfolio/archparser.md create mode 100644 src/pages/portfolio/casim.md rename src/pages/{case-studies => portfolio}/color-picker.md (74%) rename src/pages/{designs => portfolio}/component-library.md (91%) rename src/pages/{designs => portfolio}/customer-engagement.md (98%) rename src/pages/{designs => portfolio}/dashboard-analytics.md (100%) create mode 100644 src/pages/portfolio/portfolio.json rename src/pages/{case-studies => portfolio}/soccertracker.md (70%) rename src/pages/{designs => portfolio}/task-it.md (95%) rename src/pages/{development => portfolio}/timetracker.md (56%) create mode 100644 src/pages/timetraked/timetraked.html create mode 100644 src/pages/timetraked/timetraked.json create mode 100644 src/redirects.njk diff --git a/.eleventy.js b/.eleventy.js index df8c0433..141a4905 100644 --- a/.eleventy.js +++ b/.eleventy.js @@ -55,6 +55,31 @@ module.exports = function (eleventyConfig) { return collection.getAll().filter((item) => item.data.type); }); + // Ordered sequence of portfolio case studies. Set `portfolioOrder` in a page's + // front matter to include it; Previous/Next buttons are generated from this order. + eleventyConfig.addCollection("portfolioSequence", function (collection) { + return collection + .getAll() + .filter((item) => item.data.portfolioOrder !== undefined) + .sort((a, b) => a.data.portfolioOrder - b.data.portfolioOrder); + }); + + // Cards for portfolio listing pages, built from each page's `card` front matter. + eleventyConfig.addFilter("cardList", function (sequence, group, featuredOnly) { + return sequence.filter( + (item) => + item.data.card && + (!group || item.data.card.group === group) && + (!featuredOnly || item.data.card.featured) + ); + }); + + eleventyConfig.addFilter("caseStudyNeighbors", function (sequence, url) { + const i = sequence.findIndex((item) => item.url === url); + if (i === -1) return null; + return { prev: sequence[i - 1] || null, next: sequence[i + 1] || null }; + }); + eleventyConfig.addPlugin(emojiReadTime); eleventyConfig.addWatchTarget("src/sass/*.scss"); diff --git a/.nvmrc b/.nvmrc index d9b04247..dbf2bf20 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -v25.9.0 +v26.8.1 diff --git a/social/template.html b/social/template.html index ca1f26f2..799b0f7b 100644 --- a/social/template.html +++ b/social/template.html @@ -6,12 +6,12 @@ Adam Jolicoeur - + diff --git a/src/404.html b/src/404.html index 81d5dd37..3638dd00 100644 --- a/src/404.html +++ b/src/404.html @@ -10,12 +10,12 @@ Adam Jolicoeur - + @@ -34,7 +34,7 @@ /> diff --git a/src/_data/meta.js b/src/_data/meta.js index 5e25d217..b233ddb1 100644 --- a/src/_data/meta.js +++ b/src/_data/meta.js @@ -2,19 +2,19 @@ module.exports = { env: process.env.ELEVENTY_ENV, url: process.env.URL || "http://localhost:8080", siteName: "Adam Jolicoeur", - siteDescription: "Product Designer who ships code—and understands the business side.", + siteDescription: "Product designer building AI-native products, from interaction patterns to the systems that govern them.", siteURL: "https://www.adamjolicoeur.com", authorName: "Adam J. Jolicoeur", siteMeta:"Adam, Adam Jolicoeur, Adam J. Jolicoeur, AdamJ, Jolicoeur, adamjolicoeur.com, www.adamjolicoeur.com, mindreeper2420, Portfolio, Design, Product Designer, UXD, UX Designer, UX Developer, UX Engineer, Design Technologist, Product Mangement, CSS", packageVersion: "packageVersion", blueskyUsername: "adamjol.bsky.social", - blueskyTitle: "Adam Jolicoeur - Product Designer Who Ships Code", - blueskyDescription: "Product Designer who ships code—and understands the business side.", + blueskyTitle: "Adam Jolicoeur: Product Designer for Enterprise Systems and AI", + blueskyDescription: "Product designer building AI-native products, from interaction patterns to the systems that govern them.", githubURL: "https://github.com/AdamJ", githubUsername: "AdamJ", githubDescription: "Follow my work in the open source community.", linkedinURL: "https://www.linkedin.com/in/ajjolicoeur/", - linkedinDescription: "Product Designer | Design Systems Expert | AWS & Red Hat Alum | I design enterprise apps and code prototypes (HTML/CSS/React)", + linkedinDescription: "Product Designer | Design Systems | AI-Native Products | AWS & Red Hat Alum | 15+ years designing complex enterprise software", devtoURL: "https://dev.to/adamj", mastodonUsername: "@adamjol@mastodon.world", codepenURL: "https://codepen.io/AdamJolicoeur", diff --git a/src/_data/redirects.js b/src/_data/redirects.js new file mode 100644 index 00000000..87a9058e --- /dev/null +++ b/src/_data/redirects.js @@ -0,0 +1,14 @@ +// Old case study URLs that moved under /portfolio/. +// Each entry generates a static redirect page (meta refresh plus canonical link). +const moved = { + designs: ["alm", "component-library", "customer-engagement", "dashboard-analytics", "task-it"], + development: ["archparser", "timetracker"], + "case-studies": ["soccertracker", "color-picker"] +}; + +module.exports = Object.entries(moved).flatMap(([dir, slugs]) => + slugs.map((slug) => ({ + from: `/${dir}/${slug}/`, + to: `/portfolio/${slug}/` + })) +); diff --git a/src/_includes/blank.njk b/src/_includes/blank.njk new file mode 100644 index 00000000..a91826c3 --- /dev/null +++ b/src/_includes/blank.njk @@ -0,0 +1,50 @@ + + + + + + {%- set pageTitle %}{% if title %}{{ title }} | {% endif %}{{ meta.siteName }}{% endset -%} + {%- set pageDescription %}{% if description %}{{ description }}{% else %}{{ meta.siteDescription }}{% endif %}{% endset -%} + {%- set pageSocialImg %}{{ meta.url }}/previews/{% if title %}{{ title | slug }}{% else %}home{% endif %}.png{% endset -%} + + {{pageTitle}} + + + + + + + + + + + + + + + + + + + + + +
+ {{ content | safe }} +
+ + diff --git a/src/_includes/case-study-nav.njk b/src/_includes/case-study-nav.njk new file mode 100644 index 00000000..4184e971 --- /dev/null +++ b/src/_includes/case-study-nav.njk @@ -0,0 +1,16 @@ +{%- set neighbors = collections.portfolioSequence | caseStudyNeighbors(page.url) -%} +{%- if neighbors -%} +
+
+ {%- if neighbors.prev %} + + Previous Case Study + {%- endif %} + {%- if neighbors.next %} + Next Case Study + {%- else %} + All Case Studies + {%- endif %} +
+
+{%- endif -%} diff --git a/src/_includes/markdown.njk b/src/_includes/markdown.njk index 96cfc42b..effad0b7 100644 --- a/src/_includes/markdown.njk +++ b/src/_includes/markdown.njk @@ -25,3 +25,6 @@ layout: base.njk {{ content | safe }} {% endif %} + +{% include "case-study-nav.njk" %} + diff --git a/src/_includes/page.njk b/src/_includes/page.njk index 5439237a..4917903c 100644 --- a/src/_includes/page.njk +++ b/src/_includes/page.njk @@ -14,6 +14,8 @@ layout: base.njk {{ content | safe }} +{% include "case-study-nav.njk" %} + {% if customCss %} {% endif %} diff --git a/src/_includes/work-cards.njk b/src/_includes/work-cards.njk new file mode 100644 index 00000000..006c4a64 --- /dev/null +++ b/src/_includes/work-cards.njk @@ -0,0 +1,18 @@ +{%- for item in cardItems -%} +{%- set c = item.data.card -%} +{%- if loop.first %}
{% endif %} +
+{%- if c.image %} +{{ c.imageAlt }} +{%- endif %} +
+

{{ c.title }}

+

{{ c.summary | safe }}

+{%- if c.badges %} +
{% for b in c.badges %}{{ b }}{% endfor %}
+{%- endif %} +View Case Study +
+
+{%- if loop.last %}
{% endif %} +{% endfor -%} diff --git a/src/assets/AdamJolicoeur-Resume.pdf b/src/assets/AdamJolicoeur-Resume.pdf index da849a8659dff9a37c4b0e97024487c783c8a9e5..4625ac2cd582f0f60f0ad2f5c82b0c3d3af278ee 100644 GIT binary patch literal 97638 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 Q(J}}a%h98!G*npr2Qhx>VgLXD literal 46504 zcmcG$1zc6z^9M?|2ug#BNK1Ejw{*h+4qejSp>(G-(xG%nOShCriIgCrbO^k|IeM?$ z>*fCb_r0ed4*Tr2`L3C@W@gQ-nZ3vqM8s$r>6lT--mdJfe97O-9C_P?!c5FSY-3=K z!ox#MFJ@-x0JH=Bwgfl;MSzAjMnGbE8KAX^gDEi+I|mCfA0LXngB=iHh2jETsySmf zBX-BLTg_oN>LvA^0B&S8>S`>qZe>y}oOO=E2|k~X&jR3Ku%JWoEcoq?P;2%n)|1KcS{U zXCN`}9x%hS@$5_W&hR(KVNvBJJVkIsu+>p3?s2n&L3L+PcupC*qLIWtWhZRy;l|>l!@YbU7 z{^Dtaw>z8@E|+(fDGFUu5A8<-g3^t~X5o92J>z`<97Ip;O$1-Gej$pqvJRplNu0qu z6@IdD!)*=#X+ISNB_~cPV}Y0#B?-lpk1%Kwkpczpzm!A}WTM^nvrJtvif;34@Vkf( zg3sK0>Oiw490I5{@g#dwS3_X#E}i$4yeD$nZO@dAKNwSc3m5WM%+!yLWiX*`ktWns0qd_8jLTEr!$^-pp6mVmMaL6#Now!pIaPU{&LE5 zRt`_QEL~#t&J)XyNu6@7RS`hz&?T@cYA!P_5ZG%^Sn=)_vx8J=Q-oauw(-#!G3oSW zQQ)#D5vc*9@wlSM@?FV-*b0Vc{*u}VaXq(Fm=w`vdzs{FKTi|CrPP;9ei+RXmSJ{m ze1gJ^6>Aka^}2}4rvWONnnaqGKbm3f#G--UupLHTy+`s@YbIs;gXh^g7@ZFum+uI$ zuh3Yjyl1sYCb^p$q$`|MV)}l?KDrTZQgXkJ+z01luVjn{->`0*PWKybzlWM8Qc&z~ zt;BrM1|4>vRk8Nf?juInx~AA92Dm+#4=XR1L(Canrxi31#}rInjqui|e#pbS7?MQZ zJ~3M&h!>Mo@)@YiBZUMYL>t5FAnE*4u*taHY2d!tn8>CS3{{=dV{-d|H|zQRXgEQ1 ztA_)3WpME##t&JTb|j-v8FIVA-(i#YCkoAQKA%oQg}EDMO^wWG247ci))m?vtvW$V zmH48JNeY$g;XAL2p%LvQ*!2K0syy?q=*u!gR6|)4JiI3_j2RxD1nKvEGjP;qXY;1+ z_eW%sU!u|ga-kYf6_M3w=Ig%ySS?z;6jGo%>KM(4SegCca7A@mvS+di4VymZxv0th z+1CwoW$4*Zyy%WZ%((1ay|R45u)tm-v@uBx`VdSj0(KGCplyAv#~d#;S_kFhDdW3J z$6H3!$CDJ7=&YWl_9KPAK2kB8#ah|m-F)rLB1Tkqytn!(p<~pAqamvGrEl`qU}iW` z1iOEav(|JV1IC)AUacbLTRYf?v`YTQGh_GEtjLB$Z)2@|q01YIi05kbn)nQtdwBrx zmom&RCPY_6e2Y=aHi_Y7MaWhl0x(ELU_#Wu%E`drUG#f6q({}JPWGOK=00P1g&Knm z9`^DHKA!?l6WIa$B0is3Ho|my{80B` zqp-Vt9Z`xZG-+{>U!g=qgOGvwB_aYXEJ|^YoD8V|6UiT~EKL%_%3Xk}X_T-j*E-G~2l>*no7ZK)zpS*OvH|l$rh?MoS`jv;w7KMVQcumfn6aPCSFFCB zXYDE0-!_YHV~f9+TsErlRC&%L@xo@qE816CTU4u9-{gG5O7nGsi3{!11j6T)nZbzd zNg7UeEpqB#4H6v#Z{aifxmLXmf6NhTHAC%G-Jy{VP##4?`%>ZB(UT5fXk%?lut@1z zM{^%f6j3_++RNsKC>|?O%o1M7`>~UZO|dU;$s{6#o6q&$APzJE9zVT5yw|$?7_u+_ z@V76YeU}%BTF_$oIp9R_;loYpa1;{WUBcF zH*?RQ(Dp5qP?V@9%*uZ$2!5g;QlB~ipfSP(I+g*kibyNzXb4uk+FkwjV$`i%-JTzub$sPnP|c%`iPx@!Am2u*E!t0HL(5 z4-cr#Aa{6AtU*|>4zzmF`C#14p)9+Xx>f8^>@9TnTXe=zO!comw!*e<;|K=+=EPlo zId(ip9}-k;RVzB`3qI21nWo^h<)C9qbH0nk-g=S0m@-tuVTKVSKh%3S$e>ivIy}={ zfxg;e3)U$1=$qf$9R~P~5F4{8DVz8z-KB09)icw{eYYZ~QXgu}?gc-gQRrV)2el~v~N?=iSz|Bq&&x=SA%~+e*K1eitbqlHmd2cHV9W>2eOW)5TcVX?*_f zMzxzM<%6l1!oGP}t!jqcjbkw(VRfsR3t3I}Sqs3<0M6WAm%#;}wt#y5#b;@AP)|OrfxiszbW?chiOzkWxkAnrW=KFqhPd~Ph z)qN@<>D5Ch+G3VPqng^?vVMd>U87bg<(o0YBQ?}dAk6bvKiuS8KPJ6e5|OGpr<$f| zn4RMTRS*`3yKA=4^kQhtszY?&6JElR)`MJq?RCjuG7c@uiRCpq?;!M{G^NV*SJ9r#2mfgRqS95 z3LJ>(MSxCbhCoGep+BRCD@K1CU;G+Uq$M~jD^24B4>z$ljocw2Cfg@)LneO5ErAX9 z9yLaX_Fn#sRk&8?|yLY4(iZ8ELrMU+h5wW@7(Qwdjx}r0gbK>-MVOO3@3gp z0yF--i8nd9K%%SiaGTD@sBwm-MSf^@Vq(t)NECP)o{5LG=VT}s&DP)T|VQ^X6Nn{^Q zay$@$P0ErfP%B52V`IlJWS|(ZlJy4G$g?b;Gl^p1Z$ICKfkKLV%lXC*J@karG#$z% z&ty3S?zyBv9_Cb%*~;f0J_s>%vM zU}dpHeuo%p7apo={>9$?AWPktx1Z1`P(wF2E$yK*Ea)D8W00-%g>V*85lrAPaHNnKf<_NYUMN=?Cqd=k{z46#65b?dzEU-)+^`JZhITh+85qoTSp@bj7l3Me-!FYbr!eB({ zX?|l`8eMK5$>esicKQHSJH&cXMvz2l^$;!6$c`+V20v#Zz_JbIP86a;CJKu$9Rm!F z{w*ROW?R^KVyFNg2@Kc-SUL$9GXb~?LB97;D1wadp`HBAZK1|}-A3T#{Mc*}wBgiR zZ`q=v`G^ak1hq*sK+pS{A^Cm9z|Iydio(ggoh&qoL8yu3DlDkLfd$(s{5%RHM&M+G zya12dzbH#sfp`Cr13?3lj{j*U;s`Md!a1~O0A>=*7~s}>s2ZQ?SKLHM;_dw(MO?67 zAmX;pEK1ek@S)eX<1P|@g`x@6YmY?|=s|)V6;nqd{3aq4rA`Ws`OqSoBp0SoG$jf> zm#{uuBKqkvEJAP=APEnr3x6qCBW%$?6)8YxMcjachzM zo68&Od8{43+imt=4Llw;qj(c}-(QG)(A7c_g{%o@;dlFC0x_v2sWJuu(i+lv0A@SO z6W;=P2a+HR*SFdRRIel63%-#gBA1KBk_;lnRV1ZKuJTouG$+v^=Ou4?7~9KbByNYN zA)qT?Mw&saM|L}gUm=c?97|q`NK|NAj#H{$z*WFi_@&~l0_$=0qNIj2P5CAfPbp7& z@mS`>y~L&7(%9l?i}){z?qu?DQ;E)rdUP2SdJny&F7m$D!8~abXjAgdd8L{qwpi89 z8z?E7k{xgG%pk?!xq<&D*3KtnZ(@97YVXJw3ar0+NA~g|fza4X*LQVQvQ=CkfFBs{ ziL>XPjm55a?mzh4w2urV18S{Mt`MydtW@?XBD6E;A2TcBzYL2FYYdCrV_B^qUK*ZZ zD>u`c)s@v7muTivPoLB|H~Ml3-JK{Ek9feJw)OBXACigikF%1X)_OLvv2CTcaD z=8EQ8wJt+^^7eqTFeEHrMgLuT;5h(G9u3Z}LdWQAn40MY?Di-wPiqKikVb2M|f zyEqJMo`!tmThbzb^*l{7Ml!rtR_Xotyt017aMduH#i}VeOEGI>clN7U4UH19$xO}; zo*s`J*VL28sJx--p=mgCIC?Z&G)lBzXdY-#X~3&nRc*XF?fCFE#X`r>vpdLq$*^)L zZ*H}^w2*eesb$NPJ4NT!98RNLdRrgt9xmvVZd2P&*!H)S(J|7p~ zbG~rCyUk9`#h&!XfOD90r_;H;sjq9NQ)lvU9B?JbpHXt*#NbpB`B0gV@4!34b+kdZ zHTpfEf2T*PJ&pq-^j+8~kO!F+O$Ynb9*>TOrG$LbwNAyw%f%Uv)<9H5_-&&^WY4=E z@z8J_X&h&=^P_j%CTXG3TUaK~p1DLD(%PGs&{r7tJde6LAjai)?O`4r9g1)!0Zd;(222Pe~&(zB~>$Ej2 z9yEW6v?8{WnEu)?)*lWeT(AzAAAgeh>-m9@F)D>1nsk`Nsoc_q)aG3d}k6$8a1EIlq1CK7O#1j>a?X8sb^B zPH~=bSTmv-qM0>0JNdjOm(9#w#(iPkXDsdB&^=oI)Ju>3u*2k(%03h6;pidk7pa^X z&R)AhU4h?1pW_B|sX6d9R4u0u}K-H4!38TXVX^D zdHCf0#`FZeO)sK&`5b=%7Ggr(AmW_ZuFQ=K#V`NIa!m59qULfBA*(`~wD_eymN>Q)*g|zta}+;XoZ;ns)?{MP`}V8F z=$B-EsriCt&eO?5t2Lv~%VW-FJ9+sb^To~lhrZ`oXNLRT(d(P?$MW$R;rz}X$lrHe z$gPZ57mfn<&i?MEUwOU|&y`+MSXc;P4>TeMJFCAsuRkC9w@q(mW+u+RYx(GSEF1BMeCwN*028J@!21(enN05nnxN-p{ux1LT8AE;v#W$BQ|A3;s*i8;*EJZn zR7`sf%?7eAO_b3TZL;-OaxG0fu;4SfG$_t^fAsjhlVhbc3gED^ijVXp+HAk?TTE+nI*6FTGh*&N@@||TYr5?XslQ3tUr2hUx<`t{wda()27H>Iw#u2Pt&Nn zz$4MdwrBKDyU6dHA;!(1p??;4!a&%fnp-7O2aYF(cXqtQ*pzte2rw_qaIIK9GmqVB z=G3gV=T5+-s^rdKqG$7JP{=rp#H*+9D0s7lqGrCpz*Hvehu%kqmu@ZLmEZD@CY$lreyYM zGOS9haudy~hEe+$$jv$1b?$r3#e5TMuyA5t-!I)Kj)E-4=F+qqzin(LcKO;`9dc<@ z23XU_r$6G44_pkXlBVy8767)Rt;;&{XF&IS_z10j+&_YDs}V7QSo}mHUH!4G_DndU z^f!+|^K{E%xjPo(qi(t!IL|zbp|+h-(rYafiKA9&(55$c*$Qpj9`v7|(J7>s^`y+L zAY`U8bT|qVdTY8Urk~r-hfY*REW1TC*`6;|dsQ2+bcalkX_*{pgu7MBZ3Nu$y5ul< z+G>nTGqXKDEt)0uZr_K<8*8HYB#7b!m}bT4-jgD9@jlm^zS|9nw}(+r)PuhJS)RIx z(mp3uw>Alx5=%$e3soB{Vb4e2FSNDX+EaM>ja+G?n5phxeh6n)f(v_v)3lVyN6RyV zD6e!N3EyfIA+Z!JO>5ab_OeVPL_(cRK9i?@vF8+Vh~U^J>fBJ(MggDHo>RHkO73F= z{8Ql)sF>7@ZF1j3+%ya-u21D&MS~l=yfmhDPm=E!G)s&Z3BbYQcrMqH99Og~H~>oT zxPHTjHlg|0O#Lx|4+@4(`vtY;s!wb{U(Aac_7N!Uq4nzO#)a0ZCJqJ%C+LazB{VLhmhqW%T^kMBhjZe&!$g6E zJ|{l*BxUH>lvs@`1+22~p;Wgk{q}gLW3X?(DeA4yGvI*=!J!$KC6Ku7O0_TdWUS`Q zrS!Oi;Cm)v-RkT;K;dA7zXz%|cUXeeMuW+#@zIws+%Toel$i-`6Yt8Y5(w~;rAL?& z>Fy&S3<)L@JWH^)71=r{9I^Q@m?`RQ*OUC$HX z7Ke!z>b%$pjX*a^%j$skh}aobPIfOvOe-uMxHS@N)i!#V`3w%gp_-g(-yr+kqkhge z&BKsu>MhsBJ94P)1$y z>fh}_rOhBg>K2dMsv#q>9il_74&A(qv!nRzVib0?SY}-Q-gfr6&|UZ}<}*@hD4}|; z&7Bymu+%saJ1(>s4AGu&+u(s3U%>cOKaQ84;OD!i{TzG_w$m^hNi21(yom>1j)&#t zXImECCb$d`|AB!;*0nGd?o3U2X)QjZI1q&tZ!)qg}+ zpp{1x^<)>PT?~z;ZYyXncJskocQ_$GhbJD=I+L7-wU&%$NaxJASKSzJlZ$y3~VpNypI zz}Fz{PJW4(Zgv+A?ijn*yF*|9IgVFz5~!-?jTEAxq0JL}LEG*JGO6d#E8-uKWnU|! zqYr8#IBi-~Vm&mJKRwvA9p*s{I!~SZdhdJ;m(dnSF3XuIhpbQbGc9s{N$evIK^HRi z>r9`A${>iYqB-h!XUkfvjPgducq52lTR2@ys^B<)>|SU zx@qx9np?oJAR#R3y`V|5O$DE}!YXEykmwd!D|~-!g-B0jaj}z`WlhFcj;#wmrNqeG zQR=h1II=?T*!&d?*^cQPhNj_X;F4!dt$eS@Qde%L*gcnJ%(GvcM(tW zEWRi=W)Wa)scq7k#S?`v zWu`%0c5K{$=_;bt!x`EeYRdaYG|z6HNLx1Lf zm}AA+2*7=!WS5KfkonE4RD3b!LBJH@BN2pc8E0F!rvYhX8A2>9j^RgG$Uz63Ev6mR zYl*#{zSOBNMNFL~Z)K@D-cOpth|0{Msx_4ipnMYq_ollVW$>Zk!1V`vyUlpJ5ZkklJ7J~8s_>EHKoVcM$RNT;a| z1W-IE8j9<91q7vev*pW~GD{ZlHA`Q*se6dsRyfZX3x~%L&`x-r*fGi(U0xN*V7b!M+#8`VH=&q<`BI{v?X1G%2Eim?p<<`flQ!#^a#6mXQ+4(t}{# zFOtwqrY&C))HnA6pzzD!SKv0*qi1}irR+)ym=o|C#0IKL0}pa5(U|%UVBLLj@$}w8 z)6Fl^CJ5gSqn0{RSaRN>4>v-7|LU5@MZ_BShIJI8#`KQOa-VPNRBJ_ccxjqdI1y z;;={&43cApUT`Mvc&rV0kha7`igZLuIvQ|tNqX%1iY!~ED}H(zu$wX7LGivZb=Ur( z_si%gZ*JvDBhex2UU~lL%G8qs_}31*d&A4$4dy+}9r)6o<&TIl(yFi*EHPl-)lwQP z6ds^baU6X0VS{my73P3XNd7RU!bT&`Gn9Hh=mk9z?R>8{E!(o?Ylg3FogrZtY~-Pr z(f#lPwytA}j?{5QMl%>KYBlNo7q{^TmyBczWX1TteWH~13)aD*APwy;O$GAJ^SrEK z3Mp&Hwc~$ReOGqOi?rNt^I+RIH#s%;Xo-I3JDKa2@uh_1n}eJ&mU(O;-VB;^7MHM| zr01ecv_~BzkEWSgdK^b|i}{Va*UoNH7Xq zENss%{y_(bOjFucN@y5@B|KuT0dhRl(T>FastNm^izXPN(PJ>4W zThp4~lnZORWlUt7`y5=|9=pElkP&^SR*}4Z*jLtWt1FVeQ;}%^jnmNBqqTG!GXS@p zg|wEX{%KAcVLC=4VKved?=5k&ue}sAJX2W91nn^aZNi_(=~dp@B9%~t7w)_cD6`!c z2r{u?e{}yvQXSwcw*w869lm?xt^0eK6pu+gFA(f0W|UUu?%uJCQgN;MM(GmrX>CN0 z?-Z6=j3Jg{w4YW$wt7GOvK^1OCXeX;zulj`)dyT){`aoI!wbVZDBzPml$Teb9Zc0LTf-1k#l>x43Szi)Q* z(HkX3=9WP^m(3H;oyj(8@2Cnms>)+1{RE-voIc`Pc|%#_D~Dh}k2!|Xg+SebUtdDA zU3L9N*N3LGbYP@whkTeTht}Y4i|wHQJ}RUESR4UJY<)C)Zi3BTLaFkanQ}mEj!i~V zeOXM`M|Ee&ai@pPf!TIW)=d$%FV91^oKt#T=uk-Z{TSkk8}9ViZ0+zbTA$LnWibA-3fDJX~C{bZ9kL*-GuS}ECj z{lbUcmY*LU@t%wtqsURT*fpF?z{xG-WM(?P+ssKYpM(1XwRp0P?Q)wabQFMx-5V9B zE9r@OG@r5tZLc&W!_4u56Jz=DGj$?Hw-k0UnLBtcetBQN1)3;v?m;EpPh>E_z4MMB zp-^#-GFsKejuLPhIIUcLP_&H#AORGSS|TKw*T6UV0>pU)=lL?>P$n5=PF}t;f>R|YiIwE-Kn%7)y!(C!0gq-i z;Et`ohD<@(hpOx-0lM!B7sb6)`rZB0jqLEaXGa%xMNcIMp!>26cS0;3%$SB|Wn1l- zMmA$kfwC&7{vT>ePB!OOR=A-X?u9c>ydBREI%0_R&6O1ImqJ)gb*PUU5}4o1JEJ#KJO(o;!mL6sdV zTu>*<{ZTsKg~^Hux6J|5Kx;{p5XF*yPvn`iZ&FHDC|#&A9|lTCOH-fCm*D0fQPQ0x zY~biOWWN^mxu07{Gccn3p{;CzPh6CuzazK(a~4wGDqQ9xYz*Q7JtyeQn8b;E1- z%M#}z>toNLTZX!*8oKG8vC5FrG&uC;sTAHRbM@ANpAgvZn-D2^C{C|(OCggDBjn@O zhWQy#cDz@)PuFFOP8T?w`MCbU1|8n}fLV%3994p~Cj&nBOzGH0pSuK(0-_RV0(@WG zP3(+&#pKQGa;n{vhrr~z=<9KxB&fF&{Sx^M%S4+e`_}zY_ej?iXw^e^*)6m$wsa2b z_b#+93 z*YQg*3QZP&x`DvYdeHUN@8z<90TNr1Gi%ts>ivxnTHyHf1tSABPAn6gINSjjiR$;t zqDO<jQPVUL!YrO|x~J=+&w3)UpEb?}`39Gvb)&o#3{_%?VT%d1KW$94 zw?6dhS2RT0G)H{!s7|hAIS~3nY9fbWSfPPIzBcV4{6?_-LcpA2sUaP-{JPQ_lAHTC zuLuBU#Ey9Am)grBt=h+v=40>3A8+Z5Cl@r(L7Ns6KcGhK7I?2u_}<%e1#w5^cGB0w z4H;HM*jqH?1~kb~xhy#3xx3l2pRrS< zN2DEzHq6fhvWh3sky49{#ien}4~yq+J@ypK4k|RiE265lmvnn}g>nmbwVixGdaxDi+w@hEtnrZ0@avNSqyh#l@CAW7*OBv6cwlZQqcgf+>q#tFRcT_5INUV3vo=!;T zQwDA=0}Y~1iZ^a{Q$&4}o%*km@yC0)J*k*UYtY{p>BzUYVok+vWRhhIb8`@`02ogyI<4}nBPm&wgLB%V)^t4%*P_~-#Ag+pc68$x^Kic1 z{3NmyhjfOJAWV-i<(-}O{zdJ~Yrn!Cq?K}NSG^Uuk`J3sXdknmF29nn6x{U#aBSon zX4>A**C4w01%XY}$<$F-O*oOz8#cF;F)Yt;>rIdJsS3VkeH{0Yfw1436VS)3KdY8^ z$uNc4L)~3sgbAES^rb!*`UAzK_T~5b>fO|YzCF3+dPq!x=Im%ZN$(P-PDY>cH<8a(1=Y{6;D3sIAhlh;L_UzhtN$VL`B{#2 zm9P4LTLt!ihm z6cz{y3j~D)g2DnpVS%8qKu}m9C@c_KSimSKtPm7d2ns6%g%yIr3PE9ops+$vSRp8^ z5ENDjEo@*E6gCJ78w7<7g2DztVS}KsK~UHrC~OcEHV6tkgcf!%3W^T#FL5q-aBrLz z2}baQKp^N9Oo$=0fTo7=8qgIPHv%dA6AsfgoGU*5cbqE$VTTM0J7iecA;ZEB8J26z zf*-sQTgJ@V0!$`kG_SGC@++C(&TfPP)n;1%6BO$;s4IeRgu00;wrf!TIte#X#r`W4 zSix?j>L2Hm;~LJDB;JT40V)y&Y5Z>ljPn}Ml`P)~^p6CA%2|IAd9aoEk3iQ%9&Bg+ zBhWRO2V1Hef&O`nKxGcU@^+;IHzNJ>AYGGhu(|w?K-Z)jY;gZ0&^6fxo9zDxbWO6s zM*lwoT@!8avhg2*u8B5y;kgm$pXVQ>H^0n3cB`LCi1d$=1o8xa z1-i1%{}Je#Y=f8J{~HiwDY)`it_e4I75}eD*Q6Wl2;7Jy^Q&)Be`gf3=5s*S{OgSVtH8A~+yqaza%9`oLX1aWg1n9)8H~m3`ub*bYvJf?b0HH{A>enTH>gU7rU~B=w7C zf$?v~`Z*83N4vH*fXCoww7)Y7u^pU{3AxVbzq(OBH0#IM|Aoq{~9p-VDyJ{{e{tMx&X$%nY5pb{vPeRKK!fb{=W(NY@QW*H!~?On)QN--G2p)E%@1@C#AkeSsUHZXoKK=!3Tw{wvb8H2}Oj zaU;^-Ob{o;aBxB_5hp}`85w?>B9uS(f51=P3=S6DA6q0~Z-$WpVv86Veq)RvjW;7g ztkDl5ugflIyXBYZfb?)P*dN0CyM-RKZSxBpcsy=K`wg=Yd&J1_8-v8i@V{E5A5(Fi zSSFda{{(ObySBfEjbaO`#b^D>YS3VshxMJ(-g>H!2T^GRL zlym)MYyO85@RMM$0RFIo(!`(**Iz~y(#6g6{V9OIDBPcT*W4#Y@Zj8x_Zxm8W`&Uv zg8CPJ|5bc`^7~_A{=)Ay1%Y&NGkt&X`+K}=YQhM9>HcQC-|!2WY(_@Nfc}NwtHzrV ze;Ak_FZ^HU7qoG3ZGNx1xEbwFejx(=7rbkF!w44koALh6?~mPL#vgg2>-_$Es_BpU zh4>YJq3`qfZ0S=c`;0VweMMe@M8up5#7zJUA*b!`Cw=hJS4`e&j* zvCFSS{rlMebpw#`M?#bFM@I86lX>O+-AEc_*Y8Iz5aK8QNQyE-vZA2lL4Ki-5!`q) z;t%ooLD+Ti;QWg^Tn*{XXn%;u@A0my19%W_#sjOvb$)-CyB~SqzwrA%o4X$q@E3mn zq7MHDbN73^Yw7^b-QLLV4U%_V9sX5N{+=}WLmfaq`!6B_P9gtCqOP3CU!neWZT)Bd zt|Gc$q5f6UZi2cNZG+R{|CzyS3II;2-w1WXuwO-9zib~l!z(U-EZzTwOHdufAN(;fFw!w`fSkC$@psk1|H2{c43Fu&E2#^Ch z0%?V8ER7(CXNdsq4eiWq9c=7S7=M%u(TiGx&c-#f2Fa)_z);b~3Sj-`9WgUIdk0}t zfE_Vta_D6MKfZv(ftX&+%*eqMq!%cl({z8x($!qBfm1FJ*XR9)%2)SU z!IeQjpZNI<=sU{QJr0oJy~1Dz*%WqAvC`EK8>j|}6|`WpgS@V*?@XMmU=(&xO7`kL zCupw${4A&+wyRPhl&cmt&<-gZ$o0Q!VIbxNWk;{t!0n*#fBt6$MS54y{ra03BuC(T zoXjXppcwdygRAzdYfjMS&Q-5h?N>hx#LS@ma#m3Oof))gdDX%Sa@9G&hJqCoxm^8# zxMX4m^Y>@J|1Yloe?|f=epiO!SK0mh*4353{V7in`H}-zfsRbONeDp)Ie?CjyE;D& z^yfmLv*S>-Xh91k2Qe)RDErFD0vbh7RL=;qN|GSUX=W&BZDI)o4IjOrz2Q|69Ve&& z3UnqLTlBUmX}BTDar0zN@AIefsX#WFQB(KJt>vPSrDU*F9qnHdh98`@Y%IuRNj&0+%0>2xM2J7m76z(A!{`3)chO0`f_)A!^PtA`C5x|yJ5OdnwjV;>1(!D zO{ZVOZB(|aGrA5sEy@>iy!6&u&t-$1n^e*=(z=^28+3w?sFs*N4u4|TzFZ}YKil7V z+H@AgzNOT?Cpp`a=TW;%FW&gJto_61M?Kz6;|0%qtWNL8={2n#-s{@6sZ;WZKFv@+ zIeXG@aXj5Er#G(Zk&>K}gQu2n7nOn8!u7!T{-CSJCC(t)Q;kEaK}PAY3?OUC^J#d+r3K92Q!WhQ_7+U9a+!eP1&63~!=F;%h{7CLFN5{>&t{NmHqB zpk^7tdKzra`5Etp;VGUQC(ej~;&Z7bDi#v`l>nN963#=cbaUW+8Dj&t*~br69yeg5?FYsq`IHvq+y-HhD~&8DL`@AuvZWlfc=R=e1Go7}ANyTcXX zv54QC$BguAZ2GE4X4zR)U@{0k`HM4rAIIX*&arD%*_P62CzkaH_f|yXMff&%wlxNRX(*tih+~3 zbN)rS4n$Ew#x6>@nTax~K~(MYR)_Ak3}qBdECyWZ68nXW9H-$ue6(yv}s1k=P#9 z?0r+_BHt8^78EUu#}{A}&>N%UQYqd&q2R@3N^;$;r{5V@yQ>M6S8dWSOED798b$dn zubdjq?M@d7#Zm% zu%Bq|2D-25!Jg}W26*k`+TL2+=$`195=!T-(;G(7)+e)0z2rPqQ`F+=lp3e^j$Aw5 zGUfg@AeR?^W|1r=lU)kyeXsKMgT-XrX{%?EM3QDx}+~x9`G{> zMM+BFSkVN$#Q|*fpfZwH!AVzOA>?ZWITAZBtKWBqSADyH-JksZLGzb5V5J}-y&bz= z+Z3`FK>Ll-cgw-oDT%CvEZwY?A1V$@KeUW`>8RycOz7mFxokCj$lqWaKUdwEw3%#C zyNtWYKTw-cBPcU73Qr|`z_!UYK;UKSKsbe8&e%MwYtYy*hYjzQ}C!^zwUo0H;1H z8t+l%+OW`;7dgoTla!(MI{11k(~YTDJBzEps8^*6@K9L#pI`=5_0uvZGO0!cM+P%v zGu;IuebV7P@yF}7X!Moz5tQsH)J+-VZ(+e;3v^@-W}auJ3OM_0!|=kn!R*r%JSBuX zAtxC2hx=+T@B!_3kWt(`B7PY3`c(Ea9E@(5ff6f|JLuvo4C- z&Go!;n;d~dxQEA5&l4uopF13tF?YX6dnlbcV`Nu5kGZF*DNIYd7#%Gxr1h>QY2}%T zy-gLpabuFe(L&3|G#<<1#m zHc9aqGJYE0g}sHA9-TqCwByVe+2a9sA9x?rgEe=m-(|I**<`3^c<|Ec0{8n?`_VTE z-c=Kfp!|2qT5+c3-{DT|1ctQVBVWN1ULDMiB5#OWuKIOz>}{9TbXnYx&h z*kQv=7;F&sjDPcSM_?`K?rcczYc3HHCY5_5Q$clNTWnRhtdc@@Sg!-5DyutCG0c&j z0Fu%So6r|Ri{DAa9H%j|M$8$JhN~U&JYmiB+GpO%f30cL(V5;VHh_I8L*8JgRK+m; z7@5N5H3psg9nOnZ-BF@&qee?B4d9=u)T-=}ieh>%__g^Mmm2SCaep-~*lwQhu<8BQiAR}iD0Dd=nSOrAG?p$PspjajqWtVxPO)4ms^=~|mx_j0Ro)I z*p<3vKIH`X@z!ty<}w3)>a4`JK^S;57-TBy*}@VB)}~CiPMN=Odk(4RFX)-$1iV^c ztf^7|aB|q@m|sShczd3+`CNEfcJWb@XYf?#BQ>JUFSC_g=C|IKI98|h?WDj;Ci0IG zNz~=y9X-v$IP6r@iH~tpq^q4;zm29>>-4!t{Y}-;^84f7rpIh$sNLBXw{Pv=zb}34 zUYqd9A73p;*Cvw7o>8r#^d*LUNB)|gsNHuKgWH{jY$8Pjbu9?W6yh>zB|-?;C{(I^UW27PpRlV6DrZguy&3DWuQywdM;u$#N`bi?R!zb-o&rJQ-(g> ztSEJefXwrfS{|8)>}y=B63lNdBqMYN*M_s774MQo9>K5=)`=m9>5h9;A<^R~m#-$d zRpC?fY*1`z6n==UHW_-%Fe){RrQn}T&@bXa7R*hG|wh}Z3X_l(bqgu38#3j|J{ILB&(^ql&@1v;Q-$0kPqV(FMsA~J|*neEAHhloy5Xw@oS8`;h zP%Q|oFs;^n%bqS95?bbOu*gJ#3FG_)h48kMmCIU!gIhm0JDPTFmax0?+^NdR;}}(o z-HBJUh%Y9eL8Q1-*qh~K&mhQp5AemlRTY-B9vD#% zr4g~4`j+@{y#S68Q(8>t#nk8akmQsXy?JsH0!o~P=?t_S-V-HAcX6#L!(W!pM>OlN z%<$AMt{y}W#M|I=4e>wtTwgI#{m|lW5IuGXcVu}g7axA`=c;sGb$Q+i7Dw~;f(~l) zA;2~Pz7{F0oVBtxAo5YI1yykp%*jT}!!|8f#05pyXA3kQD~gN9OWoU?5r`9<4GiM< z{A)~Mg-aZgggFp*))HNL`)<2JX-ru56)~d?epO#d^$1bl`}+Sh_ts%?EPJFx z-OQ}tT4hjC{`7hW_O0rlcp189+eE-ggKH=nKxfNUstxj5IbXjEUug_~4;F3u3ZQxhdx0=xEflCu_Tn@2=g{{7Z$_}r>&PSz91L|8^gY~zR+erg z(SOuwm9yTh(msAEiEuSBzQ_~S@)Vs^(l02%C@nC2JBl!I<|bD3Q&E9Uhs9)%Lw|R8 zAi?@cVMC|xAuK-8REvK`-8E(CG@;MAw$Yl9V6P1qyKsxOke8+MtsQh%cfP*DLoZ9G zPJu@p79M7xQd4M$%VJN7W}!-Kjj}S-Ou{9}g-^=&0&_m4@9IB(y^GE0BI(24jv*^z zG#b1XWy2t|-L5>o9*lzf=53R4%sBI_rC|I_g<5@jwy(@rb~VtijJ4lrw16qbd&=*8 zOQ3*Eo{~dhvRJHAswj_!JWU*z>G(2v?A?Y&IXM4!a7K5Zr{Mj!JZ%qVlyK z|3*t^@W`!IIqJSd)N6{QWiMvwqUXqM-I@2a0r25};5Pi2iQsPNUXdgj`2~4m@E$T; zO93>~pbbw3OM%z(W!#UT8-?Z`nS1a?6%jRZ$_DWs7y7K8B%H@xYzU|LY22k zJ(KMqrYIhE@)t-~!0J^yql##c6_R5u75yMjt(|*f|3sB18UJOmx;qP2_^ibZ$0#V= zm1TGr`+2~`1#jrZ1Smli<&3ZP{qTEI7&VsQ3p2DZb6q*Fl%W( zB*sMRS8P?q{{hiUF1A{c(^73L+nGE$G{-3T3ZMuFx4&YCe9HVT_|3Pk&x}Hwyf@j; z!6!C6ly%f+@NgrJqW$_uJy_GRDM&`2iLr6LU6s1!nv`dg$nv`;l6A^0-mWS$uhsqn zO`<`Schr~jq0^U{j0rL+ngQ=Km2EU9=J@2Jqd++;NP_Tv2^=e+#0XI$FLxx~>;y$~ zRzAG`7`YL*%Lb*jQCQz6sKU8T1xRKV;X1_om)H#}A^sgq`(EUxSR*$e45#e$q&)4% zBu}qYlWvZE)OmicAK@?#>41jmyf&ReF3g4Y6}#t)76(^*1g42-=+VI9AotsnBX!S* z6j>*i&T>10!roQ5WZvXxty*qYFI{1`Ez`nc9&DJXgt_^V$_bUws{4<+CQ;dTG?M;{Sn zH=o^E^pT6=L|zwdh|-lI6-m{b=d4&VLr}>{8H-N_0@Vbpv{$sXUuwq}(ODb>LH4K7 z&Fgfm%v^gB_~;_tzL3*i;VQS-nTrg;bBnn;C`ovt__CiZ&06MZC}}(#>lmddlX}$MCuwNX~9A z8?#1@9Pl`Ntbxvlp~iR|lYo1IVYvA$0k?MMGDOYe!@0MTEpZ^I{my<$SBp4jwD&A# zNEVI@wL;ikxl@Fb=HWJe=8pe5>Icu$_T8a}-;yHdMZ?lbw#RDS*80W36Mkci5K+;9 zM1gNU-T10|Asi#g0e5_8P<>tfRL<=u$qUWGf#dpag4=1D8YS(`L64GC)J4A_h@0<| zL`k-U!`+!Kk~HZ%n6~nf1N8_I#Gv)F+d}?XMXmM2Ojp5ny@(ytxui(+X#TUM@Vdo_ zP#N{RGvxYS>fuN-o$YI2BkB+C7A!n2O7+F`2d74EcW$FrRt}H@BMyTzT#59i=BG0V zkU>jm(z7fc-rWM7ibqFMN?v3atgIY3WX|^aXd%v!(r%Xi3&zfGSc^yes~l&s<;GLh zX*MykC-EYOsV#lcZP=!%*XaA2eZVwLWq)93yZNvqo_6TO=L&2Z;5a9zdfiA7Dk+4=lgm`p=q2fNqsI-;2(XF;hNi=3H_HdHbC~${5#Zke) zfsYbeBk!`>h08|L???^#dcoG25PgcN>djv<=gI#G2R?aUo{e5C!*ucis}ZJ!euovS zQ9Ofxg;mjtpJ=+qAyBkIDC=;<#;p*7aZ*R7UbDBHKU4Fjn+_dPzxdG?jD!RV^4=0z z+n*Igl4!dW9Sf$Mq>@+mvdzkfU|&Rd74U$ho6i^fUmvn4iVxB(U!Z#LbQ@Aw514Ym z%)tq>HJdT%XqI5l8Ww3qRAflqoslH6+O%@Px)I17yJ!&Iu(5f1mzDV@%edBpOE_ie z4zLk*+zA(Uq~qtml)#h0L)?j@<3z2EW8{?*C48p*Xh`zfKV82T(iWk;OO|y+1CkeV zH61tq6*i;t3Rq&R$@B z(Dl#BVX^oWm@j>?Jo+vGv5ePHA;d388k2&;G4s~zeVJu&%M*n5kp#H?48d_W>*3-8 zm{voekfnb^1NqWslkgNO_0>r%BU4~3C zG=n-~)WeKTOAHDJBJLM&vHVFb{cDqfN5wA+mIE1!e^Z1$4IF+4%kWJ)^>0|J%~(j0Vv%^aO7Rv3x&u! z7;1=mb&I*zdY0DqVTN3Z4D4jth8jS;nju@$=XI^ux57yn%~T#k$ia+$wJ@wS;|W4t zIh3tg5|k`ORWI!_99k`YDcV$rJ3O$7u3^!IM&&FgKT5=fv(Jth4bBKd&d`^XP z$bHm6SjXKjdlnR5;`)xPN90H}RI(_W|Jv(QAvShCP4=z!C)fje=?`$IqEV4LZqluY zT1ihg_t=-L$u&22i{R#NPx`I#mnh0^bD|TmhZl{-U(toJhd=0M-_5h?u}aRJ4S6!o{T zu_&)AI3(}T%In^HIFI#$ihDek?yrZB<7(1oDfodLLz0bH8cWnB_ej0 z*0iLYuy-ty+Lm(ymGmKn!bp#!m!9(g@swqP9pkb{ouX!)l4{@%oP#rP+Pjr<8lZ(v zk^FJuLb36^A_(QO52LwvFrj`s-DrhxkMcA961AX$*%=>jI$0?Gi zW7U(iP7nP_K&SCFsJL4){deL9*^l?}!?fK$pLDi}GOUhsG&Gp;(dd&WCo8|{aj`Tu zG`J7hP_Q(9YjD4^35IL78(kAm@N6!Ln@it4z1YWt2@tuwJm1HG2@<{Ry`>)bfedN% zAUrcBF=(M;q0LPr1{0y#sD6hXKRXpXJEdCexg*w1k(i!dTLLNVi|A(snGU`H<_3OF zy4_D$=o!)wE0k|o#niA*GTtD2q`pF6X)YqSs6k!zBUVn+4nHgC!o11d^{s2R8~ad$ zpVZlr+=jT8Nv-zXpP4@mCzLJqtI*7(RO{Ca7N9y*OOtRiQ7=M%d zRs*@7Yq6!XhVuyt#1BU&1EwG_Tgs?t(&oHKM;_$?-{iy-LOH}2tu%j`@g1u}lF_${ zP#$w+#s0o1yHHoKzF1lOx%|X$?ABJ|4iMi@jGKzHCTy!R>#i2@;(r8=(K`CMq!V(e zbIyTWjC~mm7^mu%z8%4q{?UCNW`ZrDoZD*MHBNd|UR&q#OOQ}Vm}reW^R2R&KN!-+ zgUcjUEk+nLnT@iSI2pKgu?IfcC-zv?fDpGi}5{4VeTCX+; ziQM1^jsggoP~}F1b&m1A+3PFnr=K{~**|c(9D=_g;(@k|dW7>*uw`pk&@UM1;z<)?`xO*o<#LKPZ|n@elGL6h3`~8Xt>PtWXGScuvlo$zC!_< z(rHM1z`UnS>3^wD^O7?4|H_3B`jZRs*H60t^RqR82JtWQ*#D3o{@-a303OUg(;$BT zfX)Ws0|9vhOaRsb@Co2G0De>c&4mE)1%AH+SO!2g#Iq;tvpkSJ0I28hd;uUM;x|hI zz;ggHCH~D{_|1?2V8HeOyaNDF09Y5tZ|(&nt0w28tHY+FW);ud*(L7w@O_Lt zUH>2%{Ki0Wery7Rd(@y3e!SQpH<+^Zk=pkAhHJNsKjZMaOX^SZJ&NagRb5Z6WBh|Q zEG{wnR&D2_f4Cy`U9ORTSR&LZ@`8QjRY~U>zt(IBzRTcnJq{GP+b1p&QX$}ReedOU zZ5D?&l~#Y~ur?cfS~R8Uo^!&J(Q%=CQ{m`c=ip4PAbthDW9`ET;+eR6&e?OC>z<)* zTHM@63ws_`Cd#HI1L1yB5cJrgfqId-31bA3$kj;kw2araDiL~9sq=HI#`Fsz9gbHu z9g{{V{R)CFr~LiiYwL)3)li6JbfjDP{k?0${+}9>QXx9l<}oM3+XQJg5j0G^bjKJ5 zY`5&amzm~j1q}X~`XVc8#%OG!q7wfMGkgMhjWsRVc zY+Y~Ez8Y1Mz+S6dCCCc@ym znx3gxtiTF!5QV3=o2>PX8D$RL-X$p@N*NLtQx@`sEo~mqbcFh=xFUn+hkrKuhzu1I1HB z59N*r792x<-RylR>K1V8xQ~jA{g6A&=bTOK{#!NWUg6w5cS(_aLJOpgKWY3@c4Vhc zy>$^A8_*qN`-?|i#!bOK-I9K!wN`Z^Q8+_d)JZ}&aSv4Uq$4?_79J!OTqvYzMnzS|WmNWxqqwgI*>_up+a0XAqdEApCowc@tlRzbQ{;=AJslsOfx3xX!-P5JU% zCGG$}ZtqPtJ*hoeNjRXD%qx<ai)X-r|9a!7Mp{c2M zojt64TYRPJt=rIlNzyRV-1P`@=NXx{2KlYu^%v_V*MU>r4+r`>o#Sa9|1T}4_vu^T zzOXlnSkK&*4sFgs4Sg|5<0t1q@GzZ54ux25EgFc``hqMY*@EmUgcNdP<~sz&pFixhcs{~t(CWdpv^>&&8JdcM zA<$@6sr9Z?xrWr9t2wprN>4IS&Mb_w?9hDLMp2zkBCZ0z-jSm#_i=@ZE|R!F9PfTb zSI=*Ze=30$^ze!fdBzu7x_SNUYzmSKu>1Y; zIfUYc=0b9VBz4?}fWI)wgiNHWRcyEL@g{_&d~(lIjcJO=H<4`B5~x zy2n^NY)tk-$_b{zP7FmK1{6ID1|>h(jXEXUje7TU(vV^X%U1n&URI(dyx03|p9w{n z-pymQI!aTV8`@Z+Tw7ny_nqCJnOk&jA=MPf-g;7y)0U~5)MM9FiriHss}IneKmHUw z)OX^wybyu$+NScj$|AVc@< zClzgUzTl)P^sjU6Uhl4{#5(Z(q1zeKNc~E~s~9s4;VIsLN&L)N(z

bKu=(8}`hE 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𝔤jO8hU*O>%B?vTm{2Gj(o?6 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 QGeF84mW)jJg9z;Z0qcGyfB*mh diff --git a/src/feed.njk b/src/feed.njk index 6a03694f..fc881d5a 100644 --- a/src/feed.njk +++ b/src/feed.njk @@ -8,7 +8,7 @@ eleventyExcludeFromCollections: true "eleventyExcludeFromCollections": true, "metadata": { "title": "Adam J. Jolicoeur", - "description": "I'm a Product Designer who ships code—and understands the business side. For 15 years, I've designed enterprise applications at Amazon Web Services, Red Hat, and high-growth B2B companies—turning complex, data-intensive workflows into intuitive interfaces that scale.", + "description": "I'm a product designer building AI-native products. For 15 years, I've designed enterprise applications at Amazon Web Services, Red Hat, and high-growth B2B companies, turning complex, data-intensive workflows into intuitive interfaces that scale.", "language": "en", "url": "https://www.adamjolicoeur.com/", "author": { diff --git a/src/index.md b/src/index.md index 09e4cdd4..400ebe9b 100644 --- a/src/index.md +++ b/src/index.md @@ -4,27 +4,27 @@ layout: base.njk

Adam Jolicoeur

-

Lead Product Designer specializing in design systems and enterprise applications. 15+ years at AWS, Red Hat, and high-growth startups.

-

— I design products and code prototypes that ship —

+

Product designer building AI-native products, from interaction patterns to the systems that govern them. 15+ years at AWS, Red Hat, and high-growth B2B.

+

Enterprise product designer. Systems thinker. Builder.

About Me

-

I'm a Product Designer who ships code—and understands the business side.

-

With over 15 years designing enterprise applications at AWS, Red Hat, and high-growth B2B companies, I specialize in design systems and complex, data-intensive interfaces. I've shaped products used by millions of developers and contributed to some of the industry's most respected open-source design systems.

+

Lead Product designer building AI-native products, from interaction patterns to the systems that govern them.

+

15+ years across AWS, Red Hat, and high-growth B2B, including an internal AI assistant, MCP architecture, and design systems used on 100+ construction projects.

What makes me different:

    -
  • I code production-quality prototypes — I build functional prototypes in HTML/CSS/React, which means my designs are validated with real data and ready for engineering handoff. This bridges the gap between design and development, accelerating shipping and reducing costly miscommunication.
  • -
  • I think like a PM — I've managed product roadmaps, prioritized features, and led cross-functional teams. This dual perspective helps me balance user needs with business objectives and collaborate effectively with product managers and stakeholders.
  • -
  • Former PatternFly core contributor — I was a core contributor to PatternFly (2016-2021), Red Hat's open-source design system with 20,000+ GitHub stars, used across OpenShift, Ansible, and 50+ products serving millions of developers worldwide.
  • +
  • I code production-quality prototypes: I build functional prototypes in HTML/CSS/React, which means my designs are validated with real data and ready for engineering handoff. This bridges the gap between design and development, accelerating shipping and reducing costly miscommunication.
  • +
  • I think like a PM: I've managed product roadmaps, prioritized features, and led cross-functional teams. This dual perspective helps me balance user needs with business objectives and collaborate effectively with product managers and stakeholders.
  • +
  • Former PatternFly core contributor: I was a core contributor to PatternFly (2016-2021), Red Hat's open-source design system with 20,000+ GitHub stars, used across OpenShift, Ansible, and 50+ products serving millions of developers worldwide.

Currently: Lead Product Designer at Component Assembly Systems
- Previously: Amazon Web Services, Red Hat, and high-growth startups + Previously: Amazon Web Services, Red Hat, and high-growth B2B companies

-

Archparser

+

ArchParser

Architectural drawing analysis platform for OCR-based architectural drawing analysis management.

DevelopmentClaude Code
- View Case Study + View Case Study +
+
+

Task Management System

+

Lead designer for Task-it, Amazon's internal task management platform. Consolidated 3-4 disparate tracking tools into one unified system, reaching 500 daily active users across AWS within 18 months of launch.

+
+ AWS500+ UsersEnterprise +
+ View Case Study
@@ -128,7 +136,7 @@ layout: base.njk Tooling DX
- TimeTrackerPro + Timetraked

diff --git a/src/pages/about/adam.md b/src/pages/about/adam.md index f670fc9f..9f4d8405 100644 --- a/src/pages/about/adam.md +++ b/src/pages/about/adam.md @@ -3,7 +3,7 @@ layout: "base" title: "About" date: git Last Modified abbreviation: "about" -description: "Driven and passionate senior user experience designer with a background in software development." +description: "Product designer and product manager building AI-native tools for construction, with a background in software development." eleventyNavigation: key: About order: 1 @@ -12,19 +12,19 @@ eleventyNavigation:

Hello!

- UX Designer, Developer, Program Manager. Creating software for the construction world. Previously at Red Hat and AWS. Collector of nerdy things...forever. + Lead Product Designer and Product Manager building AI-native tools for the construction world. Previously at Red Hat and AWS. Collector of nerdy things...forever.

- Adam Jolicoeur is a designer, developer, and program manager in Massachusetts. Starting as a help desk tech, he discovered a desire to create technology, rather than fixing it, which lead to a leap into the software engineering space. + Adam Jolicoeur is a designer, developer, and product manager in Massachusetts. Starting as a help desk tech, he discovered a desire to create technology rather than fix it, which led to a leap into software engineering.

- While working at a small startup, Adam discovered the world of user experience design and realized that his future was before him. With a background in fine arts and knowledge in the software development space (Backbone/Angular, anyone?), Adam took another step forward by becoming the first ux designer at a financial startup. Leading the next-generation of product design for card processors and financial institutions, Adam took that experience and used it to catapult into the world of publicly traded companies. + While working at a small startup, Adam discovered user experience design and realized his future was before him. With a background in fine arts and knowledge of the software development space (Backbone/Angular, anyone?), he became the first UX designer at a financial startup, leading the next generation of product design for card processors and financial institutions.

- With a move to Red Hat (later acquired by IBM), Adam accelerated his career path (and filled up many pages in his passport) by working with industry experts and the open source community on enterprise software experiences. After five years at Red Hat, Adam joined a small team at Amazon in AWS's Safety Engineering group to work on a new issue tracking and management product. While his time at Amazon came to abrupt end during the layoffs of 2023, the knowledge gained from such an environment only strengthened his desire to create in a collaborative and forward-looking space. + At Red Hat (later acquired by IBM), Adam worked with industry experts and the open source community on enterprise software experiences, including as a core contributor to PatternFly. He then joined a small team in AWS's Safety Engineering group to build Task-it, a new issue tracking and management product that grew to 500 daily active users across more than 15 teams.

- Adam has continued his career at Component Assembly Systems as their Lead Program Manager and Head of UX. + Today, Adam is the Lead Product Designer and Product Manager at Component Assembly Systems. He designs and builds AI products for construction teams, including CASim, an AI project management assistant built on MCP, and ArchParser, an OCR-based tool for plan management. He works in Claude Code every day, shipping working prototypes alongside the design system that keeps them consistent. Outside of work, he builds local-first apps under Brimfield Labs.

Education

diff --git a/src/pages/about/resume.md b/src/pages/about/resume.md index 78efc17d..5f4f32f1 100644 --- a/src/pages/about/resume.md +++ b/src/pages/about/resume.md @@ -1,11 +1,11 @@ --- layout: "markdown" title: "Adam Jolicoeur" -description: "Lead Product Designer with 15+ years at AWS, Red Hat, and high-growth B2B companies" +description: "Lead Product Designer and Product Manager with 15+ years at AWS, Red Hat, and high-growth B2B companies" abbreviation: "Resume" date: git Last Modified primaryAction: "View PDF" -primaryURL: "https://www.adamjolicoeur.com/downloads/resume.pdf" +primaryURL: "https://www.adamjolicoeur.com/assets/AdamJolicoeur-Resume.pdf" eleventyNavigation: key: Resume parent: About @@ -17,14 +17,15 @@ eleventyNavigation: contact@adamjolicoeur.com

-

I design enterprise applications and code production-quality prototypes. With expertise in design systems and complex data-intensive interfaces, I've shaped products used by millions of developers and contributed to industry-leading open-source design systems.

+

I design AI-native products, from interaction patterns to the systems that govern them, drawing on 15+ years of enterprise design. With expertise in design systems and complex, data-intensive interfaces, I have shaped products used by thousands of engineers and contributed to industry-leading open-source design systems.

Key Highlights

    -
  • Lead designer for Task-it at Amazon Web Services - reached 500 daily active users across AWS in 18 months
  • -
  • Core contributor to PatternFly design system at Red Hat 20,000+ GitHub stars, used across OpenShift.
  • -
  • Built comprehensive design systems for enterprise construction management and financial services platforms
  • -
  • Code production-quality prototypes using HTML/CSS/React that validate designs and accelerate engineering
  • +
  • Designing and building AI products at CAS, including CASim (an MCP-based AI project management assistant) and ArchParser (OCR-based plan management)
  • +
  • Lead designer for Task-it at Amazon Web Services, which reached 500 daily active users across 15+ teams
  • +
  • Core contributor to the PatternFly design system at Red Hat, used across OpenShift
  • +
  • Built the CAS design system, accelerating development cycles by 25%
  • +
  • Code production-quality prototypes in HTML, CSS, and React that validate designs and accelerate engineering

@@ -33,25 +34,25 @@ eleventyNavigation:

Lead Product Designer & Product Manager
- Component Assembly Systems | 2024 - Present + Component Assembly Systems | 2024 to Present

Previous Experience

- Senior UX Designer — Amazon Web Services (2021-2023) + Senior UX Designer, Amazon Web Services (2021-2023)

- Senior Interaction Designer — Red Hat (2016-2021) + Senior Interaction Designer, Red Hat (2016-2021)

- UX Designer — Saylent Technologies (2014-2016) + UX Designer, Saylent Technologies (2014-2016)

Download Resume (PDF)
- Last updated November 2025 + Last updated October 2026

Also available

diff --git a/src/pages/apps/TimeTrackerPro.md b/src/pages/apps/TimeTrackerPro.md index 02f76c88..2001b535 100644 --- a/src/pages/apps/TimeTrackerPro.md +++ b/src/pages/apps/TimeTrackerPro.md @@ -1,12 +1,12 @@ --- layout: "page" permalink: "apps/{{ abbreviation | slugify }}.html" -title: "Time Tracker Pro" +title: "Timetraked" date: git Last Modified abbreviation: "timetracker" description: "Perfect for freelancers, consultants, and professionals who need to track time, manage projects, and generate invoices." eleventyNavigation: - key: TimeTrackerPro + key: Timetraked parent: Apps order: 5 --- @@ -17,7 +17,7 @@ eleventyNavigation: ## Links -**GitHub:** [AdamJ/TimeTrackerPro](https://github.com/AdamJ/TimeTrackerPro) +**GitHub:** [AdamJ/TimeTrackerPro (repository name)](https://github.com/AdamJ/TimeTrackerPro) **WebApp:** [timetrackerpro.adamjolicoeur.me](https://timetrackerpro.adamjolicoeur.me) diff --git a/src/pages/apps/index.md b/src/pages/apps/index.md index 5a29220f..09a45c68 100644 --- a/src/pages/apps/index.md +++ b/src/pages/apps/index.md @@ -18,7 +18,7 @@ eleventyNavigation: ## Webapps - [Moonsilver Waypoints](moonsilver) -- [TimeTracker Pro](timetracker) +- [Timetraked](timetracker) ## iOS AppStore diff --git a/src/pages/apps/privacy.md b/src/pages/apps/privacy.md index 221fcde5..477f68f3 100644 --- a/src/pages/apps/privacy.md +++ b/src/pages/apps/privacy.md @@ -13,7 +13,7 @@ eleventyNavigation:
-Your data is your data - they say sharing is caring, but it is not recommended to share your data. +Your data is your data. They say sharing is caring, but it is not recommended to share your data. - Your usage analytics is not collected, nor anything else - Anything entered into the apps created by Adam Jolicoeur are stored locally on your device diff --git a/src/pages/apps/taskstat-privacy.md b/src/pages/apps/taskstat-privacy.md index e4731336..97cf26c4 100644 --- a/src/pages/apps/taskstat-privacy.md +++ b/src/pages/apps/taskstat-privacy.md @@ -4,7 +4,7 @@ permalink: 'apps/taskstat-privacy.html' title: 'TaskStat Privacy Policy' date: git Last Modified abbreviation: 'taskstat-privacy' -description: 'Privacy policy for TaskStat - a privacy-first task management app for iOS' +description: 'Privacy policy for TaskStat, a privacy-first task management app for iOS' eleventyNavigation: key: TaskStat Privacy parent: Apps @@ -189,7 +189,7 @@ You have complete ownership and control over your data: ### How to Exercise Your Rights -- **To access your data:** Open TaskStat—all your data is visible +- **To access your data:** Open TaskStat, all your data is visible - **To export your data:** Use the CSV export feature in the task list - **To delete specific data:** Swipe to delete tasks or projects, or use multi-select - **To delete all data:** Delete the TaskStat app from your device diff --git a/src/pages/apps/taskstat.md b/src/pages/apps/taskstat.md index 8c962953..4393ffcc 100644 --- a/src/pages/apps/taskstat.md +++ b/src/pages/apps/taskstat.md @@ -4,7 +4,7 @@ permalink: "apps/{{ abbreviation | slugify }}.html" title: "TaskStat" date: git Last Modified abbreviation: "taskstat" -description: "Privacy-first task management for iOS. Your tasks stay on your device—no accounts, no tracking, no cloud sync." +description: "Privacy-first task management for iOS. Your tasks stay on your device, no accounts, no tracking, no cloud sync." eleventyNavigation: key: TaskStat parent: Apps @@ -15,7 +15,7 @@ eleventyNavigation: ## About TaskStat -TaskStat is a native iOS task management app built with privacy as a core principle. Unlike cloud-based task managers, TaskStat stores all your data locally on your device using SwiftData—ensuring complete privacy and offline functionality. +TaskStat is a native iOS task management app built with privacy as a core principle. Unlike cloud-based task managers, TaskStat stores all your data locally on your device using SwiftData, ensuring complete privacy and offline functionality. ### Key Features @@ -80,7 +80,7 @@ Read the full [Privacy Policy](/apps/taskstat-privacy.html) **Platform:** iOS 18.0 or later -**App Store:** *Coming soon - Link will be added when published* +**App Store:** *Coming soon. Link will be added when published* ## Requirements diff --git a/src/pages/case-studies.md b/src/pages/case-studies.md index 05f137e0..572a83ac 100644 --- a/src/pages/case-studies.md +++ b/src/pages/case-studies.md @@ -6,79 +6,18 @@ description: 'An expanded list of case studies and prior work' eleventyNavigation: key: Casestudies order: 6 +templateEngineOverride: njk,md --- +{% set btnClass = "btn-secondary" %}
-

Professional

-
-
-
-

Task Management System

-

Lead designer for Task-it, Amazon's internal task management platform. Consolidated 3-4 disparate tracking tools into one unified system, reaching 500 daily active users across AWS within 18 months of launch.

-
- AWS500+ UsersEnterprise -
- View Case Study -
-
-
-
-

Weekly AI-Powered Work Summary

-

After archiving my work entries for the week, I found myself running a second, separate tool to generate a weekly summary. Now, I start the day, capture tasks, review, and archive - then summarize using AI.

-
- AIProductivity -
- View Case Study -
-
-
-
-
-

Archparser

-
-

Architectural drawing analysis platform for OCR-based architectural drawing management.

-
- DevelopmentClaude Code -
- View Case Study -
-
-
-

Component Library

-
-

Built comprehensive design system for construction management software spanning web and iOS applications. Created design tokens, component documentation, and prototypes that accelerated development cycles by 25%.

-
- LibraryDesign Tokens -
- View Case Study -
-
-
- +

Professional

+{% set cardItems = collections.portfolioSequence | cardList("Professional") %} +{% include "work-cards.njk" %}
-

Personal

-
-
-

Soccer Game Tracker

-
-

A native iOS app, built by a coach, who needed fast and reliable game tracking without surrendering data to a third-party platform — designed for the sideline, built in Swift.

-
- SwiftUIMobile -
- View Case Study -
-
-
-

Color Picker

-
-

As one of the most up-voted feature requests, the goal was to create an accessible option that combined colors with patterns.

-
- A11yComponents -
- View Case Study -
-
-
+

Personal

+{% set cardItems = collections.portfolioSequence | cardList("Personal") %} +{% include "work-cards.njk" %}
diff --git a/src/pages/designs/designs.json b/src/pages/designs/designs.json deleted file mode 100644 index 99cbd6c1..00000000 --- a/src/pages/designs/designs.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "layout": "page", - "permalink": "/designs/{{ page.fileSlug }}/" -} diff --git a/src/pages/development/archparser.md b/src/pages/development/archparser.md deleted file mode 100644 index c490478a..00000000 --- a/src/pages/development/archparser.md +++ /dev/null @@ -1,377 +0,0 @@ ---- -title: 'ArchParser: Architectural Drawing Analysis Platform' -date: git Last Modified -abbreviation: 'archparser' -description: 'Full-stack TypeScript application for OCR-based architectural drawing analysis and management.' -eleventyNavigation: - key: Development - parent: Development - order: 1 -customCss: slides.css ---- - -
-

Project Overview

-
-

- Project Type:Personal/Open Source -

-

- Role:Product Designer & Full-Stack Developer -

-

- Timeline:2025 (Ongoing) -

-

- Development Partner: - Built with Claude Code (Anthropic's AI development assistant) -

-

- THE CHALLENGE: - Construction project managers at Component Assembly Systems needed a way to efficiently extract metadata from hundreds of architectural drawing PDFs. Manual data entry from title blocks (drawing numbers, revision dates, project names) was time-consuming, error-prone, and didn't scale for projects with 500+ page drawing sets. No existing tools could handle the specialized OCR requirements or support custom title block layouts across different architectural firms. -

-

- MY ROLE: - I designed and developed ArchParser, a full-stack TypeScript application that automates the extraction of drawing metadata using OCR technology. I created both the technical architecture and user experience, focusing on reliability, performance, and flexibility to handle diverse document formats. -

-

- THE SOLUTION: - ArchParser is a monorepo application with a NestJS backend for OCR processing and a React/PatternFly frontend for drawing management. The system features customizable OCR templates with a visual template creator, memory-optimized processing for large PDFs, and an optional AI chatbot for semantic search. The platform successfully processes drawing sets of 500+ pages while maintaining accurate metadata extraction. -

-

- THE IMPACT: -
-

    -
  • Automated metadata extraction from architectural drawings, eliminating manual data entry
  • -
  • Successfully processes 500+ page PDF drawing sets with memory optimization
  • -
  • Visual template creator allows non-technical users to configure OCR extraction regions
  • -
  • Revision tracking system maintains drawing set history and version comparisons
  • -
  • Real-time WebSocket progress updates keep users informed during long-running OCR jobs
  • -
  • Centralized path management system ensures reliability across deployment environments
  • -
  • Open-source project serving as portfolio demonstration of full-stack capabilities
  • -
-

-
-
-
-

The Development Process

-

Unlike traditional design-first projects, ArchParser required simultaneous development of both technical architecture and user experience. The process was highly iterative, driven by real-world testing with large PDF sets and continuous feedback from construction project planners and managers.

-
-

Development approach:

-
    -
  1. Problem validation & requirements gathering -
      -
    • Interviewed construction project planners and managers about their drawing management workflows
    • -
    • Identified pain points: manual data entry, inconsistent title block formats, large file sizes
    • -
    • Determined core requirements: OCR accuracy, template flexibility, performance at scale
    • -
    -
  2. -
  3. Technology stack selection -
      -
    • Chose TypeScript monorepo for type safety across frontend and backend
    • -
    • Selected NestJS for backend (familiar enterprise patterns from AWS experience)
    • -
    • Used React with PatternFly UI (leveraging my Red Hat design system expertise) - later changed to RadixUI
    • -
    • Implemented Tesseract.js for client-side OCR processing
    • -
    -
  4. -
  5. Iterative development with Claude Code -
      -
    • Used Claude Code as a development partner for architecture decisions and implementation
    • -
    • Leveraged AI assistance for complex TypeORM migrations and NestJS module structure
    • -
    • Rapid prototyping of OCR extraction algorithms with Claude's code generation
    • -
    • Collaborative debugging of memory optimization and path management issues
    • -
    -
  6. -
  7. Real-world testing & optimization -
      -
    • Tested with actual 500+ page architectural drawing sets from construction projects
    • -
    • Identified and resolved critical memory constraints through optimization iterations
    • -
    • Refined OCR accuracy through template system improvements
    • -
    -
  8. -
-
-
-

Working with Claude Code as a development partner: -

    -
  • - Architecture & Planning: Claude helped design the monorepo structure, database schema, and path management system. We discussed trade-offs between different approaches (absolute vs. relative paths, synchronous vs. batch processing) before implementation. -
  • -
  • - Code Generation & Implementation: Claude generated boilerplate code for NestJS modules, TypeORM entities, and React components following established patterns. This accelerated development while maintaining consistency. -
  • -
  • - Problem Solving: When facing complex issues (memory leaks in OCR processing, path resolution bugs), Claude helped analyze logs, identify root causes, and propose solutions. The collaborative debugging process was particularly valuable for tricky issues like the path management overhaul. -
  • -
  • - Documentation: Claude assisted in writing comprehensive documentation (CLAUDE.md, README files, inline comments) that explains not just what the code does, but why architectural decisions were made. -
  • -
  • - Testing & Quality: Claude helped write test utilities, fixtures, and unit tests for both frontend and backend. The AI's ability to generate edge cases I hadn't considered improved test coverage. -
  • -
-

-
-
-
-

Technical Architecture

-

ArchParser is built as a TypeScript monorepo with three primary workspaces: backend (NestJS), frontend (React/Vite), and shared type definitions. The architecture emphasizes type safety, memory efficiency, and extensibility.

-

Backend

-

NestJS

-

Core Modules:

-
    -
  • Drawing Processing Service: Handles PDF-to-PNG conversion and Tesseract.js OCR extraction
  • -
  • OCR Template System: Configurable extraction regions for different title block formats
  • -
  • Path Management: Centralized path resolution with environment variable support for deployment portability
  • -
  • WebSocket Gateway: Real-time progress updates during OCR processing
  • -
  • Optional LLM Service: AI-powered semantic search (Claude, OpenAI, or local Ollama)
  • -
-

Database (TypeORM + MySQL):

-
    -
  • Entities: Job, DrawingSet, Drawing, OcrTemplate, KnowledgeChunk
  • -
  • Supports revision tracking through self-referencing DrawingSet relationships
  • -
  • Stores relative paths in database for deployment portability
  • -
-

Frontend

-

React + RadixUI

-

Key Features:

-
    -
  • Dashboard: Job listing with pagination, sorting, and filtering
  • -
  • Upload Workflow: PDF upload with OCR template selection and classification
  • -
  • Drawing Review: Individual drawing detail pages with metadata editing
  • -
  • Real-time Progress: WebSocket-powered progress indicator for OCR jobs
  • -
  • Template Creator: Visual interface for creating OCR extraction templates
  • -
-

UI/UX Decisions:

-
    -
  • RadixUI components for accessibility and consistency
  • -
  • Responsive grid layouts for data-dense tables
  • -
  • Inline editing for quick metadata corrections
  • -
  • Mock server support for frontend-only development
  • -
-
-
Dashboard
-
-
- Image of the archparser dashboard -
-
-
-

Template Creator

-

Standalone Tool

-

Built as a standalone HTML/JavaScript tool using PDF.js, the template creator allows users to:

-
    -
  • Upload a sample PDF and render it in the browser
  • -
  • Draw rectangular regions on the PDF to define extraction areas
  • -
  • Label regions (drawing number, title, date, revision, etc.)
  • -
  • Export template JSON for import into ArchParser
  • -
  • Works offline with no backend dependency
  • -
-

This tool democratizes OCR template creation—construction managers can create templates without developer assistance.

-
-
-
Initial Load
-
-
- Image of the template creator's empty canvas -
Empty canvas, ready for PDF
-
-
-
-
-
PDF Loaded
-
-
- Image of the template creator with a loaded PDF -
Document details loaded and ready
-
-
-
-
-
-
-

Visual Progressions

-

- The visual design of Archparser progressed rather quickly, but a consistent idea was in place from the beginning: get users into their jobs as quickly and easily as possible. -

-
-
-
-
-
- -
-
- -
-
- -
-
- -
-
-
-
-
-
-
-

Key Iterations & Problem Solving

-

Throughout development, several critical issues emerged that required significant architectural changes. Each iteration improved reliability, performance, or usability based on real-world testing.

-

Iteration 1: Memory Optimization for Large PDFs

-
-
-

Problem: Processing 500+ page PDFs caused memory exhaustion and server crashes. The initial implementation converted entire PDFs to PNG images in memory before processing.

-

Solution: Implemented single-page PDF conversion and dynamic batch processing:

-
    -
  • Convert one PDF page at a time instead of the entire document
  • -
  • Adjust batch sizes based on document size (smaller batches for larger PDFs)
  • -
  • Add memory monitoring and garbage collection tuning
  • -
  • Process OCR regions sequentially to prevent memory spikes
  • -
-

Result: Successfully processes 500+ page documents without crashes. Memory-optimized startup script (start-optimized.sh) provides production-ready performance.

-
-
-

Iteration 2: Path Management System Overhaul

-
-
-

Problem: Processed drawings became disassociated from database records after server restarts. Three root causes identified:

-
    -
  1. Inconsistent path resolution between process.cwd() and __dirname
  2. -
  3. Directory naming mismatch during deletion operations
  4. -
  5. Absolute paths in database made system non-portable across environments
  6. -
-

Solution: Complete path management overhaul with centralized configuration:

-
    -
  • Created storage.config.ts with centralized path constants
  • -
  • Implemented toRelativePath() and toAbsolutePath() utilities
  • -
  • Standardized folder naming: {sanitizedName}_{jobId} format
  • -
  • Updated all services to use centralized path resolution
  • -
  • Wrote migration script to convert 373 existing records from absolute to relative paths
  • -
-

Result: System is now portable across deployment environments. Paths resolve correctly regardless of server startup directory. Database can be migrated to new servers without breaking file associations.

-
-
-

Iteration 3: Dashboard UI Enhancement

-
-
-

Problem: Initial dashboard struggled with high-volume data tables. Users needed better filtering, sorting, and status visualization.

-

Solution: Comprehensive dashboard refactoring:

-
    -
  • Added independent pagination and sorting for Job and Template tables
  • -
  • Implemented date range filtering with "Created" and "Updated" pivots
  • -
  • Added status (Active/Archived) and type (Included/Custom) filters
  • -
  • Created Kanban-style Monitor Dashboard for job status visualization
  • -
  • Added Floating Action Button (FAB) for streamlined task creation
  • -
  • Persisted filter selections in local storage for session continuity
  • -
-

Result: Users can efficiently navigate large datasets. The Kanban view provides at-a-glance status monitoring, while table filters enable rapid data discovery.

-
-
-
-
-

Results & Impact

-

Technical Achievements

-

-

    -
  • Performance: Successfully processes 500+ page PDF drawing sets with memory-optimized batch processing
  • -
  • Accuracy: OCR template system with configurable regions achieves reliable metadata extraction across diverse title block formats
  • -
  • Type Safety: Shared TypeScript interfaces across monorepo prevent runtime errors and improve developer experience
  • -
  • Real-time Updates: WebSocket integration provides live progress feedback during long-running OCR jobs
  • -
  • Portability: Centralized path management enables deployment across different server environments without configuration changes
  • -
  • Test Coverage: 14 backend test suites with 53 tests, plus comprehensive frontend component testing
  • -
-

-

User Experience Wins

-

-

    -
  • Visual Template Creator: Non-technical users can create OCR templates by drawing regions on PDFs—no code required
  • -
  • Revision Tracking: Drawing set relationships enable version comparison and change tracking
  • -
  • Enterprise UI: PatternFly components provide accessible, professional interface familiar to enterprise users
  • -
  • Mock Server: Frontend developers can work independently without backend/database dependency
  • -
  • Flexible AI Integration: Optional LLM features support Claude, OpenAI, or free local Ollama—users choose based on budget and privacy needs
  • -
-

-

Development Process Insights

-

-

    -
  • AI-Assisted Development: Claude Code accelerated Archparer's development 2-3x through intelligent code generation, debugging assistance, and architectural guidance
  • -
  • Monorepo Benefits: Shared types across workspaces to catch integration bugs at compile time rather than runtime
  • -
  • Iterative Optimization: Real-world testing with large PDFs revealed performance bottlenecks that wouldn't have been found in small-scale testing
  • -
  • Documentation-Driven: Comprehensive CLAUDE.md file serves as both an AI context and a developer onboarding guide
  • -
-

-
-
-
Set Details
-
- Image of the drawing set details page -
-
-
-
Drawing List
-
- Image of the drawing list page -
-
-
-
Drawing Details
-
- Image of the drawing details page -
-
-
-
- -
-
-
-

What I Learned

-
-
-

- This project provided valuable insights about full-stack development, AI-assisted coding, and building for real-world constraints: -

    -
  1. Memory constraints require proactive optimization. The initial implementation worked fine for small PDFs but crashed on real-world 500+ page documents. Building with realistic test data from the start would have caught this earlier. Memory profiling and optimization became critical skills.
  2. -
  3. AI development assistance is transformative when used strategically. Claude Code was most valuable for architectural planning, debugging complex issues, and generating boilerplate code. I learned to use AI as a collaborative partner—explaining problems thoroughly, reviewing generated code critically, and iterating on solutions together. The key is maintaining ownership of architectural decisions while leveraging AI for implementation acceleration.
  4. -
  5. Path management is harder than it looks. The path resolution issues taught me that assumptions about working directories break in production. Centralizing path logic and storing relative paths in the database made the system portable and maintainable.
  6. -
  7. User empowerment beats technical complexity. The visual template creator was more impactful than any backend optimization. Enabling non-technical users to configure OCR templates themselves removed a bottleneck and increased adoption. Simple, visual tools often provide more value than sophisticated algorithms.
  8. -
  9. Design system expertise translates across contexts. My experience with design systems paid dividends—I could build an enterprise-grade UI quickly while ensuring accessibility and consistency. Design systems aren't just for design teams; they accelerate solo development too.
  10. -
  11. Monorepo structure enforces discipline. Shared TypeScript interfaces between frontend and backend prevented the API contract drift that plagues many full-stack projects. The initial setup overhead was worth it for the compile-time safety and refactoring confidence.
  12. -
-

-

- ArchParser demonstrated that full-stack development - especially with AI assistance - enables rapid prototyping and iteration. By combining my design background with technical implementation, I could build and refine features based on direct user feedback without handoff delays. The project serves as both a practical tool for construction project management and a portfolio demonstration of end-to-end product development capabilities. -

-
-
-
-
- -
-
- -
diff --git a/src/pages/portfolio.md b/src/pages/portfolio.md index e0ef9bec..38e636f3 100644 --- a/src/pages/portfolio.md +++ b/src/pages/portfolio.md @@ -6,56 +6,10 @@ description: 'Selected projects from AWS, Red Hat, and high-growth B2B companies eleventyNavigation: key: Portfolio order: 1 +templateEngineOverride: njk,md ---
-
-
- Task It project illustration -
-

Task Management System

-

Lead designer for Task-it, Amazon's internal task management platform. Consolidated 3-4 disparate tracking tools into one unified system, reaching 500 daily active users across AWS within 18 months of launch.

-
- AWS500+ UsersEnterprise -
- View Case Study -
-
-
- Task It project illustration -
-

Weekly AI-Powered Work Summary

-

After archiving my work entries for the week, I found myself running a second, separate tool to generate a weekly summary. Now, I start the day, capture tasks, review, and archive - then summarize using AI.

-
- AIProductivity -
- View Case Study -
-
-
-
-
- Archparer dashboard image -

Archparser

-
-

Architectural drawing analysis platform for OCR-based architectural drawing management.

-
- DevelopmentClaude Code -
- View Case Study -
-
-
- Getting Started screen on Storybook -

Component Library

-
-

Built comprehensive design system for construction management software spanning web and iOS applications. Created design tokens, component documentation, and prototypes that accelerated development cycles by 25%.

-
- LibraryDesign Tokens -
- View Case Study -
-
-
- +{% set cardItems = collections.portfolioSequence | cardList(null, true) %} +{% include "work-cards.njk" %}
diff --git a/src/pages/designs/alm.md b/src/pages/portfolio/alm.md similarity index 89% rename from src/pages/designs/alm.md rename to src/pages/portfolio/alm.md index 8eb0d5b9..833f5df6 100644 --- a/src/pages/designs/alm.md +++ b/src/pages/portfolio/alm.md @@ -1,5 +1,12 @@ --- title: 'Application Lifecycle Management' +portfolioOrder: 6 +card: + title: "Application Lifecycle Management" + summary: "Creating seamless IDE integration and workflow tools for developers managing complex environments." + badges: ["Developer Tools", "Enterprise"] + group: "Professional" + featured: false date: git Last Modified abbreviation: 'alm' description: 'Creating seamless IDE integration and workflow tools for developers managing complex environments.' @@ -27,7 +34,7 @@ eleventyNavigation:

THE CHALLENGE: - OpenShift developers were managing work items across 3+ disconnected tools (GitHub issues, Jira, internal tracking systems). This forced constant context-switching between their IDE, browser tabs, and project management tools—slowing development cycles, breaking focus, and creating visibility gaps for project managers. + OpenShift developers were managing work items across 3+ disconnected tools (GitHub issues, Jira, internal tracking systems). This forced constant context-switching between their IDE, browser tabs, and project management tools, slowing development cycles, breaking focus, and creating visibility gaps for project managers.

The fragmentation was especially painful because developers had to:

    @@ -44,7 +51,7 @@ eleventyNavigation:

    THE SOLUTION: - I was part of a team that designed Application Lifecycle Management (ALM), a unified work item tracking system that integrated directly into the OpenShift.io IDE. The design focused on eliminating context-switching by bringing work item management into the developer's natural workflow—allowing them to create, update, and track work items without leaving their code editor. + I was part of a team that designed Application Lifecycle Management (ALM), a unified work item tracking system that integrated directly into the OpenShift.io IDE. The design focused on eliminating context-switching by bringing work item management into the developer's natural workflow, allowing them to create, update, and track work items without leaving their code editor.

    Key innovations included:

    • Seamless IDE integration with inline work item creation and updates
    • @@ -87,7 +94,7 @@ eleventyNavigation:
      1. General Users
          -
        • those who need to add and interact with issues, update project assets, and interact daily - a mix of designers and developers
        • +
        • those who need to add and interact with issues, update project assets, and interact daily, a mix of designers and developers
      2. @@ -133,7 +140,7 @@ eleventyNavigation:
      3. Communicates to the user that direct access to developing the Work Item is available in a single click.
      4. Implementation is unobtrusive and implies navigation.
      5. Location will not accidentally be clicked, allowing for enough real estate for line lengths and other meta data. The location of the integration should also imply moving forward.
      6. -
      7. Ordered by recommendation - require users to fill in one area before moving on.
      8. +
      9. Ordered by recommendation, require users to fill in one area before moving on.
      10. As a button, it needs to have a prominent place yet not take the place of a primary button (in style).
    @@ -230,21 +237,15 @@ eleventyNavigation:

    This project taught me invaluable lessons about designing for developers:

      -
    1. Understand the workflow before designing the tool. By spending weeks observing OpenShift developers and understanding their daily routines, I identified friction points that weren't immediately obvious—like the cognitive cost of switching between tools and the importance of maintaining flow state.
    2. -
    3. The best developer tools are invisible. Developers want tools that integrate seamlessly into existing workflows rather than requiring them to adapt to new processes. ALM succeeded because it met developers where they already were—in their IDE—rather than forcing them to go elsewhere.
    4. +
    5. Understand the workflow before designing the tool. By spending weeks observing OpenShift developers and understanding their daily routines, I identified friction points that weren't immediately obvious, like the cognitive cost of switching between tools and the importance of maintaining flow state.
    6. +
    7. The best developer tools are invisible. Developers want tools that integrate seamlessly into existing workflows rather than requiring them to adapt to new processes. ALM succeeded because it met developers where they already were, in their IDE, rather than forcing them to go elsewhere.
    8. Developer experience is user experience. Too often, internal developer tools are treated as purely functional without considering the human experience. By applying rigorous UX research and design thinking to ALM, we created a tool that developers actually enjoyed using.
    9. Working on ALM helped me identify gaps in PatternFly for developer tool use cases, leading to new components and patterns that benefited the entire Red Hat ecosystem.

    - The success of ALM reinforced that internal tools and developer experiences deserve the same level of design craft and user research as consumer products—and that investing in that craft pays dividends in productivity, satisfaction, and adoption. + The success of ALM reinforced that internal tools and developer experiences deserve the same level of design craft and user research as consumer products, and that investing in that craft pays dividends in productivity, satisfaction, and adoption.

-
- -
diff --git a/src/pages/portfolio/archparser.md b/src/pages/portfolio/archparser.md new file mode 100644 index 00000000..8e984153 --- /dev/null +++ b/src/pages/portfolio/archparser.md @@ -0,0 +1,196 @@ +--- +title: 'ArchParser: Architectural Drawing Analysis Platform' +portfolioOrder: 3 +card: + title: "ArchParser" + summary: "Architectural drawing analysis platform for OCR-based architectural drawing management." + image: "/assets/img/archparser_dashboard1.webp" + imageAlt: "ArchParser dashboard" + badges: ["Development", "Claude Code"] + group: "Professional" + featured: true +date: git Last Modified +abbreviation: 'archparser' +description: 'Full-stack TypeScript application for OCR-based architectural drawing analysis and management.' +eleventyNavigation: + key: Development + parent: Development + order: 1 +customCss: slides.css +--- + +
+

Project Overview

+
+

+ Role:Product Designer & Full-Stack Developer +

+

+ Type:Personal Project (originally intended as a CAS tool) +

+

+ Stack:TypeScript monorepo, NestJS, React, RadixUI, MySQL, Tesseract.js, built with Claude Code +

+

+ Status:Demo-ready, paused while higher-priority CAS projects took precedence +

+
+

Construction project managers at Component Assembly Systems needed to pull metadata from hundreds of architectural drawing PDFs. Entering drawing numbers, revision dates, and project names from title blocks by hand was slow, error-prone, and impossible to sustain on 500+ page sets, and no existing tool handled custom title block layouts across different architectural firms. I interviewed project planners and managers about their workflows, then designed and built ArchParser to automate the extraction.

+

ArchParser is a TypeScript monorepo with a NestJS backend for OCR processing and a React frontend for managing drawings. Demonstrations have processed over 200 drawings, and users of the current manual process estimated it would save roughly half a day (4 to 5 hours) of manual work per drawing set. That figure is an estimate, not a measured result.

+
    +
  • Processes 500+ page PDF drawing sets with memory-optimized batch processing
  • +
  • A visual template creator lets non-technical users configure extraction, so projects don't wait on a developer
  • +
  • Each extraction shows a confidence score out of 100, so users can proceed with high-confidence results and review the rest
  • +
  • Revision tracking and real-time progress updates support long-running jobs on large drawing sets
  • +
+
+
+

Key Design Decisions

+

The technical work is summarized further down, but the choices that shaped how people actually use ArchParser were design decisions. Four mattered most.

+
+
+

1. Let users build templates, not developers

+

Every OCR template tells the system where to look for a drawing number, title, date, and revision. The alternative was to have developers configure each template. I rejected it for two reasons. Title block layouts vary with file types, architectural firms, and project size, so the number of templates was never going to be small or stable. Projects also move fast, and waiting on a developer for every new layout would have slowed the very projects the tool was meant to help. The visual template creator lets a project manager draw the regions on a sample page and export the template themselves.

+
+
+
+
+

2. Design for confidence and review, not blind trust

+

OCR is never perfect on architectural drawings, so I designed the error handling around confidence and the ability to review. Each extraction shows a confidence score out of 100. In practice, when confidence was around 75, users generally proceeded with what the system provided, and they still reviewed a random sample of files to check it. Anything wrong could be corrected inline. The goal was to make a wrong result easy to spot and cheap to fix, and to let users decide how much to trust the output.

+ +
+
+
+
+

3. Consistency over novelty, even with an AI partner

+

Claude Code suggested changes to button placement and some layouts. I rejected them because they differed from what was already present in the system, and changing familiar patterns would have hurt usability for people who already knew the interface. Claude Code sped up implementation, but judgment about the user's existing context stayed with me.

+
+
+
+
+

4. AI search as an optional add-on

+

I designed the semantic search to be optional, for the point when the company adopts an AI platform. It supports Claude, OpenAI, or a local Ollama model, so a team can choose based on budget and privacy needs. The core product works fully without it.

+
+
+
+
+

The Template Creator

+

The template creator is a standalone HTML and JavaScript tool built with PDF.js that works offline with no backend dependency. Users upload a sample PDF, draw rectangles over the title block, label each region (drawing number, title, date, revision), and export a template file for ArchParser.

+
+
+
Initial Load
+
+
+ Image of the template creator's empty canvas +
Empty canvas, ready for PDF
+
+
+
+
+
PDF Loaded
+
+
+ Image of the template creator with a loaded PDF +
Document details loaded and ready
+
+
+
+
+
+
+

Visual Progressions

+

+ The visual design progressed quickly, but one idea held from the beginning: get users into their jobs as quickly and easily as possible. +

+
+
+
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+
+
+
+
+

Working with Claude Code

+

I used Claude Code as a development partner across architecture, implementation, and debugging. We weighed trade-offs such as absolute versus relative paths and synchronous versus batch processing before writing code, and it was most useful on TypeORM migrations, NestJS module structure, and tracking down memory and path-resolution bugs. It also helped draft the CLAUDE.md and README files that explain why decisions were made. Design judgment stayed with me, as in decision 3 above.

+
+
+

Technical Architecture

+

ArchParser is a monorepo with three workspaces: a NestJS backend, a React and Vite frontend built with RadixUI, and shared TypeScript types that catch API contract drift at compile time. The backend handles PDF-to-PNG conversion and Tesseract.js extraction, configurable OCR templates, a WebSocket gateway for live progress, and the optional LLM service. TypeORM and MySQL store jobs, drawing sets, drawings, templates, and knowledge chunks, with self-referencing drawing sets for revision tracking. The frontend includes a filterable dashboard, a PDF upload workflow, drawing review pages with inline editing, and a mock server so the interface can be developed without the backend. The backend has 14 test suites with 53 tests.

+
+
+
Set Details
+
+ Image of the drawing set details page +
+
+
+
Drawing List
+
+ Image of the drawing list page +
+
+
+
Drawing Details
+
+ Image of the drawing details page +
+
+
+
+
+

Key Iterations

+

Real-world testing forced two architectural changes. First, 500+ page PDFs exhausted memory because the first version converted the whole document to images at once. I switched to single-page conversion with batch sizes that adapt to document size, plus sequential OCR processing and memory monitoring, and large sets now process without crashes.

+

Second, processed drawings lost their link to database records after restarts, caused by inconsistent path resolution, a naming mismatch on deletion, and absolute paths stored in the database. I centralized path handling, standardized folder names, stored relative paths, and migrated 373 existing records, which also made the system portable across environments. The dashboard was refined too, with independent pagination and sorting, date and status filters, and a Kanban-style monitor view, after high-volume tables proved hard to navigate.

+
+ +
+
+
+

What I Learned

+
+
+
    +
  1. Test with realistic data from the start. The first version worked on small PDFs and failed on real 500+ page sets. Building with realistic data earlier would have surfaced the memory problem sooner.
  2. +
  3. Empowering users beat clever engineering. The visual template creator did more for adoption than any backend optimization, because it removed a bottleneck.
  4. +
  5. An AI partner speeds implementation, not judgment. Claude Code accelerated architecture work, debugging, and boilerplate, but the decisions about consistency and what users already know were mine to make.
  6. +
+
+
+
+
+ +
diff --git a/src/pages/portfolio/casim.md b/src/pages/portfolio/casim.md new file mode 100644 index 00000000..0b6bed2f --- /dev/null +++ b/src/pages/portfolio/casim.md @@ -0,0 +1,63 @@ +--- +title: 'CASim: Making Years of Inconsistent Construction Data Answerable' +portfolioOrder: 1 +card: + title: "CASim: Internal AI Assistant" + summary: "Designed and architected an internal AI assistant, built on a custom MCP server, that makes years of inconsistent construction data answerable. Currently in UAT and beta testing." + badges: ["AI", "MCP", "Enterprise"] + group: "Professional" + featured: true +date: git Last Modified +abbreviation: 'casim' +description: 'How I designed CASim, an internal AI assistant for a construction software company, and the MCP-based framework that decides what it can reach.' +eleventyNavigation: + key: CASim + parent: Portfolio + order: 1 +--- + +
+

Project Overview

+
+

Role:Creative Lead & Architect (design, MCP server, agents, prompts, and tooling)

+

Type:Internal Tool

+

Stack:TypeScript MCP server, Claude Desktop, MCP Inspector, custom web interface

+

Status:In Progress · Currently in UAT and beta testing

+
+
+ +One question was close to impossible to answer at our company: how did a project's budget compare to its final financials once every work order, change order, and supply markup was counted? All of that information existed in our system. Nothing connected it, so answering took manual assembly across screens, and most people didn't try. + + + +I assumed the hard part would be the AI. It was the data. Over the years, data entry had drifted from consistent inputs to a loose, sometimes conflicting set of values. Construction supplies were the clearest example: names slipped, dimensions were written several ways, and multiple identifiers meant the same product with no link between them. An assistant that sits on top of that data inherits every inconsistency, and it answers confidently regardless. + +## The decision + +We had two realistic paths. The first was to build a terminology file, a definitions layer that mapped every variant name and dimension to a canonical meaning so the assistant could translate on the fly. The second was to work with the executive team to decide what the defaults should be, then have the development team update the data and database to match. + +The terminology file was the faster, lower-risk option, and it was tempting for that reason. I rejected it because it would have hardened the mess into a permanent dependency. Every new variant would need a new mapping, someone would have to own that file indefinitely, and the assistant's answers would only be as good as the last person who updated it. We chose the harder path of returning to a single consistent naming convention and fixing the source. + +## What I built + +I was the creative lead and architect for CASim, and I built the core pieces myself. That includes the MCP server, the agents, prompts, and skills that shape how the assistant reasons about project data, and the tooling that connects it all. The server runs against three clients: Claude Desktop for daily use, MCP Inspector for testing tool behavior directly, and a custom interface for the people who will use CASim day to day. Keeping those three in play meant I could check whether a tool behaved correctly in isolation before judging how it felt in the interface. + + + +I also designed the access model around a simple principle I later presented to IT leadership: gate the connectors and data scope, not the creativity. A working server made the argument concrete, because leadership could see exactly what the assistant could reach and what it couldn't. + + + +## Outcome + +The decision was not universally popular. There was real pushback about how the data was being handled and about what information might be missed, forgotten, or lost in the cleanup. That concern was fair, and it shaped how carefully we approached it. + +The initial results answered it. They showed there was real insight sitting in the system that nobody could reach, and that the cleanup path was the right one. The question that had been nearly impossible, budget against end-of-project financials including work orders, change orders, and supply markup, became answerable. CASim is now in UAT and beta testing, so the adoption story is still being written. + +## Reflections + +Now that the project is in beta and proceeding through UAT, I am able to reflect on what I'd do differently and, potentially, what I would change moving forward in how I approach AI products. + +Looking back on the beginnings of the project, I would have researched and tested more before diving into creation. There were many times where I had to stop, research, and backtrack in order to cover either a gap that I had in the system, or a concern that wasn't addressed in the original architecture. While this did not delay the project, it did cause unnecessary churn that could have been avoided by taking a little extra time with research. + +Additionally, the pushback on data inconsistencies was unexpected although it should not have been. With a system that is 20+ years old, there are bound to be drifts in how data is stored and what has been entered by the thousands of users of the years. diff --git a/src/pages/case-studies/color-picker.md b/src/pages/portfolio/color-picker.md similarity index 74% rename from src/pages/case-studies/color-picker.md rename to src/pages/portfolio/color-picker.md index d4904c09..60fa5c1c 100644 --- a/src/pages/case-studies/color-picker.md +++ b/src/pages/portfolio/color-picker.md @@ -1,6 +1,13 @@ --- layout: markdown.njk title: 'Color Picker' +portfolioOrder: 7 +card: + title: "Color Picker" + summary: "As one of the most up-voted feature requests, the goal was to create an accessible option that combined colors with patterns." + badges: ["A11y", "Components"] + group: "Professional" + featured: false date: git Last Modified abbreviation: 'colorpicker' description: 'Accessible color picker combining WCAG compliance with patterns.' @@ -15,7 +22,7 @@ containers: true ## Project Overview -> A native iOS app, built by a coach, who needed fast and reliable game tracking without surrendering data to a third-party platform — designed for the sideline, built in Swift. +> An accessible color picker for the design system that pairs WCAG-compliant colors with patterns and icons, so color is never the only way to tell labels apart. :::card @@ -31,7 +38,7 @@ containers: true ## Introduction -A color picker, but nature, is not accessible - the goal of this component design was to provide a solution that not only allowed users to select colors for labels, but also provide alternatives such as patterns and icons. +A color picker is not accessible by nature, so the goal of this component design was to provide a solution that not only allowed users to select colors for labels, but also provide alternatives such as patterns and icons.
@@ -93,6 +100,6 @@ Once the basic levels had been configured, I needed to compare the current label Once the prototype was up and running, I was able to test out the interactions, visuals, and test the new component with users. -After reviewing the findings, it was determined that another round of design and testing was needed before we could release the color picker to production. +The color picker launched to production. The findings from this round also fed follow-up work: another round of design and testing. :::: diff --git a/src/pages/designs/component-library.md b/src/pages/portfolio/component-library.md similarity index 91% rename from src/pages/designs/component-library.md rename to src/pages/portfolio/component-library.md index 999eb31c..26a6f2e9 100644 --- a/src/pages/designs/component-library.md +++ b/src/pages/portfolio/component-library.md @@ -1,5 +1,14 @@ --- title: 'Component Library' +portfolioOrder: 5 +card: + title: "Component Library" + summary: "Built comprehensive design system for construction management software spanning web and iOS applications. Created design tokens, component documentation, and prototypes that accelerated development cycles by 25%." + image: "/assets/img/Storybook-GettingStarted.webp" + imageAlt: "Getting Started screen on Storybook" + badges: ["Library", "Design Tokens"] + group: "Professional" + featured: true date: git Last Modified abbreviation: 'componentlibrary' description: 'Design System for Construction Management Software' @@ -143,9 +152,3 @@ eleventyNavigation:
-
- -
diff --git a/src/pages/designs/customer-engagement.md b/src/pages/portfolio/customer-engagement.md similarity index 98% rename from src/pages/designs/customer-engagement.md rename to src/pages/portfolio/customer-engagement.md index b41e4e87..78aea2f4 100644 --- a/src/pages/designs/customer-engagement.md +++ b/src/pages/portfolio/customer-engagement.md @@ -27,7 +27,7 @@ eleventyNavigation:

THE CHALLENGE: - Saylent Technologies' Customer Engagement App (CEA) was a critical platform for credit unions and regional banks to track customer engagement and manage marketing campaigns. However, the existing interface was outdated, cluttered, and difficult to use—resulting in frustrated users and inefficient workflows. + Saylent Technologies' Customer Engagement App (CEA) was a critical platform for credit unions and regional banks to track customer engagement and manage marketing campaigns. However, the existing interface was outdated, cluttered, and difficult to use, resulting in frustrated users and inefficient workflows.

The company needed a complete UX overhaul that would:

  • Modernize the visual aesthetic to match contemporary SaaS standards
  • @@ -251,6 +251,6 @@ eleventyNavigation:
    diff --git a/src/pages/designs/dashboard-analytics.md b/src/pages/portfolio/dashboard-analytics.md similarity index 100% rename from src/pages/designs/dashboard-analytics.md rename to src/pages/portfolio/dashboard-analytics.md diff --git a/src/pages/portfolio/portfolio.json b/src/pages/portfolio/portfolio.json new file mode 100644 index 00000000..5d6ec479 --- /dev/null +++ b/src/pages/portfolio/portfolio.json @@ -0,0 +1,4 @@ +{ + "layout": "page", + "permalink": "/portfolio/{{ page.fileSlug }}/" +} diff --git a/src/pages/case-studies/soccertracker.md b/src/pages/portfolio/soccertracker.md similarity index 70% rename from src/pages/case-studies/soccertracker.md rename to src/pages/portfolio/soccertracker.md index 003b7b70..99ab6042 100644 --- a/src/pages/case-studies/soccertracker.md +++ b/src/pages/portfolio/soccertracker.md @@ -1,6 +1,13 @@ --- layout: markdown.njk title: 'Soccer Game Tracker' +portfolioOrder: 8 +card: + title: "Soccer Game Tracker" + summary: "A native iOS app, built by a coach, who needed fast and reliable game tracking without surrendering data to a third-party platform, designed for the sideline, built in Swift." + badges: ["SwiftUI", "Mobile"] + group: "Personal" + featured: false date: git Last Modified abbreviation: 'soccertracker' description: 'Native iOS app for coaches to track game data. Solo project, in active use.' @@ -15,7 +22,7 @@ containers: true ## Project Overview - > A native iOS app, built by a coach, who needed fast and reliable game tracking without surrendering data to a third-party platform — designed for the sideline, built in Swift. + > A native iOS app, built by a coach, who needed fast and reliable game tracking without surrendering data to a third-party platform, designed for the sideline, built in Swift. :::card @@ -31,7 +38,7 @@ containers: true ## Introduction - Coaching a youth soccer team generates a surprising amount of data. Scores, substitutions, player minutes, goals, assists, saves, cards. The problem isn't that the data is hard to capture — it's that every existing option forces a tradeoff I wasn't willing to make. Pen and paper is fast but produces nothing useful afterward. Third-party apps are convenient but own your data, require accounts, and are built for organizations, not individual coaches. I wanted something purpose-built for how I actually work on a sideline: fast to set up, minimal interaction during play, and with data I control entirely. + Coaching a youth soccer team generates a surprising amount of data. Scores, substitutions, player minutes, goals, assists, saves, cards. The problem isn't that the data is hard to capture; it's that every existing option forces a tradeoff I wasn't willing to make. Pen and paper is fast but produces nothing useful afterward. Third-party apps are convenient but own your data, require accounts, and are built for organizations, not individual coaches. I wanted something purpose-built for how I actually work on a sideline: fast to set up, minimal interaction during play, and with data I control entirely.
    @@ -42,7 +49,7 @@ containers: true src="{{ '/assets/img/soccergametracker-phone-rosters.webp' | url }}" style="width: 300px; max-width: 300px;" /> -
    set the roster - starters and substitutes
    +
    set the roster: starters and substitutes
    @@ -54,7 +61,7 @@ containers: true src="{{ '/assets/img/soccergametracker-phone-newgame.webp' | url }}" style="width: 300px; max-width: 300px;" /> -
    add game info - team size, location, date & time
    +
    add game info: team size, location, date & time
    @@ -64,11 +71,11 @@ containers: true ::::section ## The harder right choice - I built SoccerGameTracker as a native iOS app in Swift — solo, from scratch. The easier path would have been a PWA or React Native wrapper; I've shipped both, and they're faster to build. I chose Swift because a sideline app has a specific performance contract: launch instantly, respond without lag when a goal gets scored, never drop data if the phone gets pocketed. Native with local storage and no network dependency satisfies all three. No sync to worry about, no account to authenticate, no API that might be down at kickoff. + I built SoccerGameTracker as a native iOS app in Swift, solo, from scratch. The easier path would have been a PWA or React Native wrapper; I've shipped both, and they're faster to build. I chose Swift because a sideline app has a specific performance contract: launch instantly, respond without lag when a goal gets scored, never drop data if the phone gets pocketed. Native with local storage and no network dependency satisfies all three. No sync to worry about, no account to authenticate, no API that might be down at kickoff. - > every decision went through one person - me + > every decision went through one person: me - **Constraint clarified scope**. Without a backend, multi-device sync and shared rosters aren't on the table — and that's fine. Knowing what the app isn't made it easier to build what it is. I handled both the design and implementation entirely, which meant every decision — from interaction model to data structure — went through one person. That's mostly an advantage when you need to move fast and stay opinionated. + **Constraint clarified scope**. Without a backend, multi-device sync and shared rosters aren't on the table, and that's fine. Knowing what the app isn't made it easier to build what it is. I handled both the design and implementation entirely, which meant every decision, from interaction model to data structure, went through one person. That's mostly an advantage when you need to move fast and stay opinionated. :::: ::::section @@ -83,7 +90,7 @@ containers: true
    Pregame
    The pre-game setup flow handles the overhead up front. -
    New Game collects opposition, date, location, and half duration — everything you'd put on a physical scoresheet — plus roster selection from a pre-built player list with jersey number and position. +
    New Game collects opposition, date, location, and half duration, everything you'd put on a physical scoresheet, plus roster selection from a pre-built player list with jersey number and position.
    The Game vs. Scrimmage toggle is a small but deliberate decision: scrimmages have different stakes and different lineup dynamics, and I wanted the history to reflect that distinction clearly.
    @@ -91,14 +98,14 @@ containers: true
    Scoreboard & Quick Actions
    - The scoreboard and half timer sit at the top, readable in a second. The Quick Actions section — Team Goal and Opponent Goal — are the two largest tap targets in the app, sized and colored for immediate recognition in any lighting. Correction actions (Remove Team Goal, Subtract Goal) are present but visually subordinate: same area, smaller, lighter. Reachable when you need them, harder to hit by accident. + The scoreboard and half timer sit at the top, readable in a second. The Quick Actions section, Team Goal and Opponent Goal, are the two largest tap targets in the app, sized and colored for immediate recognition in any lighting. Correction actions (Remove Team Goal, Subtract Goal) are present but visually subordinate: same area, smaller, lighter. Reachable when you need them, harder to hit by accident.
    Players & Activity
    - Below the quick actions is where the app earns its depth. Each player in the active roster is tappable, opening a detail view where you can log individual stats in real time: goals, assists, saves, shots, yellow cards, red cards. Every action is timestamped and tied to the game half — building a full action log that the post-game summary renders as a timeline. That's the data that makes post-game review actually useful: not just who won, but who contributed, when, and how often. + Below the quick actions is where the app earns its depth. Each player in the active roster is tappable, opening a detail view where you can log individual stats in real time: goals, assists, saves, shots, yellow cards, red cards. Every action is timestamped and tied to the game half, building a full action log that the post-game summary renders as a timeline. That's the data that makes post-game review actually useful: not just who won, but who contributed, when, and how often.
    @@ -120,7 +127,7 @@ containers: true ### Substitutions :::card - Substitutions were a meaningful product decision. Mid-game sub support — with a distinct "substituted out" state separate from bench status — reflects how substitutions actually work: a player who comes off isn't the same as a player who never started. Getting that distinction right matters for per-player stats to be accurate. + Substitutions were a meaningful product decision. Mid-game sub support, with a distinct "substituted out" state separate from bench status, reflects how substitutions actually work: a player who comes off isn't the same as a player who never started. Getting that distinction right matters for per-player stats to be accurate. :::
    diff --git a/src/pages/designs/task-it.md b/src/pages/portfolio/task-it.md similarity index 95% rename from src/pages/designs/task-it.md rename to src/pages/portfolio/task-it.md index 2d65ed2d..ae9af379 100644 --- a/src/pages/designs/task-it.md +++ b/src/pages/portfolio/task-it.md @@ -1,5 +1,14 @@ --- title: 'Task Management System' +portfolioOrder: 4 +card: + title: "Task Management System" + summary: "Lead designer for Task-it, Amazon's internal task management platform. Consolidated 3-4 disparate tracking tools into one unified system, reaching 500 daily active users across AWS within 18 months of launch." + image: "/assets/img/task-it_product.webp" + imageAlt: "Task It project illustration" + badges: ["AWS", "500+ Users", "Enterprise"] + group: "Professional" + featured: true date: git Last Modified abbreviation: 'task' description: 'One enterprise task management system to rule them all.' @@ -35,7 +44,7 @@ eleventyNavigation:

    THE SOLUTION: - I designed Task-it, a unified task management platform that consolidated these disparate tools into a single, intuitive system. The design focused on role-agnostic patterns that could serve diverse AWS teams—from product managers tracking roadmaps to engineers managing technical debt to support teams triaging customer issues. + I designed Task-it, a unified task management platform that consolidated these disparate tools into a single, intuitive system. The design focused on role-agnostic patterns that could serve diverse AWS teams, from product managers tracking roadmaps to engineers managing technical debt to support teams triaging customer issues.

    THE IMPACT:
    @@ -256,9 +265,9 @@ eleventyNavigation:

    This project reinforced three critical lessons about designing internal tools:

      -
    1. Internal tools deserve the same design rigor as customer-facing products. By investing in proper user research, prototyping, and testing, we created a tool that users actually wanted to use—driving organic adoption without mandates from leadership.
    2. +
    3. Internal tools deserve the same design rigor as customer-facing products. By investing in proper user research, prototyping, and testing, we created a tool that users actually wanted to use, driving organic adoption without mandates from leadership.
    4. Flexibility beats rigid workflows. Rather than forcing all teams into a single process, we designed role-agnostic patterns that could adapt to different team structures and workflows. This flexibility was key to achieving broad adoption across diverse AWS organizations.
    5. -
    6. Continuous research is essential. By conducting regular usability tests and gathering feedback throughout development, we caught issues early and built features that users actually needed—not just what we assumed they wanted.
    7. +
    8. Continuous research is essential. By conducting regular usability tests and gathering feedback throughout development, we caught issues early and built features that users actually needed, not just what we assumed they wanted.

    @@ -267,8 +276,3 @@ eleventyNavigation:

    -
    - -
    diff --git a/src/pages/development/timetracker.md b/src/pages/portfolio/timetracker.md similarity index 56% rename from src/pages/development/timetracker.md rename to src/pages/portfolio/timetracker.md index c976090e..2a439c7b 100644 --- a/src/pages/development/timetracker.md +++ b/src/pages/portfolio/timetracker.md @@ -1,9 +1,18 @@ --- layout: markdown.njk title: 'Weekly AI-Powered Work Summary' +portfolioOrder: 2 +card: + title: "Weekly AI-Powered Work Summary" + summary: "After archiving my work entries for the week, I found myself running a second, separate tool to generate a weekly summary. Now, I start the day, capture tasks, review, and archive, then summarize using AI." + image: "/assets/img/timetracker-loading-state.webp" + imageAlt: "Weekly report generation loading state" + badges: ["AI", "Productivity"] + group: "Professional" + featured: true date: git Last Modified abbreviation: 'worksummary' -description: 'Start the day, capture tasks, review, and archive - then summarize using AI' +description: 'Start the day, capture tasks, review, and archive, then summarize using AI' eleventyNavigation: key: Development parent: Development @@ -17,28 +26,28 @@ containers: true :::card - **ROLE**: Lead Product Designer & Product Manager + **Role:** Lead Product Designer & Product Manager - **TYPE**: Feature extension - personal productivity tool + **Type:** Feature extension, personal productivity tool - **STACK**: React, TypeScript, Tailwind CSS, Google Gemini API + **Stack:** React, TypeScript, Tailwind CSS, Google Gemini API (Timetraked); OpenAI GPT 5.5, Docker (Weekly Report Generator) - **STATUS**: Shipped - in daily use + **Status:** Shipped, in daily use. The Weekly Report Generator runs in Docker and is currently private, with plans to make it public. ::: ::::section -## About TimeTracker Pro +## About Timetraked - TimeTracker Pro is a Progressive Web App (PWA) I designed, built, and use every day to track how I spend my work hours. It runs in the browser, installs as a native-like application on desktop and mobile, and stores data locally by default - no account required. Through the day I create tasks, assign them to projects and categories, and archive each completed day. Over time, it builds a personal record of where my time actually goes. + Timetraked (formerly TimeTracker Pro) is a Progressive Web App (PWA) I designed, built, and use every day to track how I spend my work hours. It runs in the browser, installs as a native-like application on desktop and mobile, and stores data locally by default, with no account required. Through the day I create tasks, assign them to projects and categories, and archive each completed day. Over time, it builds a personal record of where my time actually goes. - I built it because every time tracking tool that I tried was either too complex for my personal use, or too simple to be useful. TimeTracker Pro is purpose-built for the way I work: start the day, capture tasks as they happen, and review and archive at the end. It has been in daily use since early 2025 and has grown into a small, but complete, product - export formats, project management, offline support, and invoicing. The Weekly Report feature is the most recent addition, and the one that most clearly shows how the product has evolved from a personal utility into a considered system. + I built it because every time tracking tool that I tried was either too complex for my personal use, or too simple to be useful. Timetraked is purpose-built for the way I work: start the day, capture tasks as they happen, and review and archive at the end. It has been in daily use since early 2025 and has grown into a small, but complete, product, with export formats, project management, offline support, and invoicing. The Weekly Report feature is the most recent addition, and the one that most clearly shows how the product has evolved from a personal utility into a considered system.
    Start screen for TimeTracker Pro @@ -50,9 +59,9 @@ containers: true ## The Weekly Report Feature :::card - After archiving each week, I found myself running a second, separate tool to generate a weekly summary. That tool only worked with PDFs directly exported from the time tracker, only ran on a local development server, and product output that always needed manual cleanup before it was shareable. It was a workaround, not a product. + After archiving each week, I found myself running a second, separate tool to generate a weekly summary. That tool only worked with PDFs directly exported from the time tracker, only ran on a local development server, and produced output that always needed manual cleanup before it was shareable. It was a workaround, not a product. - The Weekly Report feature replaces that entire workflow. It lives inside TimeTracker Pro as a dedicated route, directly reading the same data the rest of the app uses, and generates a coherent weekly narrative using an AI model (Gemini). The output can be tuned for different audiences - a team's standup, a client update, or a personal retrospective - and is editable before copying to a separate document. No export step, no separate server, no manual cleanup. + The Weekly Report feature replaces that entire workflow. It lives inside Timetraked as a dedicated route, directly reading the same data the rest of the app uses, and generates a coherent weekly narrative using an AI model (Gemini). The output can be tuned for different audiences, such as a team's standup, a client update, or a personal retrospective, and is editable before copying to a separate document. No export step, no separate server, no manual cleanup. :::
    @@ -95,15 +104,31 @@ containers: true ## Extend, Not Replace :::card - The obvious move might have been to build a better standalone summary tool, but I chose not to - and the reasoning matters. + The obvious move might have been to build a better standalone summary tool, but I chose not to, and the reasoning matters. - A standalone tool would still need an export step, a file upload, or an API connection to access my time data. It would have to be general enough to work with any input, which means losing all the context that makes a summary actually useful - what categories mean, which projects are billable, and what a typical week looks like - specifically for me. + A standalone tool would still need an export step, a file upload, or an API connection to access my time data. It would have to be general enough to work with any input, which means losing all the context that makes a summary actually useful: what categories mean, which projects are billable, and what a typical week looks like, specifically for me. - Extending TimeTracker Pro meant the summary feature could read directly from the same local data store the rest of the app uses. No synchronization problem. No format negotiation. The data is already structured exactly the way the feature needs it to be - tasks with descriptions, projects, categories, and duration - grouped by day. + Extending Timetraked meant the summary feature could read directly from the same local data store the rest of the app uses. No synchronization problem. No format negotiation. The data is already structured exactly the way the feature needs it to be: tasks with descriptions, projects, categories, and duration, grouped by day. It also meant the feature could be opinionated in ways that a generic tool cannot. It knows to exclude break-time and lunch categories automatically. It understands the project and client structure. It has enough context to group a week of task descriptions into a meaningful narrative rather than a list. :::: +::::section +## Two Tools, One Deliberate Boundary + + :::card + The short weekly summary and the full weekly report do different jobs, so I split them. The summary lives inside Timetraked because it reads the daily time entries straight from the same database, which means no export step and no syncing. The Weekly Report Generator is a separate tool. You paste in the summary from Timetraked, and the AI writes a full report from a template built into the system. + + The hardest question was whether to fold the generator into Timetraked too. I kept it separate so it could work with any summary, not only ones tied to one tool's data format, and so its use cases could grow over time. Timetraked is where the data lives, but the generator has no dependency on it. + ::: + + :::card + The cost is maintainability. A separate project means another repository, another set of dependencies, and another thing I have to fix when it breaks. It also adds a copy-and-paste step between the two tools, which is the price of the boundary. I accepted both to keep the generator reusable. + + The template is built in for now, and making it easy to customize for different outputs is the next item on the list. The generator runs in a Docker container today and is currently private, with plans to make it public. + ::: +:::: + ::::section ## Design Decisions @@ -111,9 +136,9 @@ containers: true ### Two-panel Layout - At wider view-ports, and the report page uses a two-column layout: controls on the left, output on the right. This came from recognizing that the interaction has two distinct modes - configuring the request and reviewing the result - and that collapsing them into a single scrolling column would blur that separation. + At wider viewports, the report page uses a two-column layout: controls on the left, output on the right. This came from recognizing that the interaction has two distinct modes, configuring the request and reviewing the result, and that collapsing them into a single scrolling column would blur that separation. - The left column handles week navigation, the data breakdown, and tone selection. it is the setup side. The right column is purely reactive - it shows whatever state the output is in: **idle**, **generating**, **error**, or a **draft summary ready** to edit and copy. Nothing in the right column requires user input; it only responds to decisions made on the left. + The left column handles week navigation, the data breakdown, and tone selection. It is the setup side. The right column is purely reactive: it shows whatever state the output is in: **idle**, **generating**, **error**, or a **draft summary ready** to edit and copy. Nothing in the right column requires user input; it only responds to decisions made on the left. This separation also meant each column could be designed for its specific job. The left column is dense and interactive. The right column has more breathing room because reading and editing require it. @@ -147,7 +172,7 @@ containers: true The most deliberate UX decision was treating the AI generation as a visible, legible transition rather than a black-box button press. When generation is in progress, the right panel names the week being summarized and shows staggered skeleton lines that suggest an output is forthcoming. - The idle state - before anything has been generated - uses a dashed border container with a short explanation of what will appear there. This keeps the two-column layout from reading as broken or incomplete on first load, and gives the right panel a purpose even before it has content. + The idle state, before anything has been generated, uses a dashed border container with a short explanation of what will appear there. This keeps the two-column layout from reading as broken or incomplete on first load, and gives the right panel a purpose even before it has content. Error states are structured and recoverable: a header that names the failure, a plain-language description, and a "Try again" action inline. The error is informative without being alarming. @@ -169,7 +194,7 @@ containers: true ::::section ## Tone as a product decision - The tone selector - **Standup**, **Client**, **Retrospective** - reflects a real choice I make every week about who I'm writing for. These are not cosmetic variations. Each tone maps to a different set of system prompt instructions sent to the model, producing meaningfully different outputs. + The tone selector (**Standup**, **Client**, **Retrospective**) reflects a real choice I make every week about who I'm writing for. These are not cosmetic variations. Each tone maps to a different set of system prompt instructions sent to the model, producing meaningfully different outputs.
    @@ -216,9 +241,9 @@ containers: true ### Editable output by default :::card-shadow - The generated summary appears in an editable text area, rather than a read-only display. This frames the AI's role correctly: it drafts, the human approves. The copy button and a brief 'changes are not saved' note completes the mental model - this is a staging area, not a final product. + The generated summary appears in an editable text area, rather than a read-only display. This frames the AI's role correctly: it drafts, the human approves. The copy button and a brief 'changes are not saved' note completes the mental model: this is a staging area, not a final product. - A "regenerate" button sites alongside the copy button, so it is easy to get a different draft without scrolling back to the controls. The two actions - regenerate and copy - represent the two things a person actually wants to do with a draft: try again or take it. + A "regenerate" button sits alongside the copy button, so it is easy to get a different draft without scrolling back to the controls. The two actions, regenerate and copy, represent the two things a person actually wants to do with a draft: try again or take it. :::
    @@ -226,11 +251,11 @@ containers: true ### AI prompt architecture :::card-shadow - The prompt that drives the summary is split into two parts. The system instruction establishes the persona, length constraints (3 to 5 sentences), voice (first-person, no filler phrases), and the specific tone instructions for whichever mode is selected. The user message contains the serialized week data - a lean, human-readable representation of each workday with task titles, descriptions, project names, and durations. + The prompt that drives the summary is split into two parts. The system instruction establishes the persona, length constraints (3 to 5 sentences), voice (first-person, no filler phrases), and the specific tone instructions for whichever mode is selected. The user message contains the serialized week data: a lean, human-readable representation of each workday with task titles, descriptions, project names, and durations. - Before sending, the serialization step strips timestamps, IDs, and non-work categories. What reaches the model is only what a human would include if they were writing the summary prompt by hand. This matters because model output quality is directly proportional to input clarity - sending structured noise produces structured noise back. + Before sending, the serialization step strips timestamps, IDs, and non-work categories. What reaches the model is only what a human would include if they were writing the summary prompt by hand. This matters because model output quality is directly proportional to input clarity: sending structured noise produces structured noise back. - The prompt architecture is designed to evolve. As I use the feature and notice patterns in what I edit or regenerate, the system instructions cane be turned to match how I actually write and what different audiences respond to. The tone categories themselves may expand - a spring summary or executive update tone would be natural additions as the use cases grow. + The prompt architecture is designed to evolve. As I use the feature and notice patterns in what I edit or regenerate, the system instructions can be tuned to match how I actually write and what different audiences respond to. The tone categories themselves may expand: a sprint summary or executive update tone would be natural additions as the use cases grow. ::: :::: @@ -240,14 +265,9 @@ containers: true :::card ### Outcome - Every week I use the standup tone on Monday morning to orient myself before the week's work begins, with the retrospective tone on Friday to close out the week. Before this feature existed, I skipped that ritual more often than not due to the fact that the tooling made it feel like work. *Now it takes less than a minute*. The summary is available wherever TimeTracker Pro is available, and the tone control means the output is usually usable with one or two edits rather than a full rewrite. + Every week I use the standup tone on Monday morning to orient myself before the week's work begins, with the retrospective tone on Friday to close out the week. Before this feature existed, I skipped that ritual more often than not due to the fact that the tooling made it feel like work. *Now it takes less than a minute*. The summary is available wherever Timetraked is available, and the tone control means the output is usually usable with one or two edits rather than a full rewrite. - From a portfolio standpoint the project demonstrates a specific combination of skills: identifying friction in a real workflow, making a considered architectural decision about where a feature belongs, designing the interactions states that make AI output feel trustworthy, and shipping something that has been in daily use since it launched. -:::: + The Weekly Report Generator extends that routine. I use it every week, and it takes less than a minute to produce a full report that used to take me about 30 minutes to write by hand. -::::section - + From a portfolio standpoint the project demonstrates a specific combination of skills: identifying friction in a real workflow, making a considered architectural decision about where a feature belongs, designing the interactions states that make AI output feel trustworthy, and shipping something that has been in daily use since it launched. :::: diff --git a/src/pages/timetraked/timetraked.html b/src/pages/timetraked/timetraked.html new file mode 100644 index 00000000..c30dabc7 --- /dev/null +++ b/src/pages/timetraked/timetraked.html @@ -0,0 +1,1743 @@ + + + + + + + + TimeTraked — Modern Offline-First Productivity & Workday Tracker + + + + + + + + + + + + + +
    + +
    + TimeTraked Logo + TimeTraked + +
    + + + + +
    + +
    + +
    + +
    + +
    + + Loading... Release + • + Previously TimeTracker Pro + arrow_forward +
    + +

    + Master your workday. Track time, projects, and revenue with + zero friction. +

    + +

    + An offline-first, privacy-respecting PWA and Tauri desktop app + engineered with React 18, TypeScript, Tailwind CSS v4, and Radix UI. + Start your workday with zero setup, manage clients & rates, and + export client-ready invoices. +

    + +
    + + offline_bolt + 100% Offline-First + + + desktop_windows + Tauri Desktop & PWA + + + database + Supabase & Self-Hosted SQL + + + verified_user + Zero Tracking or Cookies + +
    + + + +
    + +
    +
    +
    + + + +
    + + TimeTraked Desktop — Active Session +
    + +
    +
    + payments + $487.50 + today +
    +
    + schedule + 5.2 hrs + logged +
    + +
    +
    + +
    +
    +
    +
    +
    + + + RUNNING + + #TSK-842 + + Acme Corp + +
    +

    + Design System Refactoring & Radix Primitives Audit +

    +

    + Extracting design tokens, unifying button variants, and + aligning with Tailwind v4 semantics. +

    +
    +
    +
    +
    + 02:45:18 +
    +
    + $125.00/hr • $344.38 accrued +
    +
    +
    + + +
    +
    +
    +
    + +
    +
    + TODAY'S PLANNED TASKS (3 COMPLETED • 1 ACTIVE) + +
    + +
    +
    + radio_button_checked +
    + Design System Refactoring for Acme Corp +
    + Design + $125/hr + • GFM notes attached +
    +
    +
    +
    + 02:45:18 + more_vert +
    +
    + +
    +
    + check_circle +
    + Fix Supabase Row-Level Security replication race + condition +
    + Development + $150/hr + • Orbit Protocol +
    +
    +
    +
    + 01:30:00 + $225.00 +
    +
    + +
    +
    + check_circle +
    + Client Weekly Retrospective & Scope Clarification + Call +
    + Client Comm + $110/hr + • Hyperion Media +
    +
    +
    +
    + 00:45:00 + $82.50 +
    +
    + +
    +
    + check_circle +
    + Generate and send Monthly CSV Invoices for February +
    + Admin + Fixed Rate +
    +
    +
    +
    + 00:20:00 + $35.62 +
    +
    +
    + +
    +
    + cloud_done + Local Cache In Sync (Crash-Safe) +
    +
    + Shortcut: + ⌘K + Command Palette +
    +
    +
    +
    + +
    +
    +

    + Engineered for Deep Work and Zero Cognitive Tax +

    +

    + Every component in TimeTraked is built to respect your flow state, + preserve your data autonomy, and automate invoicing. +

    +
    + +
    + +
    +
    +
    + wb_twilight +
    +

    + Daily Time Boundaries +

    +

    + Clear morning "Start Day" and evening "End Day" post-to-archive + boundaries to intentionally prevent burnout and separate + billable focus from offline personal life. +

    +
    +
    + Burnout Prevention + archive +
    +
    + +
    +
    +
    + attach_money +
    +

    + Client & Rate Directories +

    +

    + Configure per-client hourly rates, flat project fees, billable + flags, and archived company directories. Real-time earnings + compute automatically while you work. +

    +
    +
    + Multi-currency Ready + $ / hr Auto-Calc +
    +
    + +
    +
    +
    + view_kanban +
    +

    + Drag-and-Drop Kanban Planning +

    +

    + Visual day staging powered by modular + KanbanBoard, + KanbanColumn, + and + PlannedTaskCard + components. +

    +
    +
    + Planned • In Progress • Done + drag_indicator +
    +
    + +
    +
    +
    + auto_awesome +
    +

    + AI-Powered Weekly Summaries +

    +

    + Gemini-powered client standups and executive weekly digests. + One-click conversion of granular time logs into professional + retrospective reports with adjustable tone. +

    +
    +
    + Client Standups & Retros + Gemini API Ready +
    +
    + +
    +
    +
    + markdown +
    +

    + Rich Markdown Notes +

    +

    + GitHub Flavored Markdown (GFM) notes embedded directly in task + cards. Keep code snippets, API response payloads, and sub-task + checklists right next to the timer. +

    +
    +
    + Checklists & Syntax Highlighting + ts ... + +
    +
    + +
    +
    +
    + receipt_long +
    +

    + Comprehensive Backups & Exports +

    +

    + Permanent data retention. Instant exports to client-ready CSV + and JSON schemas. In Tauri desktop mode, automatically write + timestamped disk snapshots to local storage. +

    +
    +
    + CSV • JSON • Print Invoice + download_for_offline +
    +
    +
    +
    + +
    +
    +
    + hub + Flexible Data Topologies +
    +

    + Three Storage Modes. You Own Every Byte. +

    +

    + Whether you want instant frictionless zero-config tracking or + enterprise Postgres isolation, TimeTraked adapts to your security + requirements. +

    +
    + +
    + +
    + + Default Zero-Config + +
    +
    + Guest Mode + cloud_off +
    +

    + Instant in-browser execution with zero sign-up. Stored + completely in browser localStorage with multi-tiered backup + snapshots. +

    +
      +
    • + check + Zero signup or email required +
    • +
    • + check + 100% offline & latency free +
    • +
    • + check + Multi-tier snapshot recovery +
    • +
    • + close + Multi-device cloud synchronization +
    • +
    +
    +
    + localStorage + IndexedDB +
    +
    + +
    +
    +
    + Cloud Sync (Supabase) + sync +
    +

    + Optional cloud backend powered by Supabase. Secure PostgreSQL + database with rigorous Row-Level Security (RLS). +

    +
      +
    • + check + Real-time multi-device syncing +
    • +
    • + check + Strict Row-Level Security (RLS) +
    • +
    • + check + Mobile & Desktop continuous sync +
    • +
    • + check + Offline queue with auto-reconnect +
    • +
    +
    +
    + PostgreSQL + RLS Polices +
    +
    + +
    +
    +
    + Self-Hosted SQL + dns +
    +

    + For privacy purists and homelab enthusiasts. Connect TimeTraked + to your own personal PostgreSQL or MySQL instance. +

    +
      +
    • + check + Own 100% of your database pipeline +
    • +
    • + check + PostgreSQL & MySQL REST adapter +
    • +
    • + check + Run inside Tailscale / Homelab +
    • +
    • + check + No third-party cloud dependence +
    • +
    +
    +
    + REST API Endpoint +
    +
    +
    + +
    +
    + Modern Architecture +

    + Zero bloat. Built on the modern TypeScript & React standard. +

    +
    +
    + React 18 + TypeScript 5.9 + Vite 5 + Tailwind CSS v4 + Radix UI + Tauri v2 +
    +
    +
    + +
    +
    +
    + keyboard + Power-User Accelerators +
    +

    + Keyboard Shortcuts Built for Speed +

    +

    + Keep your fingers on the home row. Control running timers, switch + views, and trigger manual disk saves without lifting a mouse. +

    +
    + +
    + +
    +
    + Instant New Task + + N + +
    +

    + Quick-opens the task composer dialog and auto-focuses the title + field. +

    +
    + +
    +
    + Force Sync & Save +
    + ⌘/Ctrl + S +
    +
    +

    + Immediately flushes in-memory timers to local IndexedDB and cloud + database. +

    +
    + +
    +
    + Command Palette +
    + ⌘/Ctrl + K +
    +
    +

    + Opens the omni-bar command finder to switch views, search tasks, + or run macros. +

    +
    + +
    +
    + Help & Shortcuts + + ? + +
    +

    + Toggles the modal overlay listing all 24+ keyboard navigation + controls. +

    +
    +
    + +
    + touch_app +

    + Mobile Gesture Support: + On touchscreens, long-press (500ms) any task card to reveal the + haptic action drawer for rapid time edits, rate adjustments, and + invoice tagging. +

    +
    +
    + +
    +
    +
    + terminal + Open Source & Hackable +
    +

    + Run It Locally in 30 Seconds +

    +

    + Zero closed proprietary code. 100% open source under the permissive + MIT License. Fully typed, tested, and battle-ready. +

    +
    +
    + +
    +
    +
    + + + + bash — quickstart.sh +
    + +
    +
    +

    # 1. Clone the repository from GitHub

    +

    + git clone + https://github.com/AdamJ/TimeTrackerPro.git +

    +

    + # 2. Enter project directory & install dependencies +

    +

    + cd + TimeTrackerPro && + pnpm install +

    +

    + # 3. Spin up the Vite development server +

    +

    pnpm dev

    +

    + # Optional: Run Vitest unit & integration test suite +

    +

    + pnpm + test:run +

    +
    +
    + Local URL: http://localhost:5173 + Ready in 240ms +
    +
    + +
    +
    +
    + verified +
    +

    + Rigorous Test Coverage +

    +
    +
    + 395 Tests +
    +

    + Across 38 Vitest test suites checking timer accuracy, offline + reconciliation, and invoice calculations. +

    +
    +
    +
    +
    + License: + MIT Open Source +
    +
    + Credits: + Lovable, Radix, shadcn/ui +
    +
    +
    +
    +
    + +
    +
    +
    +

    + Ready to Reclaim Control of Your Hours? +

    +

    + No credit card, no forced registrations, and no tracking cookies. + Launch the web app right now or clone the Tauri build to your + desktop. +

    + +
    +
    +
    + + + + + + diff --git a/src/pages/timetraked/timetraked.json b/src/pages/timetraked/timetraked.json new file mode 100644 index 00000000..12ef3213 --- /dev/null +++ b/src/pages/timetraked/timetraked.json @@ -0,0 +1,4 @@ +{ + "layout": "blank", + "permalink": "/{{ page.fileSlug }}/" +} diff --git a/src/redirects.njk b/src/redirects.njk new file mode 100644 index 00000000..9978ef5e --- /dev/null +++ b/src/redirects.njk @@ -0,0 +1,21 @@ +--- +pagination: + data: redirects + size: 1 + alias: redirect +permalink: "{{ redirect.from }}index.html" +eleventyExcludeFromCollections: true +--- + + + + + Redirecting + + + + + +

    This page has moved to {{ redirect.to }}.

    + +