Skip to content

Commit a7c4aa4

Browse files
committed
SEO
1 parent e88b86f commit a7c4aa4

File tree

5 files changed

+38
-11
lines changed

5 files changed

+38
-11
lines changed

public/Jake Callcut.pdf

103 KB
Binary file not shown.

src/data/content.json

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,31 +14,42 @@
1414
"website": "https://jakecallcut.dev"
1515
},
1616
"about": {
17-
"bio": "Im a software engineer with a passion for blending design and technology. With experience spanning mobile apps, embedded systems, and full-stack development, I enjoy solving complex problems and delivering polished, human-centered solutions. Outside of work, I’m always learning new tools and exploring how technology can make everyday life a little easier.",
18-
"skills": ["Swift", "Flutter", "Java", "Python", "Ada/SPARK"],
17+
"bio": "I'm a software engineer with a passion for blending design and technology. With experience spanning mobile apps, embedded systems, and full-stack development, I enjoy solving complex problems and delivering polished, human-centered solutions. Outside of work, I’m always learning new tools and exploring how technology can make everyday life a little easier.",
18+
"skills": ["Swift", "Flutter", "Java", "Python", "TypeScript"],
1919
"toolbox": ["VS Code", "Xcode", "Figma", "Git", "Docker"]
2020
},
2121
"experience": [
2222
{
2323
"company": "Squircle",
2424
"role": "Developer",
25-
"period": "2025 — Present",
25+
"period": "Jul 2025 — Present",
2626
"location": "Glasgow, Scotland",
2727
"image": "/experience-one.png",
2828
"bullets": [
29-
"Developed an iOS app that uses NFC tiles and encrypted payloads to trigger custom shortcuts and actions.",
30-
"Introduced modern DevOps workflows that reduced release friction and improved reliability."
29+
"Independently designed and engineered an iOS app that uses RFID Hardware and encrypted payloads to trigger custom shortcuts and actions.",
30+
"Aided in establishing B2B and B2C Logistics and coordinating trials with clients."
3131
]
3232
},
3333
{
3434
"company": "GI Healthcare Industries Limited",
3535
"role": "Software Engineer",
36-
"period": "2024 — Present",
36+
"period": "Aug 2024 — Present",
3737
"location": "Edinburgh, Scotland",
3838
"image": "/experience-two.png",
3939
"bullets": [
40-
"Developed software to support healthcare technology used in clinical environments.",
41-
"Worked closely with engineers and medical staff to ensure safety-critical compliance."
40+
"Solely developed and launched the company's website, gihealthcare.co.uk, using Flutter and Azure, bringing the company online and enabling engagement with clients and partners.",
41+
"Collaborated with a team of developers to build a multi-machine control system using Flutter, Bloc state management, and adhering to SOLID principles and the MVC architecture to ensure scalable, maintainable, and efficient code."
42+
]
43+
},
44+
{
45+
"company": "GI Healthcare Industries Limited",
46+
"role": "UI/UX Intern",
47+
"period": "Jun 2024 — Aug 2024",
48+
"location": "Edinburgh, Scotland",
49+
"image": "/experience-two.png",
50+
"bullets": [
51+
"Designed the front-end interface for a multi-machine control system, from low-fidelity wireframes to developer-ready handoff using Figma. Helping take the company's new product from TRL 3 to TRL 5.",
52+
"Liased with engineers and military personnel to ensure the interface met user needs and operational requirements."
4253
]
4354
}
4455
],

src/lib/seo.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { useEffect } from 'react';
22

3-
const SITE_TITLE = 'Jake Callcut Designer & Developer';
3+
const SITE_TITLE = 'Jake Callcut - Designer & Developer';
44
const SITE_URL = 'https://jakecallcut.dev';
55
const DEFAULT_IMAGE = '/og-image.png';
66

src/routes/Contact.tsx

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { motion } from 'framer-motion';
22
import content from '../data/content.json';
3+
import SEO from '../lib/seo';
34
// SocialLinks removed from contact page; icons are in the footer
45

56
export default function Contact() {
@@ -17,6 +18,7 @@ export default function Contact() {
1718

1819
return (
1920
<motion.section initial={{ opacity: 0 }} animate={{ opacity: 1 }} exit={{ opacity: 0 }}>
21+
<SEO title="Contact" description="Get in touch with me for opportunities, collaborations, or projects" />
2022
<h1 className="text-3xl font-bold mb-8">Contact</h1>
2123
<form className="max-w-lg mx-auto flex flex-col gap-4" onSubmit={handleMailto}>
2224
<input
@@ -40,11 +42,23 @@ export default function Contact() {
4042
className="w-full px-4 py-3 border border-border rounded-2xl bg-card text-card-foreground focus:outline-none focus-visible:ring-2 focus-visible:ring-primary"
4143
rows={5}
4244
/>
43-
<button type="submit" className="btn btn-primary">Send</button>
45+
<button type="submit" className="inline-flex items-center justify-center font-medium rounded-2xl transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-primary bg-primary text-primary-foreground hover:bg-primary/90 px-5 py-3 text-base">Send</button>
4446
</form>
4547
<div className="mt-8 text-center">
4648
<div className="mb-2">Or email directly: <a href={`mailto:${contact.email}`} className="text-primary underline">{contact.email}</a></div>
47-
<div className="mb-2">{contact.note}</div>
49+
<div className="mb-6">{contact.note}</div>
50+
<a
51+
href="/Jake Callcut.pdf"
52+
download="Jake_Callcut_CV.pdf"
53+
className="mt-8 inline-flex items-center justify-center gap-2 bg-secondary text-secondary-foreground px-5 py-3 text-base rounded-2xl shadow-md hover:shadow-lg focus-visible:ring-2 focus-visible:ring-primary transition-transform transform-gpu hover:-translate-y-0.5"
54+
>
55+
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" aria-hidden="true" className="opacity-90">
56+
<path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round"/>
57+
<polyline points="7,10 12,15 17,10" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round"/>
58+
<line x1="12" y1="15" x2="12" y2="3" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round"/>
59+
</svg>
60+
<span>Download CV</span>
61+
</a>
4862
</div>
4963
</motion.section>
5064
);

src/routes/Experience.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
import { motion } from 'framer-motion';
22
import content from '../data/content.json';
33
import TimelineItem from '../components/TimelineItem';
4+
import SEO from '../lib/seo';
45

56
export default function Experience() {
67
const { experience } = content;
78
return (
89
<motion.section initial={{ opacity: 0 }} animate={{ opacity: 1 }} exit={{ opacity: 0 }}>
10+
<SEO title="Experience" description="My professional experience and work history" />
911
<h1 className="text-4xl font-extrabold mb-12 text-center tracking-tight">Experience</h1>
1012
<div className="flex flex-col gap-10 border-l-2 border-primary pl-6">
1113
{experience.map((item, idx) => (

0 commit comments

Comments
 (0)