Close Date Expand Location Next Open/Close Previous 0.5 of 5 stars 1 of 5 stars 1.5 of 5 stars 2 of 5 stars 2.5 of 5 stars 3 of 5 stars 3.5 of 5 stars 4 of 5 stars 4.5 of 5 stars 5 of 5 stars Repeat Slide Current slide

Robtober 2021 Design Notes

The making of a custom-designed blog post

Robtober is what I call the horror movie binge I do every October. After I redesigned my site in 2017, I started documenting the event each year with a horrifically custom-designed blog post, getting a little more elaborate each time. This post goes behind the scenes of the 2021 edition.

The data

I generate my site with Jekyll, and a custom-designed post like Robtober gets its own unique layout file. To keep things tidy, all the movie data is formatted in YAML and stored in the post’s front matter:

robtober:
  - date: 2021-10-06
    films:
      - title: 'Phantom of the Paradise'
        director: 'Brian DePalma'
        year: '1974'
        country: 'USA'
        description: 'A disfigured composer sells his soul for the woman he loves so that she will perform his music. However, an evil record tycoon betrays him and steals his music to open his rock palace, The Paradise.''
        poster: true
        color: '#FF90BD'
        trailer: 'https://www.youtube.com/watch?v=T9yof8cwli4'
        watch: 'https://www.justwatch.com/us/movie/phantom-of-the-paradise'
        tickets: 'https://www.eventbrite.com/e/phantom-of-the-paradise-with-ari-kahan-tickets-167541897325'

The layout file then uses some fairly straightforward Liquid template code to access that data and use it to build out the movie list on the page:

{% for day in page.robtober %}
{% for film in day.films %}
<div class="film-wrap">
  <div class="film" style="--key-color: {% if film.color %}{{ film.color }}{% else %}hsl(0,0%,75%){% endif %}">
    <div class="film__art-wrap">
      <div class="film__art" data-title="{% if film.title_short %}{{ film.title_short }}{% else %}{{ film.title }}{% endif %}">
        <img width="150" height="272" src="/assets/images/{{ page.date | date: '%Y-%m-%d' }}-{{ film.title | slugify }}.jpg" alt="{{ film.title }} poster" loading="lazy">
      </div>
    </div>
    <div class="film__description">
      <h2 class="film__date"><time datetime="{{ day.date | date: '%Y-%m-%e' }}">Robtober {{ day.date | date: '%e' }}, {{ day.date | date: '%Y' }}</time></h2>
      <h3 class="film__title">{{ film.title }}</h3>
      <p class="film__meta">{{ film.director }}, {{ film.country }}, {{ film.year }}</p>
      <p class="film__synopsis">{{ film.description }}</p>
      <ul class="film__links">
        {% if film.trailer %}<li><a class="film__link" href="{{ film.trailer }}">Trailer</a></li>{% endif %}
        {% if film.tickets %}<li><a class="film__link" href="{{ film.tickets }}">Tickets</a></li>{% endif %}
        {% if film.watch %}<li><a class="film__link" href="{{ film.watch }}">Where to Watch</a></li>{% endif %}
      </ul>
    </div>
  </div>
</div>
{% endfor %}
{% endfor %}

The opener

I’m currently working on a small branding project with a local client, and one of the logo concepts I came up with evokes the bitmap text that VCRs display on TV screens. When that concept was scrapped, I decided to repurpose it for Robtober, complete with animated scan lines. The blue video screen with VHS artifacts in the background is a looping video, but since I wanted the text itself—ROBTOBER 2021, SLP, and 00:00:00—to appear in three corners of the screen and work with any viewport aspect ratio, each of the three pieces of text had to be a separate element. I drew them in SVG, and each row of pixels is a distinct path element which can be animated individually for the scan line effect. A little Sass keyframe function I cooked up awhile back helped me fine-tune the timing. The SVG elements themselves have an additional subtle jitter animation applied, and blur() and drop-shadow() filters were added to complete the low-res analog look. For a clearer visual sense of what’s happening, here’s the animation in slow motion:

