// 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://twotalesvfx.com", // TODO: company profile says founded 2014; the logo lockup says "Est. 2015". founded: 2014, tagline: "Invisible work. Unforgettable frames.", description: "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 @twotalesvfx.com address if preferred. email: "chris@twotalesanimation.com", location: "Pretoria, South Africa", // Muted background loop for the home hero (cut from the Summertide reel). reel: "/reel/hero-loop.mp4" as string | null, reelPoster: "/reel/hero-poster.jpg" as string | null, // Full reel with sound, opened by the hero's "Play reel" button. fullReel: "/reel/summertide-reel.mp4" as string | null, socials: [ // TODO: add real profiles, e.g. { label: "Vimeo", href: "https://vimeo.com/..." } ] as { label: string; href: string }[], }; export const nav = [ { label: "Filmography", href: "/#filmography" }, { label: "Work", href: "/work/" }, { label: "Services", href: "/#services" }, { label: "Contact", href: "/#contact" }, ]; export type Service = { title: string; image: string }; export const services: { group: string; items: Service[] }[] = [ { 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" }, ], }, { 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 Award = { body: string; longName: string; edition: string; year: number; result: "Nominee" | "Winner"; category: string; title: string; // Filmography slug and/or project slug this award belongs to. credit?: string; project?: string; image: string; reel?: string; }; export const awards: Award[] = [ { body: "SAFTA", longName: "19th South African Film and Television Awards", edition: "19th", year: 2026, result: "Nominee", category: "Best Achievement in Visual Effects – TV", title: "Summertide", credit: "summertide", project: "summertide", image: "/work/summertide/award-bg.jpg", reel: "/reel/summertide-reel.mp4", }, ]; export const awardFor = (slug: string) => awards.find((a) => a.credit === slug || a.project === slug); export type Credit = { slug: string; title: string; year: number; format: "Feature" | "Series"; network?: string; // Not yet released; shown with an "Upcoming" badge. upcoming?: boolean; poster: string; }; // Selected film & series credits, newest first. export const filmography: Credit[] = [ { slug: "baba-segi", title: "The Secret Lives of Baba Segi’s Wives", year: 2026, format: "Feature", upcoming: true, poster: "/film/baba-segi.jpg" }, { slug: "beter-as-gister", title: "Beter as Gister", year: 2026, format: "Series", network: "kykNET", poster: "/film/beter-as-gister.jpg" }, { slug: "blood-sisters-s2", title: "Blood Sisters: Season 2", year: 2026, format: "Series", network: "Netflix", poster: "/film/blood-sisters-s2.jpg" }, { slug: "baby-farm", title: "Baby Farm", year: 2025, format: "Series", network: "Netflix", poster: "/film/baby-farm.jpg" }, { slug: "die-affere", title: "Die Affêre", year: 2025, format: "Feature", network: "kykNET", poster: "/film/die-affere.jpg" }, { 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: `${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: "SAFTA", label: "2026 VFX nominee" }, ]; export type Project = { slug: string; title: string; client: string; year: number; category: string; summary: string; // Still under /public used for cards and as the video poster. image?: string; // MP4 under /public, or a Vimeo/YouTube embed URL. video?: string; gallery?: string[]; credits: string[]; // Accent hue (0-360) for the generated frame shown when there is no image. hue: number; }; export const projects: Project[] = [ { slug: "summertide", title: "Summertide", client: "M-Net", year: 2024, category: "Series", summary: "Creature and simulation work for M-Net’s coastal family drama: CG African penguins, a CG shark with water simulation, shark replacements on the beach, CG storm clouds and lightning, a CG seal and pyro simulations.", image: "/work/summertide/still-18.jpg", video: "/reel/summertide-reel.mp4", gallery: [ "/work/summertide/still-101.jpg", "/work/summertide/still-139.jpg", "/work/summertide/still-80.jpg", "/work/summertide/still-187.jpg", ], credits: ["CG Penguins", "CG Shark & Water Sim", "Shark Replacement", "CG Clouds & Lightning", "CG Seal", "Pyro Simulations"], hue: 190, }, { slug: "festo-f1", title: "Festo F1", client: "Festo", // TODO: confirm year (Festo's centenary campaign; file dated March 2026). year: 2026, category: "Commercial", summary: "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: "render-fish", title: "theRender.Fish", client: "In-house", year: 2023, category: "3D Commercial", summary: "A fully 3D animated promo for theRender.Fish, the Blender render farm we built and ran in-house. A sleep-deprived orca stares down a 92-day render and an impatient client, until faster renders land him on a tropical island. Character animation, environments, lighting and motion graphics, all in CG.", image: "/work/render-fish/still-31.jpg", video: "/work/render-fish/render-fish.mp4", gallery: ["/work/render-fish/still-13.jpg", "/work/render-fish/still-5.jpg"], credits: ["Full CG", "Character Animation", "Environments", "Lighting", "Motion Graphics"], hue: 280, }, { slug: "clere-radiance", title: "Clere Radiance", client: "Clere", // TODO: confirm year. year: 2024, category: "Product Visualisation", summary: "Photoreal CG product visualisation for Clere’s Radiance Night Re-Newer.", image: "/capabilities/product-viz.jpg", credits: ["Product Visualisation", "Lookdev", "Lighting"], hue: 330, }, ];