Render images using automatically generated events on your calendar. Display ART, using iCal!
/camhack-2025/
├── config.py
├── image_processor.py
├── ical_generator.py
├── ical_uploader.py
├── main.py
├── /input_images/
│ └── example.png
└── /output_ics/
└── 000000.ics
└── 1D2B53.ics
└── ...
config.py: contains all the project settingsPALETTE: Colour palette in hex codes, e.g.["#FFFFFF", "#000000"]OUTPUT_DIR: Directory to output generated ics files ("./output_ics/")INPUT_DIR: Directory where input images are stored ("./input_images/")IMAGE_WIDTH: Number of pixel columns. Must be divisible by 7IMAGE_HEIGHT: Number of pixel rowsSLOT_DURATION_MINS: Height of each pixel row in minutes
image_processor.py: Module to convert an image into a 2D array of hex codesical_generator.py: Module to convert pixel arrays into iCal filesical_uplaoder.py: Module to deploy generated ics files to a netlify webservermain.py: Main CLI application
uv venv
uv syncnpm install -g netlify-cli
netlify loginCreate input directory input_images, and add images to the directory.
uv run main.py --name example.png --save_pixartRunning main.py with --save_pixart option creates pixart.jpg in INPUT_DIR, which serves as a preview for the final calendar art.
To deploy, run main.py with the --upload option.
Subscribe to the calendar feeds in your app of choice (Outlook, Google Calendar, Thunderbird). For example, if the netlify project name is artical-example, subscribe to https://artical-example.netlify.app/<hex code>.ics for every single hex code in PALETTE, without the "#" (e.g. "#1D2B53" becomes https://artical-example.netlify.app/1D2B53.ics). Unfortunately, there is no way to automatically set the colour of imported events using iCal files, and colours will have to be manually set in the calendar app.
Warning
Use this app at your own risk, we managed to get a Google account suspended by importing too many calendar events.
| Original Image | Calendar View (Outlook) |
|---|---|
![]() |
![]() |