This scan line animation, shown here 10 times slower than its actual speed, consists of SVG path elements translateX’d back and forth via CSS keyframes. No JavaScript necessary!

I’m still behind the times on ES6 and the Intersection Observer API, so the opener fades out on scroll via a little JavaScript snippet from David Walsh, which I’ve previously used for the gallery on Plus Equals. It’s the only bit of code in this design that I don’t fully understand, and it’s not entirely appropriate for this use case, but it gets the job done well enough. I learned shortly after launch that it wasn’t obvious to everyone to scroll down, so I added a blinking down-arrow prompt.

The CSS that displays the video, animation, and scroll fade are all activated by a prefers-reduced-motion: no-preference media query, so users who would rather not have incidental movement on the page won’t see them.

The typography

The display face is Fruktur, by Viktoriya Grabowska and Eben Sorkin. The gothic feel at the heart of its blackletter type is the only part of this year’s design that overtly evokes horror, which is undercut just the right amount by its playful curves. The typeface used for text, metadata, and buttons is the eminently functional Poppins, by Jonny Pinhorn, reused from Robtober 2020.

For sizing, I’ve wanted to try out the fluid, responsive technique introduced by James Gilyead and Trys Mudford in their Utopia project ever since it was introduced in early 2020, and now that I finally have, I absolutely love it. My version is slightly different from theirs, in that it uses clamp() but keeps the font-size interpolation calculations in the CSS:

--w-min: 300;
--w-current: 100vw;
--w-max: 2400;
--scale0-min: 16;
--scale0-max: 24;
--scale0: clamp(
  calc((var(--scale0-min) / 16) * 1rem),
  calc(
    (var(--scale0-min) * 1px) +
      (
        ((var(--w-current) - (var(--w-min) * 1px))) *
          (
            ((var(--scale0-max) - var(--scale0-min))) /
              ((var(--w-max) - var(--w-min)))
          )
      )
  ),
  calc((var(--scale0-max) / 16) * 1rem)
);

Incorporating a heavily modified version of my Sass typographic scale generator made it easy for me to generate a full typographic scale and tweak the settings until they were just right:

--w-min: 300;
--w-current: 100vw;
--w-max: 2400;

$scale: (
  -1: (
      min: 14,
      max: 20,
    ),
  0: (
    min: 16,
    max: 24,
  ),
  1: (
    min: 42,
    max: 96,
  )
);

