EDUCATION'S FILM STUDIO. NOT A STUDIO THAT ALSO DOES EDUCATION.

Our creative mission.

Our creative Mission

We make films that make people feel something.

We believe great education films should do more than inform. They should spark understanding, build trust and create a genuine connection between your institution and the people you want to reach.

As a specialist film production company for schools, colleges and universities, we create Feel Good Films that resonate with students, parents and families — helping them feel informed, inspired and emotionally connected to your institution.

And because every film has a job to do, we make sure that connection delivers something meaningful too: strengthening your brand, raising awareness and supporting your student recruitment and admissions journey.

We're built on trust

EDUCATION’S FILM STUDIO.

Education isn’t one of the sectors on our dropdown menu. It’s what we specialise in.

Our services

Safe & Sound

Every member of our film crew is fully DBS checked. No shortcuts, no exceptions — just safeguarding taken seriously, every time.

Fluent in children

Years spent creating films and campaigns for schools and young audiences means we know how to work with children naturally without talking down to them.

School-year literate

Open days, admissions cycles, term dates and school calendars we understand the rhythms of education and plan our film productions around them, not despite them.

We turn up first

Before a single word is written, we visit your school and walk the site. Because the best school films start with understanding the people, place and story behind them.

Our services

Discovery

Creative strategy
Market Research
Strategic storytelling

Pre-Production

Art Direction
Concept Development
Production planning
Scriptwriting & Storyboarding
Creative Ideation

Production

Brand Films
Commercials
TV Ads
School promotional videos
Student Recruitment Campaigns
Parent & Student Testimonials
Alumni Films
Documentaries
Photography
Digital Campaigns
Open day adverts
Explainer videos
Organic & Paid Social content

Post-Production

Music Composition
Colour Grading
Sound Design
VFX
Motion Design
2D & 3D Animation
Editing

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.

<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>

Ready when you are

Let's make something worth feeling.

Whether you're rethinking your school brand, planning your next admissions campaign or simply know it's time to tell your story differently, we'd love to hear what you're working on.

Award-winning filmmaking.
Trusted by schools, colleges and universities in the UK and internationally.