diff --git a/.gitignore b/.gitignore
index 5ef6a52..e46600e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -39,3 +39,7 @@ yarn-error.log*
# typescript
*.tsbuildinfo
next-env.d.ts
+
+# source media (web versions live in public/)
+content/*.mp4
+content/*.pdf
diff --git a/app/page.tsx b/app/page.tsx
index d646b43..4c6e7c6 100644
--- a/app/page.tsx
+++ b/app/page.tsx
@@ -1,15 +1,15 @@
-import Link from "next/link";
+import Filmography from "@/components/Filmography";
import Hero from "@/components/Hero";
import ProjectCard from "@/components/ProjectCard";
import Reveal from "@/components/Reveal";
import SectionLabel from "@/components/SectionLabel";
-import { projects, services, site, stats } from "@/content/site";
+import { filmography, projects, services, site, stats, studioStills } from "@/content/site";
const pipeline = [
{ step: "Breakdown", body: "Script and plate breakdowns, bids and a shot list everyone agrees on." },
- { step: "Build", body: "Assets, environments and lookdev, approved in context, not in isolation." },
+ { step: "Build", body: "Assets, creatures and environments, approved in context, not in isolation." },
{ step: "Shot", body: "Artists work in tracked versions, reviewed daily on our own review platform." },
- { step: "QC", body: "Every EXR is checked automatically for frame range, NaNs, dead pixels and colour space before a human signs off." },
+ { step: "QC", body: "Renders are checked automatically for frame range, bad pixels and colour space before a human signs off." },
{ step: "Deliver", body: "Spec-correct, frame-accurate deliveries with full shot metadata." },
];
@@ -28,42 +28,66 @@ export default function Home() {
))}
-
-
- All projects →
-
+
+
+ {/* Filmography */}
+
+
+
Filmography
+
+
+
+ {filmography.length} titles. Seen across the world.
+
+
+
+ Visual effects for features and series from South Africa and Nigeria, released in cinemas and on
+ Netflix, Prime Video and M-Net.
+
+
+
{/* Services */}
-
Services
+
Services
- From first breakdown to final delivery .
+ From photoreal VFX to stylised animation.
-
- {services.map((s, i) => (
-
-
-
{s.code}
-
{s.title}
-
{s.body}
-
-
- ))}
-
+ {services.map((g) => (
+
+
{g.group}
+
+ {g.items.map((s, i) => (
+
+
+ {/* eslint-disable-next-line @next/next/no-img-element */}
+
+
+
+ {s.title}
+
+
+
+ ))}
+
+
+ ))}
{/* Studio / pipeline */}
- Studio
+ Studio
@@ -72,16 +96,23 @@ export default function Home() {
- Two Tales started in {site.founded} as an animation studio. A decade later we're a visual
- effects house that still thinks like animators: every frame is performance, every shot is story.
+ Founded in {site.founded} in Pretoria as Two Tales Animation, we bring stories to life with
+ creativity, technology and a passion for visual storytelling, from photoreal creatures and
+ simulations to stylised character animation.
- We're small on purpose. Senior artists, direct lines to supervisors, and an in-house pipeline
- (review, shot tracking and automated QC) that lets a tight team deliver like a big one.
+ We're small on purpose: senior artists, direct lines to supervisors, and an in-house pipeline
+ for review, shot tracking and automated QC that lets a tight team deliver like a big one.
+
+ {studioStills.map((src) => (
+ // eslint-disable-next-line @next/next/no-img-element
+
+ ))}
+
-
+
{pipeline.map((p, i) => (
@@ -114,7 +145,7 @@ export default function Home() {
aria-hidden="true"
/>
-
+
Contact
@@ -128,7 +159,7 @@ export default function Home() {
{site.email}
diff --git a/app/work/[slug]/page.tsx b/app/work/[slug]/page.tsx
index e893dd8..389cd88 100644
--- a/app/work/[slug]/page.tsx
+++ b/app/work/[slug]/page.tsx
@@ -17,7 +17,7 @@ export async function generateMetadata({ params }: PageProps<"/work/[slug]">): P
return { title: project.title, description: project.summary };
}
-function Video({ src, title }: { src: string; title: string }) {
+function Video({ src, title, poster }: { src: string; title: string; poster?: string }) {
if (/vimeo\.com|youtube\.com|youtu\.be/.test(src)) {
return (
);
}
- return ;
+ return ;
}
export default async function ProjectPage({ params }: PageProps<"/work/[slug]">) {
@@ -43,7 +43,6 @@ export default async function ProjectPage({ params }: PageProps<"/work/[slug]">)
{ k: "Client", v: project.client },
{ k: "Year", v: String(project.year) },
{ k: "Type", v: project.category },
- ...(project.shots ? [{ k: "Shots", v: String(project.shots) }] : []),
];
return (
@@ -59,9 +58,18 @@ export default async function ProjectPage({ params }: PageProps<"/work/[slug]">)
- {project.video ? : }
+ {project.video ? : }
+ {project.gallery && (
+
+ {project.gallery.map((src) => (
+ // eslint-disable-next-line @next/next/no-img-element
+
+ ))}
+
+ )}
+
{meta.map((m) => (
diff --git a/app/work/page.tsx b/app/work/page.tsx
index 61efc3a..da040de 100644
--- a/app/work/page.tsx
+++ b/app/work/page.tsx
@@ -1,4 +1,5 @@
import type { Metadata } from "next";
+import Filmography from "@/components/Filmography";
import ProjectCard from "@/components/ProjectCard";
import Reveal from "@/components/Reveal";
import SectionLabel from "@/components/SectionLabel";
@@ -23,6 +24,11 @@ export default function WorkPage() {
))}
+
+
);
}
diff --git a/components/Filmography.tsx b/components/Filmography.tsx
new file mode 100644
index 0000000..bcdf59e
--- /dev/null
+++ b/components/Filmography.tsx
@@ -0,0 +1,38 @@
+import Reveal from "./Reveal";
+import { filmography } from "@/content/site";
+
+export default function Filmography() {
+ return (
+
+ {filmography.map((c, i) => (
+
+
+
+
+ {/* eslint-disable-next-line @next/next/no-img-element */}
+
+
+ {c.network && (
+
+ {c.network}
+
+ )}
+
+
+ {c.title}
+
+ {c.year} · {c.format}
+
+
+
+
+
+ ))}
+
+ );
+}
diff --git a/components/Frame.tsx b/components/Frame.tsx
index 5e5609e..98d322d 100644
--- a/components/Frame.tsx
+++ b/components/Frame.tsx
@@ -22,16 +22,15 @@ export default function Frame({ project, priority = false }: { project: Project;
radial-gradient(ellipse 50% 60% at 20% 30%, hsl(${(h + 40) % 360} 60% 30% / .5), transparent 70%),
linear-gradient(180deg, hsl(${h} 25% 9%), hsl(${h} 30% 4%))`,
}}
- >
-
-
+ />
)}
+
-
+
{project.category} · {project.year}
-
- {project.shots ? `${project.shots} SHOTS` : "2.39:1"}
+
+ {project.video ? "▶ Film" : "Still"}
);
diff --git a/components/Header.tsx b/components/Header.tsx
index 7751ef7..78aa2bd 100644
--- a/components/Header.tsx
+++ b/components/Header.tsx
@@ -29,7 +29,7 @@ export default function Header() {
setOpen(false)}>
-
+
Two Tales VFX
diff --git a/components/ProjectCard.tsx b/components/ProjectCard.tsx
index e870d52..0a73180 100644
--- a/components/ProjectCard.tsx
+++ b/components/ProjectCard.tsx
@@ -13,7 +13,7 @@ export default function ProjectCard({ project }: { project: Project }) {
{project.client}
-
+
{project.credits.slice(0, 2).join(" / ")}
diff --git a/content/site.ts b/content/site.ts
index 149861e..1450fec 100644
--- a/content/site.ts
+++ b/content/site.ts
@@ -1,19 +1,20 @@
-// All editable site copy lives here. Anything marked TODO is placeholder
-// content that should be replaced with real studio information before launch.
+// All editable site copy lives here. Facts come from the Dec 2024 company
+// profile (content/TT_Company_profile.pdf). Items marked TODO need confirming.
export const site = {
name: "Two Tales VFX",
shortName: "TTVFX",
url: "https://ttvfx.com",
- founded: 2015,
+ // TODO: company profile says founded 2014; the logo lockup says "Est. 2015".
+ founded: 2014,
tagline: "Invisible work. Unforgettable frames.",
description:
- "Two Tales VFX is an independent visual effects studio crafting compositing, CG and finishing for series, film and commercials.",
- // TODO: confirm the public contact address and location.
- email: "hello@ttvfx.com",
- location: "South Africa",
- // Optional showreel. Drop an MP4 at public/reel.mp4 (and a poster frame at
- // public/reel-poster.jpg) and set this to "/reel.mp4" to play it in the hero.
+ "Two Tales VFX is a 3D animation and visual effects studio in Pretoria, South Africa, crafting VFX for film, series and commercials for clients across the globe.",
+ // TODO: switch to an @ttvfx.com address once the domain's mail is set up.
+ email: "chris@twotalesanimation.com",
+ location: "Pretoria, South Africa",
+ // Optional studio showreel for the home hero: drop public/reel.mp4 and set
+ // this to "/reel.mp4" (and reelPoster to a still).
reel: null as string | null,
reelPoster: null as string | null,
socials: [
@@ -23,49 +24,80 @@ export const site = {
export const nav = [
{ label: "Work", href: "/work/" },
+ { label: "Filmography", href: "/#filmography" },
{ label: "Services", href: "/#services" },
- { label: "Studio", href: "/#studio" },
{ label: "Contact", href: "/#contact" },
];
-export const services = [
+export type Service = { title: string; image: string };
+
+export const services: { group: string; items: Service[] }[] = [
{
- code: "01",
- title: "Compositing",
- body: "Plate-driven, photoreal integration. Keying, set extensions, CG integration, sky replacements and the hundreds of invisible fixes that hold a cut together.",
+ group: "Visual Effects",
+ items: [
+ { title: "Creature Effects", image: "/capabilities/creature.jpg" },
+ { title: "Set Extensions", image: "/capabilities/set-extension.jpg" },
+ { title: "Volume Simulations", image: "/capabilities/volume-sim.jpg" },
+ { title: "Fluid Simulations", image: "/capabilities/fluid-sim.jpg" },
+ { title: "Screen Replacements", image: "/capabilities/screen-replacement.jpg" },
+ { title: "Clean Up & Removals", image: "/capabilities/cleanup.jpg" },
+ { title: "Compositing", image: "/capabilities/compositing.jpg" },
+ { title: "Green Screen", image: "/capabilities/green-screen.jpg" },
+ { title: "Gun Effects", image: "/capabilities/gun-fx.jpg" },
+ ],
},
{
- code: "02",
- title: "CG & Environments",
- body: "Assets, look development, lighting and rendering, from hero props to full digital environments built to sit inside live-action photography.",
- },
- {
- code: "03",
- title: "Paint, Roto & Cleanup",
- body: "Rig and wire removal, beauty work, logo replacement and precise roto. Tracked, QC'd and delivered to spec.",
- },
- {
- code: "04",
- title: "Animation",
- body: "Character and motion work rooted in a decade of animation production as Two Tales Animation.",
- },
- {
- code: "05",
- title: "Supervision",
- body: "On-set and remote VFX supervision, bidding and breakdowns, so problems are solved before the camera rolls.",
- },
- {
- code: "06",
- title: "Pipeline & Delivery",
- body: "In-house review, tracking and automated QC tooling. ACES colour-managed EXR workflows and frame-accurate, spec-checked deliveries.",
+ group: "3D Animation",
+ items: [
+ { title: "Character Creation", image: "/capabilities/character-creation.jpg" },
+ { title: "Character Animation", image: "/capabilities/character-animation.jpg" },
+ { title: "Product Visualisation", image: "/capabilities/product-viz.jpg" },
+ ],
},
];
+// Stills used in the studio section collage.
+export const studioStills = [
+ "/capabilities/explosion.jpg",
+ "/capabilities/penguins.jpg",
+ "/capabilities/shark.jpg",
+ "/capabilities/penguin-box.jpg",
+];
+
+export type Credit = {
+ slug: string;
+ title: string;
+ year: number;
+ format: "Feature" | "Series";
+ network?: string;
+ poster: string;
+};
+
+// Selected film & series credits, newest first.
+export const filmography: Credit[] = [
+ { slug: "som-van-twee", title: "Som van Twee", year: 2024, format: "Feature", poster: "/film/som-van-twee.jpg" },
+ { slug: "oloture-the-journey", title: "Òlòtūré: The Journey", year: 2024, format: "Series", network: "Netflix", poster: "/film/oloture-the-journey.jpg" },
+ { slug: "funmilayo-ransome-kuti", title: "Funmilayo Ransome-Kuti", year: 2024, format: "Feature", poster: "/film/funmilayo-ransome-kuti.jpg" },
+ { slug: "summertide", title: "Summertide", year: 2024, format: "Series", network: "M-Net", poster: "/film/summertide.jpg" },
+ { slug: "war-wrath-and-revenge", title: "WAR: Wrath and Revenge", year: 2023, format: "Series", network: "Netflix", poster: "/film/war-wrath-and-revenge.jpg" },
+ { slug: "little-big-mouth", title: "Little Big Mouth", year: 2021, format: "Feature", network: "Netflix", poster: "/film/little-big-mouth.jpg" },
+ { slug: "vergeet-my-nie", title: "Vergeet My Nie", year: 2020, format: "Feature", poster: "/film/vergeet-my-nie.jpg" },
+ { slug: "toorbos", title: "Toorbos", year: 2019, format: "Feature", poster: "/film/toorbos.jpg" },
+ { slug: "fiela-se-kind", title: "Fiela se Kind", year: 2019, format: "Feature", poster: "/film/fiela-se-kind.jpg" },
+ { slug: "ander-mens", title: "Ander Mens", year: 2019, format: "Feature", poster: "/film/ander-mens.jpg" },
+ { slug: "ellen", title: "Ellen: The Ellen Pakkies Story", year: 2018, format: "Feature", poster: "/film/ellen.jpg" },
+ { slug: "stroomop", title: "Stroomop", year: 2018, format: "Feature", poster: "/film/stroomop.jpg" },
+ { slug: "vir-die-voels", title: "Vir die Voëls", year: 2016, format: "Feature", poster: "/film/vir-die-voels.jpg" },
+ { slug: "modder-en-bloed", title: "Modder en Bloed", year: 2016, format: "Feature", poster: "/film/modder-en-bloed.jpg" },
+];
+
+const yearsActive = new Date().getFullYear() - site.founded;
+
export const stats = [
- { value: `${new Date().getFullYear() - 2015}+`, label: "Years in production" },
- { value: "ACES", label: "Colour-managed pipeline" },
- { value: "EXR", label: "Frame-accurate delivery" },
- { value: "QC", label: "Automated shot checks" },
+ { value: `${yearsActive}+`, label: "Years in production" },
+ { value: String(filmography.length), label: "Film & series credits" },
+ { value: String(filmography.filter((c) => c.network === "Netflix").length), label: "Netflix titles" },
+ { value: "PTA", label: "Pretoria, South Africa" },
];
export type Project = {
@@ -75,64 +107,43 @@ export type Project = {
year: number;
category: string;
summary: string;
- // Path under /public, e.g. "/work/my-show.jpg". If missing, a generated
- // gradient frame is shown instead.
+ // Still under /public used for cards and as the video poster.
image?: string;
- // Optional MP4 under /public, or an external Vimeo/YouTube embed URL.
+ // MP4 under /public, or a Vimeo/YouTube embed URL.
video?: string;
+ gallery?: string[];
credits: string[];
- shots?: number;
- // Accent hue (0-360) used for the generated placeholder frame.
+ // Accent hue (0-360) for the generated frame shown when there is no image.
hue: number;
};
-// TODO: replace these placeholders with real projects (client approval permitting).
export const projects: Project[] = [
{
- slug: "project-one",
- title: "Episodic Drama",
- client: "Placeholder Network",
+ slug: "festo-f1",
+ title: "Festo F1",
+ client: "Festo",
+ // TODO: confirm year (Festo's centenary campaign; file dated March 2026).
year: 2026,
- category: "Series",
- summary:
- "Placeholder: a full season of invisible effects: set extensions, screen replacements, period cleanup and digital weather across every episode.",
- credits: ["Compositing", "Set Extension", "Cleanup"],
- shots: 420,
- hue: 22,
- },
- {
- slug: "project-two",
- title: "Feature Film",
- client: "Placeholder Pictures",
- year: 2025,
- category: "Film",
- summary:
- "Placeholder: CG environments and hero compositing for a feature, including a fully digital third act location.",
- credits: ["CG Environments", "Lighting", "Compositing"],
- shots: 180,
- hue: 205,
- },
- {
- slug: "project-three",
- title: "Automotive Spot",
- client: "Placeholder Agency",
- year: 2025,
category: "Commercial",
summary:
- "Placeholder: a CG car integrated into live-action plates with full reflections, road replacement and beauty finishing.",
- credits: ["CG", "Lookdev", "Compositing"],
- shots: 24,
- hue: 350,
+ "A fully CG Formula 1 spot celebrating 100 years of Festo, “Automation for a world in motion”. It runs from a moody studio reveal of the car, through a glitch-driven race sequence, to the podium.",
+ image: "/work/festo-f1/still-2.jpg",
+ video: "/work/festo-f1/festo-f1.mp4",
+ gallery: ["/work/festo-f1/still-13.jpg", "/work/festo-f1/still-46.jpg"],
+ credits: ["Full CG", "Vehicle Lookdev", "Character Animation", "Lighting", "Compositing"],
+ hue: 200,
},
{
- slug: "project-four",
- title: "Animated Short",
- client: "Two Tales Animation",
+ slug: "clere-radiance",
+ title: "Clere Radiance",
+ client: "Clere",
+ // TODO: confirm year.
year: 2024,
- category: "Animation",
+ category: "Product Visualisation",
summary:
- "Placeholder: a stylised animated short produced end to end, from design through animation, lighting and final grade.",
- credits: ["Animation", "Lighting", "Compositing"],
- hue: 140,
+ "Photoreal CG product visualisation for Clere’s Radiance Night Re-Newer.",
+ image: "/capabilities/product-viz.jpg",
+ credits: ["Product Visualisation", "Lookdev", "Lighting"],
+ hue: 330,
},
];
diff --git a/public/capabilities/character-animation.jpg b/public/capabilities/character-animation.jpg
new file mode 100644
index 0000000..513c806
Binary files /dev/null and b/public/capabilities/character-animation.jpg differ
diff --git a/public/capabilities/character-creation.jpg b/public/capabilities/character-creation.jpg
new file mode 100644
index 0000000..e1072f6
Binary files /dev/null and b/public/capabilities/character-creation.jpg differ
diff --git a/public/capabilities/cleanup.jpg b/public/capabilities/cleanup.jpg
new file mode 100644
index 0000000..e1d8dc1
Binary files /dev/null and b/public/capabilities/cleanup.jpg differ
diff --git a/public/capabilities/compositing.jpg b/public/capabilities/compositing.jpg
new file mode 100644
index 0000000..9c86e47
Binary files /dev/null and b/public/capabilities/compositing.jpg differ
diff --git a/public/capabilities/creature.jpg b/public/capabilities/creature.jpg
new file mode 100644
index 0000000..33dc999
Binary files /dev/null and b/public/capabilities/creature.jpg differ
diff --git a/public/capabilities/explosion.jpg b/public/capabilities/explosion.jpg
new file mode 100644
index 0000000..8427894
Binary files /dev/null and b/public/capabilities/explosion.jpg differ
diff --git a/public/capabilities/fluid-sim.jpg b/public/capabilities/fluid-sim.jpg
new file mode 100644
index 0000000..66ac832
Binary files /dev/null and b/public/capabilities/fluid-sim.jpg differ
diff --git a/public/capabilities/green-screen.jpg b/public/capabilities/green-screen.jpg
new file mode 100644
index 0000000..120e5e2
Binary files /dev/null and b/public/capabilities/green-screen.jpg differ
diff --git a/public/capabilities/gun-fx.jpg b/public/capabilities/gun-fx.jpg
new file mode 100644
index 0000000..8a42acb
Binary files /dev/null and b/public/capabilities/gun-fx.jpg differ
diff --git a/public/capabilities/penguin-box.jpg b/public/capabilities/penguin-box.jpg
new file mode 100644
index 0000000..952b03e
Binary files /dev/null and b/public/capabilities/penguin-box.jpg differ
diff --git a/public/capabilities/penguins.jpg b/public/capabilities/penguins.jpg
new file mode 100644
index 0000000..227dfe7
Binary files /dev/null and b/public/capabilities/penguins.jpg differ
diff --git a/public/capabilities/product-viz.jpg b/public/capabilities/product-viz.jpg
new file mode 100644
index 0000000..13d0155
Binary files /dev/null and b/public/capabilities/product-viz.jpg differ
diff --git a/public/capabilities/screen-replacement.jpg b/public/capabilities/screen-replacement.jpg
new file mode 100644
index 0000000..dcaff34
Binary files /dev/null and b/public/capabilities/screen-replacement.jpg differ
diff --git a/public/capabilities/set-extension.jpg b/public/capabilities/set-extension.jpg
new file mode 100644
index 0000000..6d6018e
Binary files /dev/null and b/public/capabilities/set-extension.jpg differ
diff --git a/public/capabilities/shark.jpg b/public/capabilities/shark.jpg
new file mode 100644
index 0000000..27e812b
Binary files /dev/null and b/public/capabilities/shark.jpg differ
diff --git a/public/capabilities/volume-sim.jpg b/public/capabilities/volume-sim.jpg
new file mode 100644
index 0000000..0820e59
Binary files /dev/null and b/public/capabilities/volume-sim.jpg differ
diff --git a/public/film/ander-mens.jpg b/public/film/ander-mens.jpg
new file mode 100644
index 0000000..39ad9e9
Binary files /dev/null and b/public/film/ander-mens.jpg differ
diff --git a/public/film/ellen.jpg b/public/film/ellen.jpg
new file mode 100644
index 0000000..5a022b1
Binary files /dev/null and b/public/film/ellen.jpg differ
diff --git a/public/film/fiela-se-kind.jpg b/public/film/fiela-se-kind.jpg
new file mode 100644
index 0000000..ac27986
Binary files /dev/null and b/public/film/fiela-se-kind.jpg differ
diff --git a/public/film/funmilayo-ransome-kuti.jpg b/public/film/funmilayo-ransome-kuti.jpg
new file mode 100644
index 0000000..a0184dd
Binary files /dev/null and b/public/film/funmilayo-ransome-kuti.jpg differ
diff --git a/public/film/little-big-mouth.jpg b/public/film/little-big-mouth.jpg
new file mode 100644
index 0000000..0aa8410
Binary files /dev/null and b/public/film/little-big-mouth.jpg differ
diff --git a/public/film/modder-en-bloed.jpg b/public/film/modder-en-bloed.jpg
new file mode 100644
index 0000000..1c74807
Binary files /dev/null and b/public/film/modder-en-bloed.jpg differ
diff --git a/public/film/oloture-the-journey.jpg b/public/film/oloture-the-journey.jpg
new file mode 100644
index 0000000..5ceae89
Binary files /dev/null and b/public/film/oloture-the-journey.jpg differ
diff --git a/public/film/som-van-twee.jpg b/public/film/som-van-twee.jpg
new file mode 100644
index 0000000..1040715
Binary files /dev/null and b/public/film/som-van-twee.jpg differ
diff --git a/public/film/stroomop.jpg b/public/film/stroomop.jpg
new file mode 100644
index 0000000..9611a12
Binary files /dev/null and b/public/film/stroomop.jpg differ
diff --git a/public/film/summertide.jpg b/public/film/summertide.jpg
new file mode 100644
index 0000000..50ea323
Binary files /dev/null and b/public/film/summertide.jpg differ
diff --git a/public/film/toorbos.jpg b/public/film/toorbos.jpg
new file mode 100644
index 0000000..72c5905
Binary files /dev/null and b/public/film/toorbos.jpg differ
diff --git a/public/film/vergeet-my-nie.jpg b/public/film/vergeet-my-nie.jpg
new file mode 100644
index 0000000..517318e
Binary files /dev/null and b/public/film/vergeet-my-nie.jpg differ
diff --git a/public/film/vir-die-voels.jpg b/public/film/vir-die-voels.jpg
new file mode 100644
index 0000000..0e704b4
Binary files /dev/null and b/public/film/vir-die-voels.jpg differ
diff --git a/public/film/war-wrath-and-revenge.jpg b/public/film/war-wrath-and-revenge.jpg
new file mode 100644
index 0000000..04d1254
Binary files /dev/null and b/public/film/war-wrath-and-revenge.jpg differ
diff --git a/public/work/festo-f1/festo-f1.mp4 b/public/work/festo-f1/festo-f1.mp4
new file mode 100644
index 0000000..d861fa1
Binary files /dev/null and b/public/work/festo-f1/festo-f1.mp4 differ
diff --git a/public/work/festo-f1/still-13.jpg b/public/work/festo-f1/still-13.jpg
new file mode 100644
index 0000000..a1ce354
Binary files /dev/null and b/public/work/festo-f1/still-13.jpg differ
diff --git a/public/work/festo-f1/still-2.jpg b/public/work/festo-f1/still-2.jpg
new file mode 100644
index 0000000..e42cd89
Binary files /dev/null and b/public/work/festo-f1/still-2.jpg differ
diff --git a/public/work/festo-f1/still-46.jpg b/public/work/festo-f1/still-46.jpg
new file mode 100644
index 0000000..72d5b08
Binary files /dev/null and b/public/work/festo-f1/still-46.jpg differ