Our Framework
The Feel Good FrameworkTM
Great education films don't start with a camera. They start with understanding.
Our Feel Good Framework™ is the process behind every project from getting under the skin of your institution and developing the creative, through to production, post-production and delivery.
You’re part of the journey from the very beginning.
01
Discover & Strategy
We begin by listening. Through an initial meeting and in-person visit, we get under the skin of your institution meeting your community, understanding your audiences and uncovering what makes you different.
02
Creative Development
Everything we learn becomes the foundation for the creative. Together, we explore ideas, stories and different creative directions until we find the one that feels unmistakably yours.
03
Creative Presentation
We make the vision tangible. Through Director’s Treatments, sample scripts, visual references and film inspiration, your team can see, hear and feel the creative direction before production begins.
04
Pre-Production
With the creative agreed, we plan every detail. From scripts and storyboards to schedules, locations and safeguarding, everything is carefully prepared around your institution and academic calendar.
05
Production
This is where your story comes to life. Our experienced, DBS-checked crews understand how to work confidently and sensitively within schools, colleges and universities creating a relaxed environment while maintaining the highest safeguarding standards.
06
Post-Production
We shape everything we've captured into a story designed to connect. Editing, sound, colour, graphics and music come together to create a film with emotional impact supported by tailored edits for different audiences and platforms.
07
Delivery & Optimisation
Your film shouldn't live in one place. We prepare and optimise your content for websites, social media, open days, admissions campaigns and digital advertising helping you get more value from everything we've created.
<style>
.swiper-slide:not(.swiper-slide-duplicate) {
opacity: 0;
transform: translateY(16px);
transition: opacity 0.5s ease, transform 0.5s ease;
}
.swiper-slide.is-visible {
opacity: 1;
transform: translateY(0);
}
</style>
<script>
window.addEventListener('load', () => {
setTimeout(() => {
const observer = new IntersectionObserver((entries) => {
entries.forEach((entry) => {
if (entry.isIntersecting) {
const slides = entry.target.querySelectorAll('.swiper-slide:not(.swiper-slide-duplicate)');
slides.forEach((slide, i) => {
setTimeout(() => {
slide.classList.add('is-visible');
}, i * 150);
});
observer.unobserve(entry.target);
}
});
}, { threshold: 0.15 });
document.querySelectorAll('.slider-component').forEach((component) => {
observer.observe(component);
});
}, 500);
});
</script>
<script async type="module"
src="https://cdn.jsdelivr.net/npm/@finsweet/attributes@2/attributes.js"
fs-list
></script>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/swiper@8/swiper-bundle.min.css"/>
<script src="https://cdn.jsdelivr.net/npm/swiper@8/swiper-bundle.min.js"></script>
<script>
document.addEventListener("DOMContentLoaded", () => {
document.querySelectorAll(".slider-component").forEach((component) => {
const cmsWrap = component.querySelector(".swiper");
if (!cmsWrap) return;
const swiper = new Swiper(cmsWrap, {
loop: true,
slidesPerView: "auto",
followFinger: true,
freeMode: false,
slideToClickedSlide: false,
centeredSlides: false,
autoHeight: false,
speed: 800,
slideActiveClass: "is-active",
slideDuplicateActiveClass: "is-active",
autoplay: {
delay: 5000,
disableOnInteraction: false,
pauseOnMouseEnter: true,
},
mousewheel: {
forceToAxis: true,
},
keyboard: {
enabled: true,
onlyInViewport: true,
},
navigation: {
nextEl: component.querySelector(".slider_btn_element.is-next"),
prevEl: component.querySelector(".slider_btn_element.is-prev"),
},
pagination: {
el: component.querySelector(".slider_bullet_wrap"),
bulletActiveClass: "is-active",
bulletClass: "slider_bullet_item",
bulletElement: "button",
clickable: true,
},
scrollbar: {
el: component.querySelector(".slider_draggable_wrap"),
draggable: true,
dragClass: "slider_draggable_handle",
snapOnRelease: true,
},
});
});
});
</script>
<script>
document.addEventListener('DOMContentLoaded', function () {
// Target your specific dropdown — adjust selector if needed
const dropdownToggle = document.querySelector('.navbar_dropdown-toggle');
const megaMenu = document.querySelector('.navbar_dropdown-list');
if (!dropdownToggle || !megaMenu) return;
// Watch for Webflow adding/removing the open class
const observer = new MutationObserver(function () {
const isOpen = dropdownToggle.classList.contains('w--open');
const fadeEls = megaMenu.querySelectorAll('.mega-menu-fade');
if (isOpen) {
setTimeout(() => {
fadeEls.forEach((el, i) => {
el.style.setProperty('--stagger-delay', `${i * 0.08}s`);
el.classList.add('is-visible');
});
}, 30);
} else {
fadeEls.forEach(el => el.classList.remove('is-visible'));
}
});
observer.observe(dropdownToggle, { attributes: true, attributeFilter: ['class'] });
});
</script>
Trusted by education teams around the world
The best measure of our work isn't just how a film looks. It's how the experience feels, how the story connects, and what the film goes on to achieve.
Once onboarded with us, we work through our methodical framework make the process as smooth as possible.
We bring you on the journey with us.
Nicholas Hammond
Headmaster at The British School of Paris
Rebecca Johnson
Head of Marketing - St Columba's College
Andrea Bingley
Headmistress, Tower College
<style>
.swiper-slide:not(.swiper-slide-duplicate) {
opacity: 0;
transform: translateY(16px);
transition: opacity 0.5s ease, transform 0.5s ease;
}
.swiper-slide.is-visible {
opacity: 1;
transform: translateY(0);
}
</style>
<script>
window.addEventListener('load', () => {
setTimeout(() => {
const observer = new IntersectionObserver((entries) => {
entries.forEach((entry) => {
if (entry.isIntersecting) {
const slides = entry.target.querySelectorAll('.swiper-slide:not(.swiper-slide-duplicate)');
slides.forEach((slide, i) => {
setTimeout(() => {
slide.classList.add('is-visible');
}, i * 150);
});
observer.unobserve(entry.target);
}
});
}, { threshold: 0.15 });
document.querySelectorAll('.slider-component').forEach((component) => {
observer.observe(component);
});
}, 500);
});
</script>
<script async type="module"
src="https://cdn.jsdelivr.net/npm/@finsweet/attributes@2/attributes.js"
fs-list
></script>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/swiper@8/swiper-bundle.min.css"/>
<script src="https://cdn.jsdelivr.net/npm/swiper@8/swiper-bundle.min.js"></script>
<script>
document.addEventListener("DOMContentLoaded", () => {
document.querySelectorAll(".slider-component").forEach((component) => {
const cmsWrap = component.querySelector(".swiper");
if (!cmsWrap) return;
const swiper = new Swiper(cmsWrap, {
loop: true,
slidesPerView: "auto",
followFinger: true,
freeMode: false,
slideToClickedSlide: false,
centeredSlides: false,
autoHeight: false,
speed: 800,
slideActiveClass: "is-active",
slideDuplicateActiveClass: "is-active",
autoplay: {
delay: 5000,
disableOnInteraction: false,
pauseOnMouseEnter: true,
},
mousewheel: {
forceToAxis: true,
},
keyboard: {
enabled: true,
onlyInViewport: true,
},
navigation: {
nextEl: component.querySelector(".slider_btn_element.is-next"),
prevEl: component.querySelector(".slider_btn_element.is-prev"),
},
pagination: {
el: component.querySelector(".slider_bullet_wrap"),
bulletActiveClass: "is-active",
bulletClass: "slider_bullet_item",
bulletElement: "button",
clickable: true,
},
scrollbar: {
el: component.querySelector(".slider_draggable_wrap"),
draggable: true,
dragClass: "slider_draggable_handle",
snapOnRelease: true,
},
});
});
});
</script>
<script>
document.addEventListener('DOMContentLoaded', function () {
// Target your specific dropdown — adjust selector if needed
const dropdownToggle = document.querySelector('.navbar_dropdown-toggle');
const megaMenu = document.querySelector('.navbar_dropdown-list');
if (!dropdownToggle || !megaMenu) return;
// Watch for Webflow adding/removing the open class
const observer = new MutationObserver(function () {
const isOpen = dropdownToggle.classList.contains('w--open');
const fadeEls = megaMenu.querySelectorAll('.mega-menu-fade');
if (isOpen) {
setTimeout(() => {
fadeEls.forEach((el, i) => {
el.style.setProperty('--stagger-delay', `${i * 0.08}s`);
el.classList.add('is-visible');
});
}, 30);
} else {
fadeEls.forEach(el => el.classList.remove('is-visible'));
}
});
observer.observe(dropdownToggle, { attributes: true, attributeFilter: ['class'] });
});
</script>