Skip to content

Instantly share code, notes, and snippets.

@ryanckulp
Last active April 13, 2025 03:17
Show Gist options
  • Save ryanckulp/01d42d0db61d8089ea9cefc625ef0b77 to your computer and use it in GitHub Desktop.
Save ryanckulp/01d42d0db61d8089ea9cefc625ef0b77 to your computer and use it in GitHub Desktop.
TRMNL calendar hackathon - April 2025

wut? y? when?

https://usetrmnl.com/blog/calendar-hackathon

how?

  1. connect any calendar inside TRMNL > Plugins
  2. fetch your* data from the endpoint below
  3. design a better calendar, with markup for all 4 view layouts
  4. export your plugin
  5. email it to hackathon@usetrmnl.com by Monday, April 14 at 5p ET

legal disclaimer

Entrants retain ownership of all intellectual and industrial property rights (including moral rights) in and to Submissions.
As a condition of submission, Entrant grants the Hackathon Organizer, its subsidiaries, agents and partner companies, a perpetual, irrevocable, worldwide, royalty-free, and non-exclusive license to use, reproduce, adapt, modify, publish, distribute, publicly perform, create a derivative work from, and publicly display the Submission.
Entrants provide Submissions on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE.

fetch calendar data

to iterate quickly, we suggest creating a private plugin inside TRMNL > Plugins > Private Plugin. select "Polling" strategy, then provide the URL below. if you prefer to develop locally, check out tmrnlp: https://github.com/usetrmnl/trmnlp

# first get your calendar's plugin_setting ID from the URL bar of the settings page
https://usetrmnl.com/api/plugin_settings/<calendar_plugin_setting_id>/data

next, input the following "Headers" into the corresponding textarea:

# first create a User API key at usetrmnl.com/account
authorization=bearer <your-user-api-key>

parsed events will appear inside a data node of the JSON response, like the sample events in footnotes below.

faq

starter markup?

get a head start on modding our existing layouts by grabbing the markup here (requires login):

can i enter more than once?

yes, but each submission should include all 4x layouts, unique to the other submissions.

i know see all my events, or event details

response content from the endpoint above will include or exclude various parameters based on the preferences you selected on the calendar settings page. if you prefer to design a month layout, select "Month" and then click "Force Refresh" on your calendar plugin to update the JSON response.

i don't want to use FullCalendar, or your Design System

no worries. build with any tooling you'd like.

something else...

email us - hackathon@usetrmnl.com and we'll update this Gist for everyone else.

footnotes

* if you don't have a compatible calendar, or don't feel comfortable using your own data, here's demo JSON you can paste into a private plugin with the static strategy:

