Update your Now page, automatically
Find a file
2025-12-28 18:14:00 +00:00
.forgejo/workflows added STEAM_WEBAPI_KEY to environment variables in update.yml 2025-12-28 17:59:47 +00:00
.env.example added HARDCOVER_API_KEY to .env.example for hardcover service 2025-12-28 18:13:32 +00:00
.gitignore removed local development files from .gitignore 2025-12-28 16:57:45 +00:00
config.js moved services from config.js into their own services.js 2025-12-28 16:52:26 +00:00
index.js updated to include image extraction and separate image urls 2025-12-28 17:45:59 +00:00
now-page-template.md updated to include images 2025-12-28 17:46:16 +00:00
package-lock.json letterboxd support 2025-12-17 21:35:31 -08:00
package.json added local development files to .gitignore and updated package.json to include preview script 2025-12-28 13:32:09 +00:00
profile-page-template.md added profile and now page templates with updated content and links 2025-12-25 18:27:26 +00:00
README.md added Maloja scrobble handler to feedHandlers 2025-12-28 17:23:27 +00:00
services.js updated to include image extraction and separate image urls 2025-12-28 17:45:59 +00:00
utils.js added hardcover activity function with API key validation 2025-12-28 18:14:00 +00:00

now-updater

Automatically updates your omg.lol Now page with your latest activity.

Fork of melanie/now-updater with added support for HTML output links, Mastodon, Last.fm, and dynamic URLs.

Demo: dylan.omg.lol/now

How It Works

Fetches content from RSS feeds, JSON feeds, and different services (Letterboxd, Trakt, Mastodon, Last.fm) and updates HTML or markdown links on your Now page. Runs every 3 hours via Forgejo Actions, only updating your page when changes are detected.

Example

Your Now page links will be automatically updated from this:

HTML links (before):

<a href="service-link">blog</a>
<a href="service-link">gitlab</a>

Markdown links (before):

[blog](service-link)
[gitlab](service-link)

to this:

HTML links (after):

<a href="https://your-blog.com/2025/12/my-latest-post">My Latest Post</a>
<a href="https://gitlab.com/username/project">Pushed to repository</a>

Markdown links (after):

