Skip to content

Commit 731a9b7

Browse files
committed
Refine homepage narrative and layout around platform engineering
- Reposition site messaging from app-centric to infrastructure/platform focus across hero and focus sections - Add and style VPS lab callouts on projects and homepage with clearer DJM Apps linking - Improve homepage card consistency by aligning recent writing image treatment with featured projects - Reduce excessive top spacing on blog post breadcrumb/header area for cleaner mobile and desktop flow - Include updated profile image assets currently staged in the working tree
1 parent 4416889 commit 731a9b7

File tree

5 files changed

+237
-78
lines changed

5 files changed

+237
-78
lines changed

public/assets/about-me-photo.jpeg

1.75 MB
Loading
328 KB
Loading

src/pages/blog/[slug].astro

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ const blogPost = allBlogPosts.find((p: any) => p.slug === post.slug);
3232
<Header />
3333

3434
<!-- Article Header -->
35-
<article class="py-20 article-bg">
35+
<article class="pt-8 md:pt-10 lg:pt-12 pb-20 article-bg">
3636
<div class="max-w-4xl mx-auto px-4 sm:px-6 lg:px-8">
3737
<!-- Breadcrumb -->
3838
<nav class="mb-8">

src/pages/index.astro

Lines changed: 206 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -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);

src/pages/projects.astro

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,36 @@ const roadmapProjects = getProjectsByStatus('roadmap');
5353
</div>
5454
</section>
5555

56+
<!-- VPS Lab Section -->
57+
<section class="py-12 section-bg border-b border-color">
58+
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
59+
<div class="neon-card p-6 md:p-8">
60+
<div class="flex flex-col md:flex-row md:items-center md:justify-between gap-6">
61+
<div>
62+
<div class="flex items-center gap-2 mb-3">
63+
<Folder class="h-5 w-5 project-icon" />
64+
<p class="text-sm font-semibold uppercase tracking-wide project-label">VPS Laboratory</p>
65+
</div>
66+
<h2 class="text-2xl md:text-3xl font-bold section-title mb-3">Follow my self-hosted deployment lab</h2>
67+
<p class="project-description max-w-3xl">
68+
I use a VPS as a portfolio laboratory for hosting and deployment experiments that are not always a great fit for Cloudflare-style platforms.
69+
This includes full stack PHP apps today, and eventually Java, C, and other server-side projects.
70+
</p>
71+
</div>
72+
<a
73+
href="https://djm-apps.com/"
74+
target="_blank"
75+
rel="noopener noreferrer"
76+
class="primary-cta-button flex items-center justify-center whitespace-nowrap"
77+
>
78+
<ExternalLink class="h-4 w-4 mr-2" />
79+
Visit DJM Apps
80+
</a>
81+
</div>
82+
</div>
83+
</div>
84+
</section>
85+
5686
<!-- Projects Grid -->
5787
<section class="py-20 projects-bg">
5888
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">

0 commit comments

Comments
 (0)