diff --git a/README.md b/README.md
index cfdeb24..641c68f 100644
--- a/README.md
+++ b/README.md
@@ -1,79 +1,117 @@
# now-updater
-Update your Now page, automatically
+Automatically updates your omg.lol Now page with your latest activity.
-[**Demo**](https://melanie.lol/now)
+> Fork of [melanie/now-updater](https://source.tube/melanie/now-updater) with added support for HTML output links, Mastodon, Last.fm, and dynamic URLs.
+Demo: [dylan.omg.lol/now](https://dylan.omg.lol/now)
## How It Works
-You define a connection and a URL in the `config.js` file so that it looks for a Markdown link with the URL and replaces the text with the connection's value.
+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.
-For example:
+### Example
+Your Now page links will be automatically updated from this:
+
+**HTML links** (before):
+```html
+tktk
+```
+**Markdown links** (before):
```markdown
-- {blog} [tktk](https://melkat.blog)
+[tktk](https://your-blog.com)
```
-Becomes:
+to this:
+
+**HTML links** (after):
+```html
+My Latest Post
+```
+**Markdown links** (after):
```markdown
-- {blog} [My Latest Post](https://melkat.blog)
+[My Latest Post](https://your-blog.com/2025/12/my-latest-post)
```
-To keep this going automatically, we use a Forgejo Action runner configured to run every three hours.
+## Setup
-While it does run every three hours, it only updates your now page when there has been a change.
+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](#trakt) for details)
+5. Add your sources in `config.js`
+For local development, copy `.env.example` to `.env` with your credentials.
-## Getting Started
+## Basic Example
-1. Fork this repo, and go to theTRAKT_SLURM _Settings_ tab, select _Actions_ and go to _Variables_
-2. Create a variable `OMGLOL_USERNAME` and set it to your omg.lol username. So for me, it's `melanie`
- - This is where you store nonsensitive variables. Currently this is only used for your omg.lol username.
-3. Also in _Settings_ under _Actions_, select _Secrets_
-4. Create a secret `OMGLOL_KEY` and set it to your omg.lol API key
- - This is where you will define any sensitive keys, for example I use `TRAKT_SLURM` to store my _SLURM_ key. You only need this if you want to use the Trakt integration.
-5. Once you are ready, you can enable the Forgejo Action by going to the fork's settings page. From the sidebar, go to Units and then Overview. This will take you to a page where you can enable actions.
- - Check the box next to `Actions` and don't forget to click save.
-
-If you're running this locally, you may also want to copy the `.env.example` to `.env` and store those values there too. The `.env` file is git ignored for a reason, so be sure not to commit it.
-
-
-## Configuring
-
-Configuring is all done within the `config.js` in the `items` array.
-
-For example, to get the latest post from my blog's JSON feed.
+**Now page template:**
+```html
+I wrote this: [tktk](https://your-blog.com)
+I watched this: [tktk](trakt.tv/users/username)
+```
+**config.js:**
```js
-{
- id: 'blog',
- regex: markdownLinkRegex('melkat.blog'),
- getLatest: async () =>
- getJsonFeedItemTitle('https://melkat.blog/feed.json'),
-},
+export const linkFormat = 'html'
+
+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
+ },
+]
```
-- `id`: Used for logs
-- `regex`: The regex used for finding the markdown link to replace the link text of
-- `getLatest`: an async function to fetch the data and return a string used to be the new link text
+## Configuration
-### Available Functions
+Edit `config.js` to define your content sources. Each item needs:
+- `id`: identifier for logs
+- `regex`: pattern to match your link
+- `getLatest`: async function that fetches and returns latest content
-#### Basics
+Set `linkFormat` to `'html'` or `'markdown'` depending on your Now page format.
-- `getJsonFeedItemContent(feedUrl, showImage = true)`: For getting the `content_html` of a JSON feed item and when available the item's `image` (unless the last argument is `false`)
-- `getJsonFeedItemTitle(feedUrl, showImage = true)`: For getting the `title` of a JSON feed item and when available the item's `image` (unless the last argument is `false`)
-- `getRSSItemTitle(RSS_URL)`: For getting the `title` of a RSS feed item
+## Available Functions
-#### Service Specific
+- `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](https://github.com/krateng/maloja)
-- `getLetterboxdActivity(letterboxdUsername, showImage = true)`: For getting the latest item from your Letterboxd RSS feed and the image from the description (unless the last argument is `false`)
-- `getMalojaScrobble(malojaUrl)`: For getting the latest scrobble artist and track title
-- `getTraktEpisode(traktUsername, traktId, showImage = true)`: For getting the latest watched TV episode's show name, season and episode number, episode title, and episode image (unless the last argument is `false`)
+**Note:** `showImage` (defaults to `true`) controls whether images/posters are included in the output. Set it to `false` to show text only.
+## 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`.
+
+There may be a better way to get this key, but this is how I found it.
+
+## Credits
+
+Original project by [melanie kat](https://source.tube/melanie/now-updater). Without her work, this fork would not exist.
## Support
-Got a question? Reach out to me on Mastodon, [@zicklepop@nyan.lol](https://nyan.lol/@zicklepop) and I will do my best.
-Did you find this useful? Donate to [Trans Lifeline](https://translifeline.org) or [The Trevor Project](https://thetrevorproject.org).
+Did you find this useful like I did? Melanie asks that you donate to [Trans Lifeline](https://translifeline.org) or [The Trevor Project](https://thetrevorproject.org) if you can. I will also add [Belong To](https://www.belongto.org) to that list.
\ No newline at end of file