This is a simple RSS and Atom feed notifier. It fetches new articles from feed resources and notifies consumers like discord
chat or graphql
API subscribers.
flowchart LR
subgraph go-feed-me
direction TB
subgraph job
t("`Cron crawlers`")
end
subgraph storage
st1("`SQLite`")
st2("`Postgres`")
end
subgraph api
direction TB
api1("`/graphql`")
api2("`/metrics`")
end
end
subgraph consumers
direction RL
sub1("`Discord chat`")
sub2("`Graphql subscribers`")
end
feed("`RSS or atom feeds`") --> go-feed-me --> consumers
job --> storage --> api
- GraphQL UI and API
- Storing data in database (sqlite, postgres)
- Adding new RSS feed resources and store them
- Fetch new articles from RSS feed resources
- Notify new articles to graphql subscribers, discord.
- Observability (logs, metrics, traces)
- Support more subscribers (slack, email, etc) or make it pluggable
- Support multiple users and roles
- Support filtering resources (maybe articles) by tags
docker run -it --rm -p 8080:8080 -p 8081:8081 sealbro/go-feed-me:latest
Open http://localhost:8080/feed/graphql/ in your browser.
Name | Description | Default |
---|---|---|
SLUG |
Path api prefix | feed |
PUBLIC_ADDRESS |
Public api address | :8080 |
PRIVATE_ADDRESS |
Private metrics address | :8081 |
CRON |
Cron pattern when run jobs | 1/60 * * * * * |
SQLITE_CONNECTION |
Sqlite file location | /feed.db |
POSTGRES_CONNECTION |
Postgres connection string | empty |
DISCORD_WEBHOOK_ID |
Discord webhook id | empty |
DISCORD_WEBHOOK_TOKEN |
Discord webhook token | empty |
LOG_LEVEL |
slog level | INFO |
OTEL_EXPORTER_OTLP_ENDPOINT |
Otlp grpc endpoint | empty |
- Postgres connection string:
host=<ip or host> user=<username> password=<password> dbname=feed port=5432 sslmode=disable
- Discord how get id and token for webhook
- Cron pattern quartz
query Articles {
articles (after: "2023-01-01T15:04:05.999999999Z") {
published,
link,
title,
description,
content
}
}
query Resources {
resources(active: true) {
url
title
active
created
modified
published
}
}
mutation AddResources {
addResources (resources: [
{url: "https://github.com/opencv/opencv/releases.atom", active: true},
{url: "https://github.com/openvinotoolkit/openvino/releases.atom", active: true},
{url: "https://github.com/hybridgroup/gocv/releases.atom", active: true},
])
}
mutation ActivateResources {
activateResources (
urls: ["https://github.com/opencv/opencv/releases.atom"],
active: false
)
}
mutation RemoveResources {
removeResources (
urls: ["https://github.com/opencv/opencv/releases.atom"]
)
}
subscription notifyNewData {
articles {
title
description
content
link
}
}
Build docker image locally:
docker build --build-arg GO_VERSION="$(grep '^go' go.mod | awk '{print $2}')" -t feed .
Run local built docker image:
docker run -it --rm -p 8080:8080 -p 8081:8081 feed
make generate