Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion blog/2026/github-organisation.md
Original file line number Diff line number Diff line change
Expand Up @@ -70,4 +70,5 @@ If you've been putting it off because it felt like unnecessary ceremony, I'd pus

---

Fynes Forge is at [github.com/fynes-forge](https://github.com/fynes-forge) if you want to see how it looks in practice. The profile README and repo structure are all there. If you want to see the branding itself — colours, logo variants, typography, and UI elements — the full reference is at [fynes-forge.github.io/branding-pack-v2.html](https://fynes-forge.github.io/branding-pack-v2.html).
Fynes Forge is at [github.com/fynes-forge](https://github.com/fynes-forge) if you want to see how it looks in practice. The profile README and repo structure are all there. If you want to see the branding itself — colours, logo variants, typography, and UI elements — the full reference can be seen [here](
/branding-pack-v2.html).
52 changes: 30 additions & 22 deletions src/components/Universe/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,16 @@ const milestones = [
isCurrent: false,
r: 8,
},
{
id: 6,
x: 770,
y: 86,
role: "Lead Data Engineer ",
company: "Jet2",
period: "2024–2024",
isCurrent: false,
r: 8,
},
{
id: 6,
x: 820,
Expand Down Expand Up @@ -91,23 +101,23 @@ function extractStartYear(period) {

/** Static star field — pre-defined to keep SSR safe (no Math.random on server). */
const STARS = [
{ cx: 45, cy: 30, r: 1.2, d: 0.0 },
{ cx: 120, cy: 75, r: 0.8, d: 0.5 },
{ cx: 195, cy: 18, r: 1.0, d: 1.2 },
{ cx: 310, cy: 58, r: 0.7, d: 0.3 },
{ cx: 450, cy: 14, r: 1.1, d: 1.8 },
{ cx: 560, cy: 48, r: 0.9, d: 0.8 },
{ cx: 650, cy: 22, r: 1.0, d: 2.1 },
{ cx: 740, cy: 42, r: 0.8, d: 0.1 },
{ cx: 845, cy: 18, r: 1.1, d: 1.5 },
{ cx: 890, cy: 65, r: 0.7, d: 0.9 },
{ cx: 58, cy: 148, r: 0.8, d: 2.3 },
{ cx: 45, cy: 30, r: 1.2, d: 0.0 },
{ cx: 120, cy: 75, r: 0.8, d: 0.5 },
{ cx: 195, cy: 18, r: 1.0, d: 1.2 },
{ cx: 310, cy: 58, r: 0.7, d: 0.3 },
{ cx: 450, cy: 14, r: 1.1, d: 1.8 },
{ cx: 560, cy: 48, r: 0.9, d: 0.8 },
{ cx: 650, cy: 22, r: 1.0, d: 2.1 },
{ cx: 740, cy: 42, r: 0.8, d: 0.1 },
{ cx: 845, cy: 18, r: 1.1, d: 1.5 },
{ cx: 890, cy: 65, r: 0.7, d: 0.9 },
{ cx: 58, cy: 148, r: 0.8, d: 2.3 },
{ cx: 148, cy: 195, r: 1.0, d: 0.6 },
{ cx: 280, cy: 165, r: 0.9, d: 1.1 },
{ cx: 420, cy: 128, r: 0.7, d: 2.7 },
{ cx: 600, cy: 150, r: 1.1, d: 0.4 },
{ cx: 760, cy: 162, r: 0.8, d: 1.9 },
{ cx: 30, cy: 275, r: 0.7, d: 0.7 },
{ cx: 30, cy: 275, r: 0.7, d: 0.7 },
{ cx: 165, cy: 425, r: 0.9, d: 1.6 },
{ cx: 350, cy: 440, r: 0.8, d: 2.4 },
{ cx: 495, cy: 410, r: 0.7, d: 0.2 },
Expand All @@ -117,8 +127,8 @@ const STARS = [
{ cx: 448, cy: 358, r: 0.7, d: 0.8 },
{ cx: 788, cy: 248, r: 0.8, d: 2.5 },
{ cx: 918, cy: 158, r: 0.6, d: 1.0 },
{ cx: 328, cy: 98, r: 0.7, d: 2.2 },
{ cx: 708, cy: 82, r: 0.8, d: 0.3 },
{ cx: 328, cy: 98, r: 0.7, d: 2.2 },
{ cx: 708, cy: 82, r: 0.8, d: 0.3 },
];

/**
Expand Down Expand Up @@ -181,13 +191,13 @@ export default function Universe() {
</feMerge>
</filter>
<linearGradient id="uni-path-grad" x1="0%" y1="0%" x2="100%" y2="0%">
<stop offset="0%" stopColor={PERIWINKLE} stopOpacity="0.25" />
<stop offset="65%" stopColor={PALE_BLUE} stopOpacity="0.55" />
<stop offset="100%" stopColor={ACCENT} stopOpacity="0.85" />
<stop offset="0%" stopColor={PERIWINKLE} stopOpacity="0.25" />
<stop offset="65%" stopColor={PALE_BLUE} stopOpacity="0.55" />
<stop offset="100%" stopColor={ACCENT} stopOpacity="0.85" />
</linearGradient>
<radialGradient id="uni-current-glow" cx="50%" cy="50%" r="50%">
<stop offset="0%" stopColor={ACCENT} stopOpacity="0.35" />
<stop offset="100%" stopColor={ACCENT} stopOpacity="0" />
<stop offset="0%" stopColor={ACCENT} stopOpacity="0.35" />
<stop offset="100%" stopColor={ACCENT} stopOpacity="0" />
</radialGradient>
</defs>

Expand Down Expand Up @@ -373,9 +383,7 @@ export default function Universe() {
className="absolute bottom-4 left-1/2 -translate-x-1/2 px-4 py-3 rounded-xl text-sm pointer-events-none z-10"
style={{
background: "rgba(4, 4, 18, 0.95)",
border: `1px solid ${
hovered.isCurrent ? ACCENT : PERIWINKLE
}45`,
border: `1px solid ${hovered.isCurrent ? ACCENT : PERIWINKLE}45`,
boxShadow: hovered.isCurrent
? `0 0 24px ${ACCENT}30`
: `0 0 14px ${PERIWINKLE}18`,
Expand Down
40 changes: 23 additions & 17 deletions src/pages/career.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,14 +19,15 @@ const ACCENT = "#DD7596";
const PERIWINKLE = "#B7C3F3";
const PALE_BLUE = "#AED6F1";
const MAGENTA = "#ECDA90";
const CONTACT_EMAIL = "tom.fynes@icloud.com";
const CONTACT_EMAIL = "tf.dev@icloud.com";

// ─── Data ──────────────────────────────────────────────────────────────────────

const FILTERS = [
{ id: "all", label: "All" },
{ id: "emis-optum", label: "EMIS / Optum" },
{ id: "data-shed", label: "The Data Shed" },
{ id: "jet-2", label: "Jet2" },
];

const workHistory = [
Expand All @@ -48,7 +49,7 @@ const workHistory = [
},
{
id: 2,
company: "EMIS",
company: "Jet2",
role: "Lead Data Engineer",
period: "January 2024 – March 2024",
badge: null,
Expand Down Expand Up @@ -164,14 +165,14 @@ const workHistory = [
];

const KEY_SKILLS = [
{ label: "Python", color: ACCENT },
{ label: "SQL", color: PERIWINKLE },
{ label: "Spark", color: MAGENTA },
{ label: "Airflow", color: PALE_BLUE },
{ label: "Python", color: ACCENT },
{ label: "SQL", color: PERIWINKLE },
{ label: "Spark", color: MAGENTA },
{ label: "Airflow", color: PALE_BLUE },
{ label: "Snowflake", color: PERIWINKLE },
{ label: "AWS", color: MAGENTA },
{ label: "Azure", color: ACCENT },
{ label: "dbt", color: PALE_BLUE },
{ label: "AWS", color: MAGENTA },
{ label: "Azure", color: ACCENT },
{ label: "dbt", color: PALE_BLUE },
];

// ─── Sub-components ────────────────────────────────────────────────────────────
Expand Down Expand Up @@ -299,7 +300,11 @@ function WorkCard({ entry, isHovered }) {
{/* Highlights */}
<ul className="space-y-1.5 m-0 p-0 list-none">
{entry.highlights.map((h, i) => (
<li key={i} className="flex items-start gap-2 text-sm" style={{ opacity: 0.8 }}>
<li
key={i}
className="flex items-start gap-2 text-sm"
style={{ opacity: 0.8 }}
>
<span
className="mt-1.5 w-1.5 h-1.5 rounded-full flex-shrink-0"
style={{ background: entry.companyColor }}
Expand Down Expand Up @@ -367,9 +372,9 @@ export default function Career() {
<FadeInOnScroll direction="up" delay={500}>
<div className="flex justify-center gap-10 md:gap-20 flex-wrap">
{[
{ end: 8, plus: true, label: "Years Experience" },
{ end: 3, plus: false, label: "Companies" },
{ end: 10, plus: true, label: "Technologies" },
{ end: 8, plus: true, label: "Years Experience" },
{ end: 4, plus: false, label: "Companies" },
{ end: 10, plus: true, label: "Technologies" },
].map(({ end, plus, label }) => (
<div key={label} className="text-center min-w-20">
<div
Expand Down Expand Up @@ -426,9 +431,7 @@ export default function Career() {
background:
filter === f.id ? `${ACCENT}20` : "transparent",
color:
filter === f.id
? ACCENT
: "var(--ifm-font-color-base)",
filter === f.id ? ACCENT : "var(--ifm-font-color-base)",
borderColor:
filter === f.id
? `${ACCENT}60`
Expand Down Expand Up @@ -520,7 +523,10 @@ export default function Career() {
>
Tech Snapshot
</h2>
<p className="text-base max-w-lg mx-auto" style={{ opacity: 0.6 }}>
<p
className="text-base max-w-lg mx-auto"
style={{ opacity: 0.6 }}
>
A quick glimpse of the core technologies in my toolkit.
</p>
</div>
Expand Down
30 changes: 18 additions & 12 deletions src/pages/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,7 @@ import {
} from "@site/src/components/animations";
import styles from "./index.module.css";

const Universe = React.lazy(() =>
import("@site/src/components/Universe")
);
const Universe = React.lazy(() => import("@site/src/components/Universe"));

// ── Count-up stat helper ─────────────────────────────────────────────
function CountUp({ end, suffix = "" }) {
Expand Down Expand Up @@ -78,7 +76,10 @@ function ScrollIndicator() {
animate={prefersReducedMotion ? {} : { y: [0, 8, 0] }}
transition={{ duration: 1.5, repeat: Infinity, ease: "easeInOut" }}
>
<ChevronDown className="w-6 h-6" style={{ color: "rgba(255,255,255,0.5)" }} />
<ChevronDown
className="w-6 h-6"
style={{ color: "rgba(255,255,255,0.5)" }}
/>
</motion.div>
</motion.div>
);
Expand Down Expand Up @@ -118,7 +119,10 @@ export function HomepageHeader() {
<FadeInOnScroll direction="down" delay={0}>
<div className={styles.profileGlow}>
<div className={styles.conicRing}>
<div className="rounded-full overflow-hidden bg-[#0f0f1a]" style={{ padding: 2 }}>
<div
className="rounded-full overflow-hidden bg-[#0f0f1a]"
style={{ padding: 2 }}
>
<img
src="img/profile.jpg"
alt="Avatar"
Expand All @@ -136,7 +140,8 @@ export function HomepageHeader() {
<h1
className="text-5xl md:text-7xl font-extrabold tracking-tight bg-clip-text text-transparent"
style={{
backgroundImage: "linear-gradient(135deg, #DD7596 0%, #B7C3F3 60%, #AED6F1 100%)",
backgroundImage:
"linear-gradient(135deg, #DD7596 0%, #B7C3F3 60%, #AED6F1 100%)",
WebkitBackgroundClip: "text",
WebkitTextFillColor: "transparent",
}}
Expand Down Expand Up @@ -218,7 +223,7 @@ function QuickStatsBar() {
const stats = [
{ value: 8, suffix: "+", label: "Years Experience" },
{ value: 10, suffix: "+", label: "Technologies" },
{ value: 3, suffix: "", label: "Companies" },
{ value: 4, suffix: "", label: "Companies" },
];

return (
Expand All @@ -241,7 +246,10 @@ function QuickStatsBar() {
>
<CountUp end={s.value} suffix={s.suffix} />
</p>
<p className="text-sm mt-1" style={{ color: "rgba(183,195,243,0.75)" }}>
<p
className="text-sm mt-1"
style={{ color: "rgba(183,195,243,0.75)" }}
>
{s.label}
</p>
</div>
Expand Down Expand Up @@ -331,9 +339,7 @@ function SkillsTeaser() {
}}
>
<FadeInOnScroll direction="up" delay={0}>
<h2
className="text-2xl font-bold text-center mb-8"
>
<h2 className="text-2xl font-bold text-center mb-8">
Key Technologies
</h2>
</FadeInOnScroll>
Expand Down Expand Up @@ -431,7 +437,7 @@ function FinalCTA() {
</motion.a>

<motion.a
href="mailto:tom.fynes@icloud.com"
href="mailto:tf.dev@icloud.com"
className="px-8 py-3 rounded-xl font-bold text-base inline-block"
style={{
color: "#DD7596",
Expand Down
Loading