[My Latest Post](https://your-blog.com/2025/12/my-latest-post)
[Pushed to repository](https://gitlab.com/username/project)

New in this fork: Use service names as link text instead of URLs! Just write <a href="service-link">servicename</a> and the script fills in both the text and URL.

Setup

  1. Fork this repo
  2. Enable Actions in repo settings
  3. Add Actions variables: OMGLOL_USERNAME (your omg.lol username)
  4. Add Actions secrets: OMGLOL_KEY (your API key), TRAKT_SLURM (optional, see Trakt for details)
  5. Add your sources in config.js

For local development, copy .env.example to .env with your credentials.

Basic Example

Now page template:

I wrote this: [tktk](https://your-blog.com)
I watched this: [tktk](trakt.tv/users/username)

config.js:

export const linkFormat = 'markdown'

export const items = [
  {
    id: 'blog',
    regex: htmlLinkRegex('your-blog.com'),
    getLatest: async () => getJsonFeedItemTitle('https://your-blog.com/feed.json'),
  },
  {
    id: 'letterboxd',
    regex: htmlLinkRegex('letterboxd.com/username'),
    getLatest: async () => getLetterboxdActivity('username', true), // with image
  },
  {
    id: 'trakt-movie',
    regex: htmlLinkRegex('trakt.tv/users/username'),
    getLatest: async () => getTraktMovie('username', 'your-trakt-id', false), // text only
  },
]

Configuration

Quick Start

  1. In your Now page, use service names as link text:
<a href="service-link">blog</a>
<a href="service-link">gitlab</a>
  1. In services.js, find the service and flip isActive to true:
{
  id: 'gitlab',
  isActive: true,  // just change this!
  regex: htmlServiceLinkRegex('gitlab'),
  feedUrl: 'https://gitlab.com/users/your-username/activity.atom',
  feedType: 'atom',
}

That's it! No importing, no commenting/uncommenting.

Files

  • config.js - Link format setting and filter logic (rarely needs editing)
  • services.js - All available services with isActive flags (edit this to enable/disable services)
  • utils.js - Generic feed handlers and special service logic

Service Structure

Each service has:

  • id: identifier for logs
  • isActive: true to enable, false to disable
  • regex: matches service name in your Now page
  • feedType: Handler to use (rss, atom, json, or special handler name like mastodon)
  • feedUrl: Direct feed URL (use this for custom feeds without usernames)
  • feedUrlTemplate: URL template with {userId} placeholder (use this for standard services)
  • userId: Your username/ID (only needed with feedUrlTemplate)
  • Extra params as needed (e.g., instance, steamId, traktId, showImage)

Note: Use either feedUrl (direct) OR feedUrlTemplate + userId (template). Both work!

Set linkFormat in config.js to 'html' or 'markdown'.

Available Functions

Code Activity

  • getSourceTubeActivity(username) - Forgejo activity on source.tube
  • getGitLabActivity(username) - GitLab activity feed
  • getCodebergActivity(username) - Codeberg activity feed

Content Creation

  • getYouTubeLatestVideo(channelId) - Latest YouTube video (requires channel ID starting with "UC")
  • getVimeoLatestVideo(username) - Latest Vimeo video
  • getTwitchLatestStream(channel) - Latest Twitch stream/VOD (via TwitchRSS, no API key needed)

Gaming

  • getBackloggdActivity(username, showImage) - Backloggd game activity with optional cover images
  • getExophaseActivity(username, showImage) - Multi-platform gaming achievements
  • getSteamRecentlyPlayed(steamId) - Recently played Steam game (requires STEAM_WEBAPI_KEY)

Books

  • getGoodreadsActivity(userId, showImage) - Goodreads activity (requires numeric user ID, not username)
  • getHardcoverActivity(username) - Currently reading books via GraphQL API

Music

  • getListenBrainzScrobble(username) - Latest music scrobble (open source Last.fm alternative)

Social Media

  • getPixelfedPost(instance, username) - Latest Pixelfed post from federated instance
  • getBlueskyPost(handle) - Latest Bluesky post (note: links not clickable in RSS)

General/Legacy

  • getRSSItemTitle(feedUrl) - Standard RSS feeds
  • getJsonFeedItemTitle(feedUrl, showImage) - JSON feeds
  • getLetterboxdActivity(username, showImage) - Letterboxd activity
  • getTraktEpisode(username, id, showImage) - Latest TV episode
  • getTraktMovie(username, id, showImage) - Latest movie
  • getTraktEpisodeAndMovie(username, id, showImage) - Latest episode and movie combined
  • getMastodonPost(feedUrl) - Latest non-reply Mastodon post
  • getMalojaScrobble(url) - Latest music scrobble from maloja

Important Notes:

  • showImage (defaults to true) controls whether images/posters are included in the output. Set it to false to show text only.
  • For Last.fm, use getRSSItemTitle('https://lfm.xiffy.nl/your-username') (via lfm.xiffy.nl)
  • YouTube requires channel ID (not username), find it in your channel's page source or URL
  • Goodreads requires numeric user ID (found in profile URL after /user/show/)
  • Steam requires Steam ID 64 (convert at https://steamid.io/)
  • Pixelfed requires instance domain and username (e.g., pixelfed.social, username)

API Keys Setup

Trakt

To get your Trakt slurm key, follow these steps:

  1. Go to your History page on Trakt: https://trakt.tv/users/your-username/history
  2. There should be an RSS feed icon on the top right of the page. Click it.
  3. The URL it shows will look something like this: https://trakt.tv/users/crankle/history.atom?slurm=your-slurm-key
  4. Copy the slurm value from the URL and add it as a secret in your Actions settings named TRAKT_SLURM.

Steam

To get your Steam Web API key:

  1. Visit https://steamcommunity.com/dev/apikey
  2. Enter a domain name (can be localhost for personal use)
  3. Agree to the terms and get your API key
  4. Add it to your .env file as STEAM_WEBAPI_KEY or to Actions secrets
  5. Find your Steam ID 64 at https://steamid.io/ (enter your profile URL)

Credits

Original project by melanie kat. Without her work, this fork would not exist.

Thank you also to xiffy for the Last.fm scrobble fetching service this uses.

Support

Did you find this useful like I did? Melanie asks that you donate to Trans Lifeline or The Trevor Project if you can. I will also add Belong To to that list.