@each $step, $size in $scale {
  --scale#{$step}-min: #{map-get($size, min)};
  --scale#{$step}-max: #{map-get($size, max)};
  --scale#{$step}: clamp(
    calc((var(--scale#{$step}-min) / 16) * 1rem),
    calc(
      (var(--scale#{$step}-min) * 1px) +
        (
          ((var(--w-current) - (var(--w-min) * 1px))) *
            (
              ((var(--scale#{$step}-max) - var(--scale#{$step}-min))) /
                ((var(--w-max) - var(--w-min)))
            )
        )
    ),
    calc((var(--scale#{$step}-max) / 16) * 1rem)
  );
}

The VHS boxes

To accompany the opener’s VHS homage, it was only natural to represent each movie as a VHS box (even though many of them have never been released on VHS). The key art was all sourced from TMDb and I had to do a little Photoshop magic in some cases to make it fit the tall, skinny format.

Fake VHS box courtesy of CSS 3D transforms

The spines are ::after pseudo-elements, and their background colors are individually customized, manually eyedropper’d from the key art and dropped into the markup as a CSS custom property in an inline style like this: style="--key-color: #FF90BD". To make them pop off the TV static on the page background, I used Work With Color’s HSL Color Picker to make sure each color had at least 75% luminance. (Note that that’s the tool’s “Lum” value, different from the “L” lightness value. There are less clunky tools available for this than Work With Color’s, but I just happened to have that link handy when I was working on this design.) That luminance level put most of the spines in the pastel realm, which was a happy accident that gave them a 1980s feel to go with the VHS theme.

Making these VHS boxes was also a great opportunity to finally get my head around how CSS 3D transforms work, and after getting frustrated by documentation and trying in vain to reverse-engineer the output of some 3D CSS generators, I found David DeSandro’s outstanding Intro to CSS 3D transforms, which was an absolute godsend. My boxes only include the front and one side, and I arranged the perspective to hide the other missing surfaces.

The scroll snapping

This is my first time using CSS Scroll Snap. It’s probably more often used for horizontally scrolling carousels, but I used it vertically: scroll-snap-type: y mandatory. I’m kind of playing with fire using the mandatory parameter with variable height content that could potentially get cut off, but when I tried using proximity instead, I wasn’t satisfied with how the browser behaved. So some people looking at the page on tiny phones held sideways might have some content cut off. Sorry, folks! I also had to use an annoying workaround to get it to play nice with iOS Safari’s flawed interpretation of 100vh. All told, though, I think the effect works quite nicely! Like the videos and animations, I put this one behind a prefers-reduced-motion: no-preference media query.

This year my headshot in the footer is dressed up for Halloween in the “Pretty Lady” mask Leatherface wears at the end of The Texas Chain Saw Massacre. In the age of touchscreens, :hover is something of a lost art, but I’m still having fun with it!

All posts in this series

Robtober 2011

A month’s worth of movies to help you stay awake

Every October, I try to watch as many horror films that I haven’t seen before as possible.

Hostel

Eli Roth (USA, Czech Republic, 2005)

Three backpackers head to a Slovak city that promises to meet their hedonistic expectations, with no idea of the hell that awaits them.

Saw

James Wan (USA, 2004)

Two men awaken to find themselves on the opposite sides of a dead body, each with specific instructions to kill the other or… See more →

Go to this post

Robtober 2012

A month’s worth of movies to help you stay awake

Every October, I try to watch as many horror films that I haven’t seen before as possible.

Corman’s World

Alex Stapleton (USA, 2011)

A documentary on DIY producer/director Roger Corman and his alternative approach to making movies in Hollywood.

Not of This Earth

Roger Corman (USA, 1957)

An alien agent from the distant planet Davana is sent to Earth via a high-tech matter transporter. There, he terrorizes Southern California in an attempt to acquire blood… See more →

Go to this post

Robtober 2013

A month’s worth of movies to help you stay awake

Every October, I try to watch as many horror/suspense films that I haven’t seen before as possible. This is the first year the films were somewhat carefully selected and scheduled in advance. They span seven decades and eight countries. Dates and times (subject to change) are listed for any friends who want to join me.

Don’t Look Now

Nicolas Roeg (UK, Italy, 1973)

A married couple grieving the recent death of their young daughter are… See more →

Go to this post

Robtober 2014

A month’s worth of movies to help you stay awake

Every October, I try to watch as many horror/suspense films that I haven’t seen before as possible. Dates and times (subject to change) are listed for any friends who want to join me.

The Devil’s Backbone

Guillermo del Toro (Spain, Mexico, 2001)

After Carlos – a 12-year-old whose father has died in the Spanish Civil War – arrives at an ominous boys’ orphanage, he discovers the school is haunted and has many dark secrets which… See more →

Go to this post

Robtober 2016

A month’s worth of movies to help you stay awake

Every October, I put together a sizable schedule of horror/thriller/exploitation films, most of which I haven’t seen before. Dates and times (subject to change) are listed for any friends who want to join me. Also available as a handy Google calendar!

Don't Breathe

Fede Álvarez (USA, Hungary, 2016)

Three delinquents break into the house of a war veteran who is blind to steal his money. However, they discover that the man is not as defenseless as… See more →

Go to this post

Robtober 2017

A month’s worth of movies to help you stay awake

Every October, I put together a big schedule of horror films, most of which I haven’t seen before. Films, dates, and times (all subject to change) are listed for any friends who want to join me, and ticket links are included for public screenings. The schedule is also available as a handy Google calendar and as a Letterboxd list.

Below the schedule you can find a bit about how it’s curated as well as a roundup… See more →

Go to this post

Robtober 2018

A month’s worth of movies to help you stay awake

Every October, I put together a big schedule of horror films, most of which I haven’t seen before. Films, dates, and times (all subject to change) are listed for any friends who want to join me, and ticket links are included for public screenings. The schedule is also available as a handy Google calendar and as a Letterboxd list.

This year, Michael Myers’ imminent return to the big screen has inspired me to binge my way… See more →

Go to this post

Robtober 2019

A month’s worth of movies to help you stay awake

Every October, I put together a big schedule of horror films, most of which I haven’t seen before. Films and dates (all subject to change) are listed for any friends who want to join me, and ticket links are included for public screenings.

This year, I’ve set aside a weekend to plow through the entire Nightmare on Elm Street series (I’ve only ever seen the first three). I’m also finally finishing off (the current version… See more →

Go to this post

Robtober 2020

A month’s worth of movies to help you stay awake

Every October, I put together a big schedule of horror films to watch, focusing mostly on ones I haven’t seen before. It’s usually a mix of home viewings and public theatrical screenings, and the schedule is published both for posterity and for the sake of anyone who might like to join me. This year, sadly, the pandemic will keep me out of theaters, and guests won’t be able to join me for home viewings. But… See more →

Go to this post

Robtober 2021

A month’s worth of movies to help you stay awake

Every October, I put together a big schedule of horror films to watch, focusing mostly on ones I haven’t seen before. The schedule, a mix of theatrical screenings and home viewings, is published for posterity and for the sake of anyone who might like to join me.

This year’s batch is a little less focused than usual, drawn from new releases, repertory screenings in Philadelphia, recent additions to Time Out’s “100 Best Horror Films,” Criterion… See more →

Go to this post

Robtober 2021 Design Notes

The making of a custom-designed blog post

Robtober is what I call the horror movie binge I do every October. After I redesigned my site in 2017, I started documenting the event each year with a horrifically custom-designed blog post, getting a little more elaborate each time. This post goes behind the scenes of the 2021 edition.

The data

I generate my site with Jekyll, and a custom-designed post like Robtober gets its own unique layout file. To keep things tidy, all the… See more →

Go to this post

Robtober 2022

A month’s worth of movies to help you stay awake

Every October, I broaden my cinematic horizons by putting together a big schedule of horror movies I haven’t seen yet. Alas, this year’s plans have been upended by my abduction, and for some reason, my mysterious captors aren’t interested in money. Instead, their ransom demand is that people watch the movies I’ve scheduled. These dudes seem like they mean business, so if you can help me out, I’d really appreciate it. But if you’re too… See more →

Go to this post

Robtober 2022 Design Notes

How to design a ransom note

Happy Halloween! Here are a few quick notes about this year’s design for Robtober, my annual horror movie marathon.

The ransom letters

The ransom note concept for the title screen came to me in the middle of the night, and I don’t remember if it was inspired by something specific. But in my subsequent research, I read the entire Wikipedia article about the murder of JonBenét Ramsey, so if that’s a knowledge hole your pub… See more →

Go to this post

Robtober 2023

A month’s worth of movies to help you stay awake

Every October, I put together a big schedule of horror films to watch, focusing mostly on ones I haven’t seen before. The schedule, a mix of theatrical screenings and home viewings, is published for posterity and for the sake of anyone who might like to join me.

I’ll often use this month as an opportunity to catch up on a franchise, and this year, for reasons surpassing understanding, the new, tenth installment of the Saw… See more →

Go to this post

Robtober 2024

A month’s worth of movies to help you stay awake

Every October, I put together a big schedule of horror films to watch, focusing mostly on ones I haven’t seen before. The schedule, a mix of theatrical screenings and home viewings, is published for posterity and for the sake of anyone who might like to join me.

This year I seem to be nostalgic for the age of Satanic panic, as I’ll be doing concurrent, chronological deep dives on The Exorcist and The Omen, two… See more →

Go to this post