@@ -28,7 +28,7 @@ const recentPosts = await getRecentPosts(3);
2828
2929 <!-- Description -->
3030 <p class =" text-xl hero-subtitle max-w-2xl lg:max-w-none mx-auto lg:mx-0" >
31- I build fast, production-ready websites and applications. This site showcases my projects and writing .
31+ I am focused on more than building apps. I am building the infrastructure and platforms that run them .
3232 </p >
3333
3434 <!-- CTA Buttons -->
@@ -66,68 +66,40 @@ const recentPosts = await getRecentPosts(3);
6666 <!-- Current Focus Section -->
6767 <section class =" py-20 section-bg" >
6868 <div class =" max-w-7xl mx-auto px-4 sm:px-6 lg:px-8" >
69- <div class =" text-center mb-12" >
70- <h2 class =" text-3xl md:text-4xl font-bold section-title mb-4" >Current Focus</h2 >
71- <p class =" text-xl section-subtitle" >What I'm building and exploring right now</p >
69+ <div class =" text-center mb-10" >
70+ <h2 class =" text-3xl md:text-4xl font-bold section-title mb-4" >Infrastructure & Platform Focus</h2 >
71+ <p class =" text-xl section-subtitle max-w-3xl mx-auto" >
72+ I am shifting from app builder to infrastructure/platform engineer, building systems that run and scale many apps reliably.
73+ </p >
7274 </div >
7375
74- <div class =" max-w-3xl mx-auto space-y-6" >
75- <!-- TanStack Work -->
76- <div class =" focus-item" >
77- <div class =" flex items-start space-x-3" >
78- <div class =" flex-shrink-0 w-5 h-5 rounded-full bg-[#00d4ff]/20 flex items-center justify-center mt-0.5" >
79- <svg class =" w-3 h-3 text-[#00d4ff]" fill =" currentColor" viewBox =" 0 0 20 20" >
80- <path fill-rule =" evenodd" d =" M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z" clip-rule =" evenodd" />
81- </svg >
82- </div >
83- <div class =" flex-1" >
84- <p class =" section-subtitle text-base mb-2" >Building reactive data layers with TanStack Query, Table, and Router</p >
85- <div class =" flex flex-wrap gap-2" >
86- <span class =" focus-tag" >TanStack Query</span >
87- <span class =" focus-tag" >TanStack Table</span >
88- <span class =" focus-tag" >TanStack Router</span >
89- <span class =" focus-tag" >TypeScript</span >
90- </div >
91- </div >
92- </div >
76+ <div class =" max-w-5xl mx-auto" >
77+ <div class =" focus-pill mb-8" >
78+ <span class =" focus-pill-dot" aria-hidden =" true" ></span >
79+ <p >My goal is turning my VPS into a practical PaaS-style environment for multi-stack application hosting.</p >
9380 </div >
9481
95- <!-- C-level Game Engine -->
96- <div class =" focus-item" >
97- <div class =" flex items-start space-x-3" >
98- <div class =" flex-shrink-0 w-5 h-5 rounded-full bg-[#00d4ff]/20 flex items-center justify-center mt-0.5" >
99- <svg class =" w-3 h-3 text-[#00d4ff]" fill =" currentColor" viewBox =" 0 0 20 20" >
100- <path fill-rule =" evenodd" d =" M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z" clip-rule =" evenodd" />
101- </svg >
102- </div >
103- <div class =" flex-1" >
104- <p class =" section-subtitle text-base mb-2" >Developing a C-level game engine with performance-first architecture</p >
105- <div class =" flex flex-wrap gap-2" >
106- <span class =" focus-tag" >C</span >
107- <span class =" focus-tag" >Game Engine</span >
108- <span class =" focus-tag" >Systems Programming</span >
109- </div >
110- </div >
111- </div >
112- </div >
82+ <div class =" grid grid-cols-1 md:grid-cols-3 gap-4" >
83+ <article class =" focus-card" >
84+ <h3 class =" focus-card-title mb-2" >Who I Am</h3 >
85+ <p class =" focus-card-copy" >
86+ A full-stack developer evolving into an infrastructure/platform engineer focused on deployment architecture and operations.
87+ </p >
88+ </article >
11389
114- <!-- Python + DuckDB -->
115- <div class =" focus-item" >
116- <div class =" flex items-start space-x-3" >
117- <div class =" flex-shrink-0 w-5 h-5 rounded-full bg-[#00d4ff]/20 flex items-center justify-center mt-0.5" >
118- <svg class =" w-3 h-3 text-[#00d4ff]" fill =" currentColor" viewBox =" 0 0 20 20" >
119- <path fill-rule =" evenodd" d =" M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z" clip-rule =" evenodd" />
120- </svg >
121- </div >
122- <div class =" flex-1" >
123- <p class =" section-subtitle text-base mb-2" >Building fast data pipelines with Python and DuckDB for analytical workloads</p >
124- <div class =" flex flex-wrap gap-2" >
125- <span class =" focus-tag" >Python</span >
126- <span class =" focus-tag" >DuckDB</span >
127- <span class =" focus-tag" >Data Pipelines</span >
128- </div >
129- </div >
130- </div >
90+ <article class =" focus-card" >
91+ <h3 class =" focus-card-title mb-2" >What I Build</h3 >
92+ <p class =" focus-card-copy" >
93+ A VPS hosting layer that runs multiple applications today (including PHP), with additional stacks coming next.
94+ </p >
95+ </article >
96+
97+ <article class =" focus-card" >
98+ <h3 class =" focus-card-title mb-2" >My Approach</h3 >
99+ <p class =" focus-card-copy" >
100+ Isolated Docker containers per app, practical automation, and repeatable deployment workflows that grow into a platform.
101+ </p >
102+ </article >
131103 </div >
132104 </div >
133105
@@ -146,6 +118,28 @@ const recentPosts = await getRecentPosts(3);
146118 </div >
147119 </section >
148120
121+ <!-- VPS Platform Environment -->
122+ <section class =" vps-feature-section" >
123+ <div class =" max-w-7xl mx-auto px-4 sm:px-6 lg:px-8" >
124+ <div class =" vps-feature-card" >
125+ <div class =" vps-feature-header" >
126+ <span class =" vps-feature-label" >
127+ <Folder class =" h-4 w-4 mr-2" />
128+ Core Lab Environment
129+ </span >
130+ <h2 class =" vps-feature-title" >Building my VPS into a platform for multi-stack deployment</h2 >
131+ </div >
132+ <p class =" vps-feature-description" >
133+ This environment is where I build my infrastructure platform. I currently host PHP applications and I am expanding to support multiple stacks, each deployed in isolated Docker containers.
134+ </p >
135+ <a href =" https://djm-apps.com/" target =" _blank" rel =" noopener noreferrer" class =" vps-feature-link" >
136+ Open DJM Apps
137+ <ExternalLink class =" h-4 w-4 ml-2" />
138+ </a >
139+ </div >
140+ </div >
141+ </section >
142+
149143 <!-- Featured Projects -->
150144 <section class =" py-20 projects-bg" >
151145 <div class =" max-w-7xl mx-auto px-4 sm:px-6 lg:px-8" >
@@ -217,12 +211,12 @@ const recentPosts = await getRecentPosts(3);
217211 <div class =" grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-8" >
218212 { recentPosts .slice (0 , 3 ).map ((post ) => (
219213 <article class = " neon-card overflow-hidden hover:shadow-neon-glow transition-all duration-300 flex flex-col" >
220- <div class = " h-48 blog -image-bg flex items-center justify-center overflow-hidden" >
214+ <div class = " h-64 project -image-bg flex items-center justify-center overflow-hidden" >
221215 <Image
222216 src = { post .image || " /assets/og-default.png" }
223217 alt = { post .title }
224218 width = { 400 }
225- height = { 192 }
219+ height = { 300 }
226220 class = " w-full h-full object-cover"
227221 loading = " lazy"
228222 />
@@ -481,27 +475,68 @@ const recentPosts = await getRecentPosts(3);
481475 }
482476
483477 /* Current Focus Styles */
484- .focus-item {
485- padding: 0.75rem 0;
486- }
487-
488- .focus-tag {
489- display: inline-flex;
478+ .focus-pill {
479+ display: flex;
490480 align-items: center;
491- padding: 0.25rem 0.75rem;
492- border-radius: 0.375rem;
493- font-size: 0.75rem;
494- font-weight: 500;
495- background-color: rgba(0, 212, 255, 0.1);
496- color: #00d4ff;
497- border: 1px solid rgba(0, 212, 255, 0.2);
498- transition: all 0.2s ease;
481+ justify-content: center;
482+ gap: 0.65rem;
483+ background-color: rgba(0, 212, 255, 0.08);
484+ border: 1px solid rgba(0, 212, 255, 0.24);
485+ border-radius: 0.75rem;
486+ padding: 0.85rem 1rem;
487+ color: var(--text-primary);
488+ font-weight: 600;
489+ text-align: center;
499490 }
500-
501- .focus-tag:hover {
502- background-color: rgba(0, 212, 255, 0.15);
491+
492+ .focus-pill-dot {
493+ width: 0.55rem;
494+ height: 0.55rem;
495+ border-radius: 999px;
496+ background-color: #00d4ff;
497+ box-shadow: 0 0 10px rgba(0, 212, 255, 0.6);
498+ flex-shrink: 0;
499+ }
500+
501+ .focus-card {
502+ background: var(--bg-card);
503+ border: 1px solid var(--border-color);
504+ border-radius: 0.85rem;
505+ padding: 1rem;
506+ transition: all 0.25s ease;
507+ }
508+
509+ .focus-card:hover {
510+ transform: translateY(-2px);
511+ border-color: rgba(0, 212, 255, 0.35);
512+ box-shadow: 0 8px 20px rgba(0, 0, 0, 0.25), 0 0 0 1px rgba(0, 212, 255, 0.12);
513+ }
514+
515+ .focus-card-title {
516+ color: var(--text-primary);
517+ font-size: 1rem;
518+ font-weight: 700;
519+ }
520+
521+ .focus-card-copy {
522+ color: var(--text-secondary);
523+ font-size: 0.94rem;
524+ line-height: 1.55;
525+ }
526+
527+ html.light .focus-pill {
528+ background-color: rgba(0, 212, 255, 0.1);
503529 border-color: rgba(0, 212, 255, 0.3);
504530 }
531+
532+ html.light .focus-card {
533+ background: #ffffff;
534+ border-color: #dbe3ea;
535+ }
536+
537+ html.light .focus-card:hover {
538+ box-shadow: 0 8px 20px rgba(2, 8, 20, 0.08), 0 0 0 1px rgba(0, 212, 255, 0.16);
539+ }
505540
506541 .build-log-link {
507542 display: inline-flex;
@@ -586,6 +621,100 @@ const recentPosts = await getRecentPosts(3);
586621 .projects-bg {
587622 background-color: var(--bg-primary);
588623 }
624+
625+ .vps-feature-section {
626+ background: linear-gradient(100deg, #00d4ff 0%, #34e7ff 45%, #6cf2ff 100%);
627+ padding: 2.75rem 0;
628+ box-shadow: 0 0 32px rgba(0, 212, 255, 0.35);
629+ }
630+
631+ .vps-feature-card {
632+ border: 1px solid rgba(4, 36, 48, 0.25);
633+ background: rgba(255, 255, 255, 0.12);
634+ backdrop-filter: blur(6px);
635+ border-radius: 1rem;
636+ padding: 1.5rem;
637+ box-shadow: 0 12px 28px rgba(3, 25, 35, 0.25), inset 0 0 24px rgba(255, 255, 255, 0.16);
638+ }
639+
640+ .vps-feature-header {
641+ margin-bottom: 0.85rem;
642+ }
643+
644+ .vps-feature-label {
645+ display: inline-flex;
646+ align-items: center;
647+ color: #062838;
648+ background: rgba(255, 255, 255, 0.34);
649+ border: 1px solid rgba(6, 40, 56, 0.28);
650+ border-radius: 999px;
651+ font-size: 0.76rem;
652+ font-weight: 700;
653+ letter-spacing: 0.04em;
654+ text-transform: uppercase;
655+ padding: 0.35rem 0.7rem;
656+ margin-bottom: 0.75rem;
657+ }
658+
659+ .vps-feature-title {
660+ color: #031923;
661+ font-size: 1.55rem;
662+ line-height: 1.25;
663+ font-weight: 800;
664+ }
665+
666+ .vps-feature-description {
667+ color: #053047;
668+ font-size: 1rem;
669+ line-height: 1.65;
670+ max-width: 70ch;
671+ margin-bottom: 1.15rem;
672+ font-weight: 600;
673+ }
674+
675+ .vps-feature-link {
676+ display: inline-flex;
677+ align-items: center;
678+ justify-content: center;
679+ color: #7cefff;
680+ background: #051118;
681+ border: 1px solid rgba(124, 239, 255, 0.48);
682+ border-radius: 0.6rem;
683+ padding: 0.62rem 1rem;
684+ font-size: 0.9rem;
685+ font-weight: 700;
686+ text-decoration: none;
687+ box-shadow: 0 0 16px rgba(5, 17, 24, 0.45);
688+ transition: transform 0.2s ease, box-shadow 0.2s ease;
689+ }
690+
691+ .vps-feature-link:hover {
692+ transform: translateY(-1px);
693+ box-shadow: 0 0 20px rgba(5, 17, 24, 0.6);
694+ }
695+
696+ html.light .vps-feature-section {
697+ background: linear-gradient(100deg, #00d4ff 0%, #34e7ff 45%, #6cf2ff 100%);
698+ }
699+
700+ @media (max-width: 640px) {
701+ .vps-feature-section {
702+ padding: 2rem 0;
703+ }
704+
705+ .vps-feature-card {
706+ padding: 1.1rem;
707+ }
708+
709+ .vps-feature-title {
710+ font-size: 1.25rem;
711+ }
712+
713+ .vps-feature-description {
714+ font-size: 0.93rem;
715+ line-height: 1.55;
716+ }
717+ }
589718
590719 .projects-title {
591720 color: var(--text-primary);
0 commit comments