{"data":
  {"events":
    {"April 09":
      [{"end": "10:00",
        "start": "11:00",
        "status": "confirmed",
        "all_day": true,
        "summary": "Michael OOO",
        "end_full": "2025-04-12",
        "start_full": "2025-04-09",
        "description": "Headed to the Bahamas"},
       {"end": "11:00",
        "start": "10:00",
        "status": "confirmed",
        "summary": "Monthly Catchup with Dev Team",
        "end_full": "2025-04-10T00:00:00.000+00:00",
        "start_full": "2025-04-09T19:00:00.000-04:00",
        "description": "Discuss progress and obstacles with the development team"},
       {"end": "18:30",
        "start": "13:00",
        "status": "confirmed",
        "summary": "Meeting with Investors",
        "end_full": "2025-04-09T13:30:00.000+00:00",
        "start_full": "2025-04-09T08:00:00.000-04:00",
        "description": "Quarterly meeting to review financials and forecasts with key investors"},
       {"end": "16:00",
        "start": "15:00",
        "status": "confirmed",
        "summary": "Gratitude Standup",
        "end_full": "2025-04-09T16:00:00.000+00:00",
        "start_full": "2025-04-09T11:00:00.000-04:00",
        "description": "Hello everyone! It's officially a good day."},
       {"end": "20:15",
        "start": "19:45",
        "status": "confirmed",
        "summary": "Bath",
        "end_full": "2025-04-09T20:15:00.000+00:00",
        "start_full": "2025-04-09T15:45:00.000-04:00",
        "description": "Clean!"},
       {"end": "23:59",
        "start": "23:30",
        "status": "confirmed",
        "summary": "Read a book",
        "end_full": "2025-04-09T23:59:00.000+00:00",
        "start_full": "2025-04-09T19:30:00.000-04:00",
        "description": "Get smarter"}],
     "April 10":
      [{"end": "13:00",
        "start": "08:15",
        "status": "confirmed",
        "summary": "Quarterly Strategy Meeting",
        "end_full": "2025-04-10T13:00:00.000+00:00",
        "start_full": "2025-04-10T04:15:00.000-04:00",
        "description": "Extended meeting to review and plan company strategy for the next quarter."},
       {"end": "16:00",
        "start": "14:30",
        "status": "confirmed",
        "all_day": true,
        "summary": "Project Kickoff",
        "end_full": "2025-04-10T16:00:00.000+00:00",
        "start_full": "2025-04-10T10:30:00.000-04:00",
        "description": "Kickoff meeting for the new client project."}],
     "April 12":
      [{"end": "12:00",
        "start": "11:00",
        "status": "confirmed",
        "summary": "Code Review",
        "end_full": "2025-04-12T12:00:00.000+00:00",
        "start_full": "2025-04-12T07:00:00.000-04:00",
        "description": "Review and discuss recent code changes with the development team."},
       {"end": "17:00",
        "start": "13:00",
        "status": "confirmed",
        "summary": "Hackathon",
        "end_full": "2025-04-12T17:00:00.000+00:00",
        "start_full": "2025-04-12T09:00:00.000-04:00",
        "description": "Team hackathon to explore innovative ideas and build prototypes."}],
     "April 13":
      [{"end": "14:00",
        "start": "10:00",
        "status": "confirmed",
        "summary": "All-Hands Meeting",
        "end_full": "2025-04-13T14:00:00.000+00:00",
        "start_full": "2025-04-13T06:00:00.000-04:00",
        "description": "Company-wide meeting to discuss updates, goals, and celebrate achievements."},
       {"end": "16:30",
        "start": "15:00",
        "status": "confirmed",
        "summary": "Training Session",
        "end_full": "2025-04-13T16:30:00.000+00:00",
        "start_full": "2025-04-13T11:00:00.000-04:00",
        "description": "Training on new development tools and methodologies."}],
     "April 14":
      [{"end": "11:00",
        "start": "09:30",
        "status": "confirmed",
        "summary": "Sprint Planning",
        "end_full": "2025-04-14T11:00:00.000+00:00",
        "start_full": "2025-04-14T05:30:00.000-04:00",
        "description": "Plan tasks and goals for the upcoming sprint."},
       {"end": "15:00",
        "start": "14:30",
        "status": "confirmed",
        "summary": "One-on-One with John",
        "end_full": "2025-04-14T15:00:00.000+00:00",
        "start_full": "2025-04-14T10:30:00.000-04:00",
        "description": "Weekly check-in with team members."}],
     "April 15":
      [{"end": "17:00",
        "start": "16:00",
        "status": "confirmed",
        "summary": "Weekly Review",
        "end_full": "2025-04-15T17:00:00.000+00:00",
        "start_full": "2025-04-15T12:00:00.000-04:00",
        "description": "Review progress and plan for the upcoming week."},
       {"end": "19:00",
        "start": "17:30",
        "status": "confirmed",
        "summary": "Team Building",
        "end_full": "2025-04-15T19:00:00.000+00:00",
        "start_full": "2025-04-15T13:30:00.000-04:00",
        "description": "Fun team-building activity to end the week."}]},
   "first_day": 1,
   "scroll_time": "11:00",
   "today_in_tz": "2025-04-09",
   "event_layout": "week",
   "instance_name": "Custom Calendar",
   "include_description": true}}
@yunruse
Copy link

yunruse commented Apr 10, 2025

        "end": "13:30",
        "start": "18:00",
        "status": "confirmed",
        "summary": "Meeting with Investors",

I assume "end" and "start" are flipped by accident here rather than this being a case of night owl investors 🦉

@michael-land
Copy link

michael-land commented Apr 10, 2025

I believe the start and end times for the 2nd and 3rd events on April 9th are incorrect based on the timing of the other events..

       {"end": "11:00",    // "00:00"
        "start": "10:00",  // "11:00"
        "status": "confirmed",
        "summary": "Monthly Catchup with Dev Team",
        "end_full": "2025-04-10T00:00:00.000+00:00",
        "start_full": "2025-04-09T19:00:00.000-04:00",
        "description": "Discuss progress and obstacles with the development team"},
       {"end": "13:30",
        "start": "18:00",   // "12:00"
        "status": "confirmed",
        "summary": "Meeting with Investors",
        "end_full": "2025-04-09T13:30:00.000+00:00",
        "start_full": "2025-04-09T08:00:00.000-04:00",
        "description": "Quarterly meeting to review financials and forecasts with key investors"},

@ryanckulp
Copy link
Author

thanks @yunruse , @michael-land , fixing now.

@bsteinfeld
Copy link

bsteinfeld commented Apr 10, 2025

Can you enter more than one plugin?

@ryanckulp
Copy link
Author

ryanckulp commented Apr 10, 2025 via email

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment