This commit is contained in:
Benjamin Toby 2026-02-16 12:50:45 +01:00
parent 8f5abed48d
commit 3b9fa373bc
8 changed files with 227 additions and 40 deletions

View File

@ -7,6 +7,7 @@ export const work = {
description: "Clould-based SQL data management system.", description: "Clould-based SQL data management system.",
href: "https://datasquirel.com", href: "https://datasquirel.com",
image: "/images/work/devops/server-management.png", image: "/images/work/devops/server-management.png",
metrics: [""],
technologies: [ technologies: [
"Node JS", "Node JS",
"SQL", "SQL",
@ -24,6 +25,11 @@ export const work = {
description: "Mortgage Broker in Utah", description: "Mortgage Broker in Utah",
href: "https://summitlending.com", href: "https://summitlending.com",
image: "/images/work/devops/server-management.png", image: "/images/work/devops/server-management.png",
metrics: [
"500+ leads/month",
"~10 deploys/week",
"99.99% uptime",
],
technologies: [ technologies: [
"Next JS", "Next JS",
"Tailwind CSS", "Tailwind CSS",
@ -38,6 +44,7 @@ export const work = {
description: "A new age of remote work. Targeted at developers", description: "A new age of remote work. Targeted at developers",
href: "https://coderank.net", href: "https://coderank.net",
image: "/images/work/devops/server-management.png", image: "/images/work/devops/server-management.png",
metrics: [""],
technologies: [ technologies: [
"Next JS", "Next JS",
"Docker", "Docker",
@ -49,6 +56,7 @@ export const work = {
title: "Mediajury", title: "Mediajury",
description: "The ultimate debate platform", description: "The ultimate debate platform",
href: "https://mediajury.org", href: "https://mediajury.org",
metrics: [""],
technologies: [ technologies: [
"SQL", "SQL",
"MariaDB", "MariaDB",
@ -64,6 +72,7 @@ export const work = {
title: "Circlenav", title: "Circlenav",
description: "The AI search engine done right", description: "The AI search engine done right",
href: "https://circlenav.net", href: "https://circlenav.net",
metrics: [""],
technologies: [ technologies: [
"SearXNG", "SearXNG",
"NextJS", "NextJS",
@ -81,6 +90,7 @@ export const work = {
title: "TurboCI", title: "TurboCI",
description: "Cloud VPS orchestrator that runs any workload", description: "Cloud VPS orchestrator that runs any workload",
href: "https://turboci.tben.me", href: "https://turboci.tben.me",
metrics: [""],
technologies: [ technologies: [
"Bun", "Bun",
"Shell", "Shell",
@ -98,6 +108,7 @@ export const work = {
"Self Hosted Email solution for all my personal projects", "Self Hosted Email solution for all my personal projects",
href: "https://box.mailben.xyz/mail", href: "https://box.mailben.xyz/mail",
image: "/images/work/devops/server-management.png", image: "/images/work/devops/server-management.png",
metrics: [""],
technologies: ["Linux", "Docker", "Mailinabox"], technologies: ["Linux", "Docker", "Mailinabox"],
}, },
{ {
@ -106,6 +117,7 @@ export const work = {
"Self Hosted repository for Git projects, NPM modules, Docker images, and more", "Self Hosted repository for Git projects, NPM modules, Docker images, and more",
href: "https://git.tben.me/tben", href: "https://git.tben.me/tben",
image: "/images/work/devops/server-management.png", image: "/images/work/devops/server-management.png",
metrics: [""],
technologies: ["Gitea", "Linux"], technologies: ["Gitea", "Linux"],
}, },
], ],
@ -118,6 +130,7 @@ export const work = {
title: "TurboCI", title: "TurboCI",
description: "Cloud VPS orchestrator that runs any workload", description: "Cloud VPS orchestrator that runs any workload",
href: "https://turboci.tben.me", href: "https://turboci.tben.me",
metrics: [""],
technologies: [ technologies: [
"Bun", "Bun",
"Shell", "Shell",
@ -135,6 +148,7 @@ export const work = {
"The easiest way to synchronize local and remote directories in real time", "The easiest way to synchronize local and remote directories in real time",
href: "https://git.tben.me/Moduletrace/turbo-sync", href: "https://git.tben.me/Moduletrace/turbo-sync",
image: "/images/work/devops/server-management.png", image: "/images/work/devops/server-management.png",
metrics: [""],
technologies: ["Node JS", "Bun JS", "Shell Scripting", "Rsync"], technologies: ["Node JS", "Bun JS", "Shell Scripting", "Rsync"],
}, },
{ {
@ -142,6 +156,7 @@ export const work = {
description: "Run multiple concurrent processes", description: "Run multiple concurrent processes",
href: "https://git.tben.me/Moduletrace/batchrun", href: "https://git.tben.me/Moduletrace/batchrun",
image: "/images/work/devops/server-management.png", image: "/images/work/devops/server-management.png",
metrics: [""],
technologies: ["Node JS"], technologies: ["Node JS"],
}, },
], ],

View File

@ -10,15 +10,29 @@ export default function AboutSection() {
return ( return (
<Section> <Section>
<Stack className="w-full max-w-full xl:max-w-[50vw]"> <Stack className="w-full max-w-full xl:max-w-[50vw]">
<H2 className="leading-snug">About Me</H2> <H2 className="leading-snug">
I Build & Operate Production Systems
</H2>
<Span> <Span>
I'm passionate and dedicated to solving problems using the I'm Benjamin Toby. DevOps/Platform engineer and CTO at
best technologies available. Summit Lending. I design, deploy, and operate infrastructure
that supports real businesses:
</Span> </Span>
<ul className="space-y-4">
<li>Automated CI/CD pipelines (TurboCI)</li>
<li>Multi-cloud deployments (AWS, GCP, Azure, Hetzner)</li>
<li>NGINX hardening, TLS, caching, rate limiting</li>
<li>Full-stack delivery (Next.js, Bun, SQL)</li>
</ul>
<Span>
I focus on measurable outcomes: faster deployments, lower
costs, fewer incidents.
</Span>
<Link className="dotted-text" href="/about"> <Link className="dotted-text" href="/about">
<Row> <Row>
<UserRoundSearch size={19} /> <UserRoundSearch size={19} />
<Span>Learn More About Me</Span> <Span>View Resume</Span>
</Row> </Row>
</Link> </Link>
</Stack> </Stack>

View File

@ -6,10 +6,11 @@ import Span from "@/components/lib/layout/Span";
import Stack from "@/components/lib/layout/Stack"; import Stack from "@/components/lib/layout/Stack";
import { work } from "../(data)/work"; import { work } from "../(data)/work";
import Link from "@/components/lib/layout/Link"; import Link from "@/components/lib/layout/Link";
import React from "react"; import React, { Fragment } from "react";
import Row from "@/components/lib/layout/Row"; import Row from "@/components/lib/layout/Row";
import Divider from "@/components/lib/layout/Divider"; import Divider from "@/components/lib/layout/Divider";
import { twMerge } from "tailwind-merge"; import { twMerge } from "tailwind-merge";
import { CheckCircle2, Circle } from "lucide-react";
type Props = { type Props = {
noTitle?: boolean; noTitle?: boolean;
@ -19,7 +20,7 @@ type Props = {
export default function MyWorkSection({ noTitle, expand }: Props) { export default function MyWorkSection({ noTitle, expand }: Props) {
const categories = Object.keys(work) as (keyof typeof work)[]; const categories = Object.keys(work) as (keyof typeof work)[];
const [category, setCategory] = React.useState<keyof typeof work>( const [category, setCategory] = React.useState<keyof typeof work>(
categories[0] categories[0],
); );
if (expand) { if (expand) {
@ -53,7 +54,7 @@ export default function MyWorkSection({ noTitle, expand }: Props) {
key={index} key={index}
/> />
); );
} },
)} )}
</div> </div>
</Stack> </Stack>
@ -88,7 +89,7 @@ export default function MyWorkSection({ noTitle, expand }: Props) {
"cursor-pointer", "cursor-pointer",
isActive isActive
? "" ? ""
: "opacity-40 hover:opacity-70" : "opacity-40 hover:opacity-70",
)} )}
onClick={() => setCategory(ctgr)} onClick={() => setCategory(ctgr)}
> >
@ -134,11 +135,30 @@ export function MyWorkPortfolioCard({
{portfolio.href} {portfolio.href}
</Link> </Link>
<Span>{portfolio.description}</Span> <Span>{portfolio.description}</Span>
{portfolio.technologies?.[0] && ( {portfolio.metrics?.[0] && (
<Fragment>
<Divider />
<Row className="gap-4"> <Row className="gap-4">
{portfolio.metrics.map((tch, _i) => (
<React.Fragment key={_i}>
<Row>
<CheckCircle2 size={15} />
<Span className="text-xs dark:text-white/40">
{tch}
</Span>
</Row>
</React.Fragment>
))}
</Row>
</Fragment>
)}
{portfolio.technologies?.[0] && (
<Fragment>
<Divider />
<Row className="gap-4 opacity-60">
{portfolio.technologies.map((tch, _i) => ( {portfolio.technologies.map((tch, _i) => (
<React.Fragment key={_i}> <React.Fragment key={_i}>
<Span className="text-sm dark:text-white/40"> <Span className="text-xs dark:text-white/40">
{tch} {tch}
</Span> </Span>
{_i < portfolio.technologies.length - 1 && ( {_i < portfolio.technologies.length - 1 && (
@ -147,6 +167,7 @@ export function MyWorkPortfolioCard({
</React.Fragment> </React.Fragment>
))} ))}
</Row> </Row>
</Fragment>
)} )}
</Stack> </Stack>
</Card> </Card>

View File

@ -0,0 +1,53 @@
import Button from "@/components/lib/layout/Button";
import H2 from "@/components/lib/layout/H2";
import Row from "@/components/lib/layout/Row";
import Section from "@/components/lib/layout/Section";
import Span from "@/components/lib/layout/Span";
import Stack from "@/components/lib/layout/Stack";
import { Contact, Mail } from "lucide-react";
export default function FooterCTASection() {
return (
<Section>
<Stack className="w-full max-w-full xl:max-w-[50vw] gap-8">
<H2 className="leading-snug">Need Help With Infrastructure?</H2>
<Span>
Whether it's CI/CD, cost optimization, or production
hardening, I can help.
</Span>
<Row className="items-stretch flex-col md:flex-row w-full md:w-auto gap-4">
<Button
title="Contact Me"
beforeIcon={
<Contact size={17} className="font-normal" />
}
href="/contact"
className="grow w-full"
>
Schedule a Call
</Button>
<Button
title="View My Work"
beforeIcon={<Mail size={17} className="font-normal" />}
href={`mailto:${process.env.NEXT_PUBLIC_EMAIL_ADDRESS}`}
className="grow w-full bg-transparent!"
variant="outlined"
>
Email Me
</Button>
{/* <Button
beforeIcon={
<ScrollText size={17} className="font-normal" />
}
href="/contact"
variant="outlined"
className="grow w-full"
>
Resume
</Button> */}
</Row>
</Stack>
</Section>
);
}

View File

@ -1,21 +1,42 @@
import LucideIcon from "@/components/lib/elements/lucide-icon";
import Button from "@/components/lib/layout/Button"; import Button from "@/components/lib/layout/Button";
import Divider from "@/components/lib/layout/Divider";
import H1 from "@/components/lib/layout/H1"; import H1 from "@/components/lib/layout/H1";
import Row from "@/components/lib/layout/Row"; import Row from "@/components/lib/layout/Row";
import Section from "@/components/lib/layout/Section"; import Section from "@/components/lib/layout/Section";
import Span from "@/components/lib/layout/Span"; import Span from "@/components/lib/layout/Span";
import Stack from "@/components/lib/layout/Stack"; import Stack from "@/components/lib/layout/Stack";
import { Contact, ScrollText } from "lucide-react"; import { Contact, ScrollText, Terminal } from "lucide-react";
export default function Main() { export default function Main() {
return ( return (
<Section> <Section>
<Stack className="w-full max-w-full xl:max-w-[50vw]"> <Stack className="w-full max-w-full xl:max-w-[50vw]">
<Span>Howdy Tech Enthusiasts! I'm Benjamin Toby</Span> <Span>Benjamin Toby</Span>
<H1 className="leading-snug"> <H1 className="leading-snug m-0!">
Software Engineer, DevOps Engineer, Full Stack Developer, DevOps & Platform Engineer
Software Architect, Philosopher, Solar Energy Enthusiast.
</H1> </H1>
<Row className="items-stretch flex-col md:flex-row w-full md:w-auto"> <Span className="text-xl">
I help teams ship faster, cut infrastructure costs, and
achieve reliable production systems.
</Span>
<Row className="my-4 gap-6">
<Row>
<LucideIcon name="CheckCircle2" size={20} />
<Span>99.99% uptime targets</Span>
</Row>
<Divider vertical />
<Row>
<LucideIcon name="CheckCircle2" size={20} />
<Span>~10 deployments/week</Span>
</Row>
<Divider vertical />
<Row>
<LucideIcon name="CheckCircle2" size={20} />
<Span>Over 80% Operations cost reduction</Span>
</Row>
</Row>
<Row className="items-stretch flex-col md:flex-row w-full md:w-auto gap-4">
<Button <Button
title="Contact Me" title="Contact Me"
beforeIcon={ beforeIcon={
@ -24,7 +45,18 @@ export default function Main() {
href="/contact" href="/contact"
className="grow w-full" className="grow w-full"
> >
Contact Me Book a Consultation
</Button>
<Button
title="View My Work"
beforeIcon={
<Terminal size={17} className="font-normal" />
}
href="/work"
className="grow w-full bg-transparent!"
variant="outlined"
>
View My Work
</Button> </Button>
{/* <Button {/* <Button
beforeIcon={ beforeIcon={

View File

@ -1,27 +1,76 @@
import Button from "@/components/lib/layout/Button";
import Divider from "@/components/lib/layout/Divider";
import H1 from "@/components/lib/layout/H1"; import H1 from "@/components/lib/layout/H1";
import H2 from "@/components/lib/layout/H2";
import Link from "@/components/lib/layout/Link"; import Link from "@/components/lib/layout/Link";
import P from "@/components/lib/layout/P";
import Row from "@/components/lib/layout/Row"; import Row from "@/components/lib/layout/Row";
import Section from "@/components/lib/layout/Section"; import Section from "@/components/lib/layout/Section";
import Span from "@/components/lib/layout/Span"; import Span from "@/components/lib/layout/Span";
import Stack from "@/components/lib/layout/Stack"; import Stack from "@/components/lib/layout/Stack";
import { Mail } from "lucide-react"; import { Terminal } from "lucide-react";
export default function Main() { export default function Main() {
return ( return (
<Section> <Section>
<Stack className="w-full max-w-full xl:max-w-[50vw]"> <Stack className="w-full max-w-full xl:max-w-[50vw] gap-8">
{/* <Span className="leading-snug -mb-6 text-sm">
I Build & Operate Production Systems
</Span> */}
<H1 className="leading-snug">About Me</H1> <H1 className="leading-snug">About Me</H1>
<Span> <Span>
I'm a man of few words. My{" "} I'm Benjamin Toby, a DevOps/Platform engineer and CTO at
<Link href="/skills" className="dotted-text"> Summit Lending. I build and operate production systems that
Skills support real businesses.
</Link>{" "}
and{" "}
<Link href="/work" className="dotted-text">
Work
</Link>{" "}
speak for themselves.
</Span> </Span>
<Divider />
<H2>What I Do</H2>
<Span>I focus on infrastructure and reliability:</Span>
<ul className="space-y-4">
<li>CI/CD automation and deployment pipelines</li>
<li>Multi-cloud architecture (AWS, GCP, Azure, Hetzner)</li>
<li>NGINX hardening, TLS, caching, rate limiting</li>
<li>Full-stack delivery with Next.js, Bun, and SQL</li>
</ul>
<Divider />
<H2>Background</H2>
<P>
I started as a full-stack developer and moved into DevOps
and platform engineering out of necessity, building systems
that could scale without breaking. That led to Summit
Lending, where I manage all engineering, from infrastructure
to product.
</P>
<P>
Along the way I built TurboCI, a deployment orchestration
tool, and Datasquirel, a cloud SQL platform. I write about
what I learn on my <a href="/blog">blog</a>.
</P>
<Divider />
<Span>
I focus on measurable outcomes: faster deployments, lower
costs, fewer incidents.
</Span>
<Row className="items-stretch flex-col md:flex-row w-full md:w-auto gap-4">
<Button
title="View My Work"
beforeIcon={
<Terminal size={17} className="font-normal" />
}
href="/work"
className="grow w-full bg-transparent!"
variant="outlined"
>
View My Work
</Button>
</Row>
</Stack> </Stack>
</Section> </Section>
); );

View File

@ -4,6 +4,7 @@ import AboutSection from "@/components/pages/Home/(sections)/AboutSection";
import Divider from "@/components/lib/layout/Divider"; import Divider from "@/components/lib/layout/Divider";
import MySkillsSection from "@/components/pages/Home/(sections)/MySkillsSection"; import MySkillsSection from "@/components/pages/Home/(sections)/MySkillsSection";
import MyWorkSection from "@/components/pages/Home/(sections)/MyWorkSection"; import MyWorkSection from "@/components/pages/Home/(sections)/MyWorkSection";
import FooterCTASection from "@/components/pages/Home/(sections)/footer-cta-section";
export default function Home() { export default function Home() {
return ( return (
@ -20,6 +21,8 @@ export default function Home() {
<MySkillsSection /> <MySkillsSection />
<Divider /> <Divider />
<MyWorkSection /> <MyWorkSection />
<Divider />
<FooterCTASection />
</Layout> </Layout>
); );
} }

View File

@ -7,5 +7,5 @@ Allow: /
Sitemap: https://www.tben.me/sitemap.xml Sitemap: https://www.tben.me/sitemap.xml
# Optional: disallow common non-content paths (uncomment if needed) # Optional: disallow common non-content paths (uncomment if needed)
# Disallow: /api/ Disallow: /api/
# Disallow: /_next/ Disallow: /_next/