{"id":270779,"date":"2026-01-04T19:08:30","date_gmt":"2026-01-04T19:08:30","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/pretty-calendar-embeds\/"},"modified":"2026-01-08T17:08:22","modified_gmt":"2026-01-08T17:08:22","slug":"hydrogen-calendar-embeds","status":"publish","type":"plugin","link":"https:\/\/twd.wordpress.org\/plugins\/hydrogen-calendar-embeds\/","author":9635749,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_crdt_document":"","version":"3.0.1","stable_tag":"3.0.1","tested":"6.9.4","requires":"5.8","requires_php":"7.4","requires_plugins":null,"header_name":"Hydrogen Calendar Embeds","header_author":"LBell","header_description":"Embed any existing iCalendar (ICS) source into your WordPress site using Gutenberg blocks or shortcodes.","assets_banners_color":"","last_updated":"2026-01-08 17:08:22","external_support_url":"","external_repository_url":"","donate_link":"https:\/\/github.com\/sponsors\/lbell","header_plugin_uri":"https:\/\/github.com\/lbell\/hydrogen-calendar-embeds","header_author_uri":"https:\/\/lorenbell.com","rating":5,"author_block_rating":0,"active_installs":600,"downloads":1792,"num_ratings":1,"support_threads":1,"support_threads_resolved":1,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.0":{"tag":"1.0.0","author":"lbell","date":"2026-01-04 19:08:22"},"1.0.1":{"tag":"1.0.1","author":"lbell","date":"2026-01-04 19:33:05"},"3.0.0":{"tag":"3.0.0","author":"lbell","date":"2026-01-04 19:46:35"},"3.0.1":{"tag":"3.0.1","author":"lbell","date":"2026-01-08 17:08:22"}},"upgrade_notice":[],"ratings":{"1":0,"2":0,"3":0,"4":0,"5":1},"assets_icons":{"icon.svg":{"filename":"icon.svg","revision":3432211,"resolution":false,"location":"assets","locale":false}},"assets_banners":[],"assets_blueprints":{},"all_blocks":{"hycal\/calendar":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"hycal\/calendar","title":"Hydrogen Calendar Embeds","category":"embed","icon":"calendar-alt","description":"Embed iCalendar (ICS) feeds and Google Calendars with a beautiful, responsive calendar interface.","keywords":["calendar","ics","icalendar","google calendar","events","embed"],"textdomain":"hydrogen-calendar-embeds","supports":{"html":false,"align":["wide","full"],"spacing":{"margin":true,"padding":true}},"attributes":{"ics":{"type":"string","default":""},"calIds":{"type":"string","default":""},"locale":{"type":"string","default":"en"},"customListButton":{"type":"string","default":"list"},"customDays":{"type":"string","default":"28"},"views":{"type":"string","default":"dayGridMonth, listMonth"},"initialView":{"type":"string","default":"dayGridMonth"},"enforceListviewOnMobile":{"type":"boolean","default":true},"mobileBreakpoint":{"type":"string","default":"768"},"showTodayButton":{"type":"boolean","default":true},"showLove":{"type":"boolean","default":false},"showTitle":{"type":"boolean","default":true},"useTooltip":{"type":"boolean","default":true},"hidePast":{"type":"boolean","default":false},"fcArgs":{"type":"string","default":"{}"}},"editorScript":"file:.\/index.js","editorStyle":"file:.\/index.css","render":"file:.\/render.php"}},"tagged_versions":["1.0.0","1.0.1","3.0.0","3.0.1"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3432211,"resolution":"1","location":"assets","locale":""},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3432211,"resolution":"2","location":"assets","locale":""},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3432211,"resolution":"3","location":"assets","locale":""},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3432211,"resolution":"4","location":"assets","locale":""}},"screenshots":{"1":"Hydrogen Calendar Embeds","2":"List View","3":"Optional Event Popover","4":"Block Editor - It's that simple"},"jetpack_post_was_ever_published":false},"plugin_section":[],"plugin_tags":[416,230,1486,4743,6296],"plugin_category":[40,56],"plugin_contributors":[190835],"plugin_business_model":[],"class_list":["post-270779","plugin","type-plugin","status-publish","hentry","plugin_tags-calendar","plugin_tags-embed","plugin_tags-events","plugin_tags-google-calendar","plugin_tags-ics","plugin_category-calendar-and-events","plugin_category-social-and-sharing","plugin_contributors-lbell","plugin_committers-lbell"],"banners":[],"icons":{"svg":"https:\/\/ps.w.org\/hydrogen-calendar-embeds\/assets\/icon.svg?rev=3432211","icon":"https:\/\/ps.w.org\/hydrogen-calendar-embeds\/assets\/icon.svg?rev=3432211","icon_2x":false,"generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/hydrogen-calendar-embeds\/assets\/screenshot-1.png?rev=3432211","caption":"Hydrogen Calendar Embeds"},{"src":"https:\/\/ps.w.org\/hydrogen-calendar-embeds\/assets\/screenshot-2.png?rev=3432211","caption":"List View"},{"src":"https:\/\/ps.w.org\/hydrogen-calendar-embeds\/assets\/screenshot-3.png?rev=3432211","caption":"Optional Event Popover"},{"src":"https:\/\/ps.w.org\/hydrogen-calendar-embeds\/assets\/screenshot-4.png?rev=3432211","caption":"Block Editor - It's that simple"}],"raw_content":"<!--section=description-->\n<p>This completely free, extremely light-weight plugin with explosive potential embeds <strong>ANY<\/strong> iCal (.ics) calendar into your WordPress site using the beautiful, time-tested FullCalendar library.<\/p>\n\n<p>Nothing is hidden behind a \"pro\" upgrade. All features are free.<\/p>\n\n<p>Works with any public ICS\/iCal feed:\n  - Google Calendar\n  - iCloud\n  - Outlook\n  - Airbnb\n  - <strong>Pretty much anything that can output an ICS feed<\/strong><\/p>\n\n<p>Just add the new Hydrogen Calendar Embeds block, copy in your ical address(s), and BAM! a modern, responsive, beautiful calendar.<\/p>\n\n<ul>\n<li>Need two calendars in one? We got you. <\/li>\n<li>Need multiple different calendars on the page? Easy peasy. <\/li>\n<li>Prefer another color or style? We've got CSS classes for days.<\/li>\n<li>Need different functionality? It's developer friendly, completely extendable, and infinitely customizable.<\/li>\n<\/ul>\n\n<p><strong>Highlights:<\/strong><\/p>\n\n<ul>\n<li>Manage events using any external calendar of your choice<\/li>\n<li>Combine multiple ICS feeds into one calendar<\/li>\n<li>Embed multiple calendars on one page<\/li>\n<li>Lots of view options (Grid, Month List, Day List, Year List)<\/li>\n<li>Locale support<\/li>\n<li>Lots of customization options (and ability to add more)<\/li>\n<li>Lightweight and fast<\/li>\n<li>Responsive design<\/li>\n<li>Easy setup using WordPress Block or Shortcodes<\/li>\n<li><strong>NO API KEYS REQUIRED<\/strong><\/li>\n<\/ul>\n\n<h3>Contributing<\/h3>\n\n<p>Contributions are welcome! Please feel free to submit a Pull Request to the <a href=\"https:\/\/github.com\/lbell\/hydrogen-calendar-embeds\">GitHub repository<\/a>.<\/p>\n\n<h3>Support<\/h3>\n\n<p>For support, feature requests, or bug reports, please visit the <a href=\"https:\/\/github.com\/lbell\/hydrogen-calendar-embeds\">GitHub repository<\/a>.<\/p>\n\n<p>You can also sponsor development at <a href=\"https:\/\/github.com\/sponsors\/lbell\">GitHub Sponsors<\/a>.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>hydrogen-calendar-embeds<\/code> folder to the <code>\/wp-content\/plugins\/<\/code> directory.<\/li>\n<li>Activate <code>Hydrogen Calendar Embeds<\/code> through the 'Plugins' menu in WordPress dashboard.<\/li>\n<li>Add the Hydrogen Calendar Embeds block to your page or post<\/li>\n<li>Or use the shortcode directly<\/li>\n<\/ol>\n\n<h4>Shortcode Options (also available via block settings UI)<\/h4>\n\n<p>(<strong>Migrating from Pretty Google Calendar?<\/strong> Just replace <code>pretty_google_calendar<\/code> with <code>hydrogen_calendar_embeds<\/code>, and swap <code>gcal=id<\/code> with <code>ics=ics_url<\/code> in your shortcodes. All other options remain the same.)<\/p>\n\n<p>Shortcode format is:<\/p>\n\n<pre><code>[hydrogen_calendar_embeds ics=\"ICS_URL, ICS_URL, ...\" other_option=\"value\" ... ]\n<\/code><\/pre>\n\n<p>Where the options are:<\/p>\n\n<pre><code>ics=\"https:\/\/example.com\/calendar.ics\"\n<\/code><\/pre>\n\n<p>Public ICS\/iCal feed URL(s). Works with any standard ICS feed: Google Calendar, iCloud, Outlook, Nextcloud, Teamup, corporate Exchange servers, and more. Multiple ICS feeds can be comma-separated. The plugin fetches the ICS data server-side to avoid CORS issues.<\/p>\n\n<pre><code>cal_ids=\"identifier,identifier\"\n<\/code><\/pre>\n\n<p>Optional custom CSS identifiers for each calendar. Allows using meaningful names instead of numeric indexes for styling. Example: <code>cal_ids=\"soccer,baseball\"<\/code> generates classes like <code>.hycal-calendar-soccer<\/code> and <code>.hycal-calendar-baseball<\/code>. Identifiers should be lowercase alphanumeric with hyphens.\nDefaults to numeric indexes (0, 1, 2, etc.)<\/p>\n\n<pre><code>locale=\"en\"\n<\/code><\/pre>\n\n<p>Sets the locale for calendar. Defaults to \"en\".<\/p>\n\n<pre><code>views=\"dayGridMonth, listMonth\"\n<\/code><\/pre>\n\n<p>Sets the view types available. If only one view is provided, no view switch buttons will be shown. Defaults to \"dayGridMonth, listMonth\".<\/p>\n\n<p>Available views: <code>dayGridMonth<\/code> (monthly grid), <code>listDay<\/code>, <code>listWeek<\/code>, <code>listMonth<\/code>, <code>listYear<\/code> (list views), and <code>listCustom<\/code> (custom duration list).<\/p>\n\n<p>Tip: <code>listCustom<\/code> allows you to set the number of days you want to display from the current date. Whereas listMonth shows all events from this month (including past events), using <code>views=\"dayGridMonth, listCustom\" custom_days=\"28\"<\/code> will show the next 28 days across months.<\/p>\n\n<pre><code>custom_days=\"28\"\n<\/code><\/pre>\n\n<p>Sets the number of days to show when using <code>listCustom<\/code> view. Defaults to \"28\".<\/p>\n\n<pre><code>custom_list_button=\"list\"\n<\/code><\/pre>\n\n<p>Sets the button label for the <code>listCustom<\/code> view. Defaults to \"list\".<\/p>\n\n<pre><code>initial_view=\"dayGridMonth\"\n<\/code><\/pre>\n\n<p>Sets the default view to be displayed when opening the page. Defaults to \"dayGridMonth\". Note: If only one view is specified in \"views\", \"initial_view\" will automatically be set to that view and does not need to be specified.<\/p>\n\n<pre><code>enforce_listview_on_mobile=\"true\"\n<\/code><\/pre>\n\n<p>Sets the change to the list view behavior on small screens. Options: \"true\" and \"false\". Defaults to \"true\". This option has no effect if there is no list view declared in the \"views\" option.<\/p>\n\n<pre><code>mobile_breakpoint=\"768\"\n<\/code><\/pre>\n\n<p>Sets the screen width (in pixels) at which the calendar switches to list view on mobile. Defaults to \"768\". Only used when <code>enforce_listview_on_mobile<\/code> is enabled.<\/p>\n\n<pre><code>show_today_button=\"true\"\n<\/code><\/pre>\n\n<p>Sets the visibility of the \"Today\" button. Options: \"true\" and \"false\". Defaults to \"true\".<\/p>\n\n<pre><code>show_title=\"true\"\n<\/code><\/pre>\n\n<p>Sets the visibility of the calendar title. Options: \"true\" and \"false\". Defaults to \"true\".<\/p>\n\n<pre><code>hide_past=\"false\"\n<\/code><\/pre>\n\n<p>Hides past events from the calendar completely. Options: <code>true<\/code> and <code>false<\/code>. Defaults to <code>false<\/code>. When set to <code>true<\/code>, events before today will not be displayed in any view.<\/p>\n\n<pre><code>instance_id=random\n<\/code><\/pre>\n\n<p>Sets the ID hash for a calendar. If you have multiple calendars on a page and need to style them, you can set this to a permanent code. Otherwise, it'll randomly generate each load. (Note: this can only be alphanumeric.)<\/p>\n\n<pre><code>use_tooltip=\"true\"\n<\/code><\/pre>\n\n<p>Migrating from global setting for individual calendar styling. Whether the floating tooltip for event pops up on click.<\/p>\n\n<pre><code>no_link=\"true\"\n<\/code><\/pre>\n\n<p>Migrating from global setting for individual calendar styling. Whether to disable link to calendar.google.com on click.<\/p>\n\n<pre><code>fc_args = JSON string ((EXPERIMENTAL))\n<\/code><\/pre>\n\n<p>Allows you to override or implement just about any FullCalendar argument (with some exception). For example: <code>fc_args='{\"weekNumbers\":\"true\", \"eventTextColor\":\"red\"}'<\/code><\/p>\n\n<p><strong>Workaround for square brackets:<\/strong> WordPress shortcode parsing breaks with square brackets <code>[]<\/code>. To use square brackets in your JSON, use URL-encoded brackets:\n- <code>[<\/code> becomes <code>%5B<\/code>\n- <code>]<\/code> becomes <code>%5D<\/code><\/p>\n\n<p>Example: <code>fc_args='{\"eventSources\":%5B\"url\"%5D}'<\/code> will be converted to <code>{\"eventSources\":[\"url\"]}<\/code><\/p>\n\n<p>Note: this is experimental - things may break.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id='what%20sorcery%20is%20this%3F%21'><h3>What sorcery is this?!<\/h3><\/dt>\n<dd><p>Hydrogen Calendar Embeds implements the excellent <a href=\"https:\/\/fullcalendar.io\/\">Full Calendar<\/a> for you, and tosses in a little <a href=\"https:\/\/atomiks.github.io\/tippyjs\/\">Tippy.js<\/a> and <a href=\"https:\/\/popper.js.org\/\">Popper<\/a> to make things... well... pop.<\/p><\/dd>\n<dt id='can%20i%20use%20this%20to%20manage%20a%20calendar%3F'><h3>Can I use this to manage a calendar?<\/h3><\/dt>\n<dd><p>No. All calendar events are maintained via your calendar source (Google Calendar, iCloud, Outlook, Airbnb, Clickup, etc.). This plugin just displays them beautifully.<\/p><\/dd>\n<dt id='how%20do%20i%20style%20multiple%20calendars%3F'><h3>How do I style multiple calendars?<\/h3><\/dt>\n<dd><p>Each calendar gets its own CSS selector: <code>hycal-event-#<\/code> where the # is the order of the listed calendar (starting with 0). So if you have two calendars in one, you can use <code>hycal-event-0<\/code> to style the first, and <code>hycal-event-1<\/code> to style the second calendar.<\/p>\n\n<p>If you use the <code>cal_ids<\/code> argument to set custom identifiers, those will be used instead of numeric indexes.<\/p>\n\n<p>For example, if you set <code>cal_ids=\"soccer,baseball\"<\/code>, you can use <code>.hycal-calendar-soccer-event<\/code> and <code>.hycal-calendar-baseball-event<\/code> to style each calendar's events specifically.<\/p>\n\n<p>Event pop-up tooltips also have calendar-specific classes: <code>hycal-calendar-0-event-popup<\/code> for easier styling of event pop-ups per calendar.<\/p><\/dd>\n<dt id='how%20do%20i%20theme%20the%20calendar%3F'><h3>How do I theme the calendar?<\/h3><\/dt>\n<dd><p>Add custom CSS to your theme to tweak to your desire.<\/p><\/dd>\n<dt id='can%20this%20plugin%20do%20x%2C%20y%20or%20z%3F'><h3>Can this plugin do X, Y or Z?<\/h3><\/dt>\n<dd><p>Probably!<\/p>\n\n<p>With the <code>fc_args<\/code> parameter, you can pass in any FullCalendar argument to customize your calendar. See the FullCalendar documentation for a full list of options: https:\/\/fullcalendar.io\/docs<\/p>\n\n<p>Contact me for requests for additional functionality, and let's see what we can create together!<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>3.0.1<\/h4>\n\n<ul>\n<li>Fixed issue with URL encoding in ICS feed proxy URL.<\/li>\n<\/ul>\n\n<h4>3.0.0<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<\/ul>\n\n<h4>2.2.0<\/h4>\n\n<ul>\n<li>This plugin is an improved fork of the Pretty Google Calendar v2.2.0, which has been battle-tested for years. All Google Calendar API nonsense has been removed, and replaced with ICS feed fetching\/parsing, making this plugin much more versatile!<\/li>\n<\/ul>","raw_excerpt":"The free, simple, lightweight way to embed beautiful, fully customizable ICS calendars into your WordPress site.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/twd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/270779","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/twd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/twd.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/twd.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=270779"}],"author":[{"embeddable":true,"href":"https:\/\/twd.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/lbell"}],"wp:attachment":[{"href":"https:\/\/twd.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=270779"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/twd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=270779"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/twd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=270779"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/twd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=270779"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/twd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=270779"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/twd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=270779"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}