Science Score: 44.0%
This score indicates how likely this project is to be science-related based on various indicators:
-
✓CITATION.cff file
Found CITATION.cff file -
✓codemeta.json file
Found codemeta.json file -
✓.zenodo.json file
Found .zenodo.json file -
○DOI references
-
○Academic publication links
-
○Committers with academic emails
-
○Institutional organization owner
-
○JOSS paper metadata
-
○Scientific vocabulary similarity
Low similarity (13.6%) to scientific vocabulary
Keywords
Keywords from Contributors
Repository
A naively simple feed reader
Basic Info
- Host: GitHub
- Owner: rsdoiel
- License: agpl-3.0
- Language: Go
- Default Branch: main
- Homepage: https://rsdoiel.github.io/skimmer
- Size: 3.38 MB
Statistics
- Stars: 1
- Watchers: 2
- Forks: 0
- Open Issues: 4
- Releases: 20
Topics
Metadata Files
README.md
Skimmer Project
The Skimmer Project is a set of tools for working with feeds. It currently drives the Antenna project.
Skimmer originated as a simple terminal based feed reader.
skimmer is a lightweight feed reader inspired by newsboat. skimmer is very minimal and deliberately lacks features. It has less features than newsboat. I think skimmer's best feature is what it doesn't do. skimmer tries to do two things well.
- Read a list of URLs, fetch the feeds and write the items to an SQLite 3 database
- Display the items from the SQLite 3 database in reverse chronological order
That's it. That is skimmer secret power. It does only two things. There is no elaborate user interface beyond standard input, standard output and standard error found on POSIX type operating systems.
If you invoke Skimmer's "interactive" mode your choices are still very limited.
- press enter and go to next item
- press "n" and mark the item read
- press "s" and mark the item "save" the item
- press "q" and quit interactive mode.
By storing the item information in an SQLite3 database (like newsboat's cache.db file) I can re-purpose the feed content as needed. An example is my Antenna experiment. It is a personal news aggregation website. Another might be to convert the entries to BibTeX and manage them as reference. Lots of options are possible. The key here is the SQLite3 database file.
included in the Go based part of the project are a few additional tools that helped in creating Antenna. Longer run I am thinking about changing horses to Deno compiled TypeScript to take advantage of the work that Dave Winer has done, see https://github.com/scripting. increasing I see Skimmer evolving from feed reading and link blogging tool to something more generalized like serving as a post creation tool allowing for publishing static content in Markdown through RSS feeds delivering Markdown content to straight up blogging and micro blogging.
skimmer's url list
As mentioned skimmer was very much inspired by newsboat. In fact it uses and enhanced version of newsboat's urls list format. That's because skimmer isn't trying to replace newsboat as a reader of all feeds but instead gives me more options for what I can do with the feeds I've collected.
The newsboat urls file boils down to a list of urls, one per line with an optional "label" added after the url. That "label" is expressed as a double quote, tilde, label content followed by a double quote. One feed per line. That's really easy to parse. You can add comments using the hash mark with hash mark and anything to the right ignored when the urls are read in to skimmer. Skimmer adds a third item on an feed's line. After the label you can include the agent string you want to use when interacting with the feed's host. That capability was added in October 2023.
UPDATE: 2023-10-31, In using the experimental skimmer app in practice I have found some feed sources still white list access based on user agent strings. Unfortunately it is highly inconsistently to know which string is accepted. As a result maintaining a list of feeds is really challenging unless you can specific a user agent string per feed source for those that need it. As a result I've add an additional column of content to the newsboat url file format. A user agent can be included after a feed's label by adding a space and the user agent string value.
UPDATE: 2025-02-14, I've been relying on skimmer to browse my RSS feeds collections for a couple years now. By and large it works. Since I started Skimmer I've noticed how the new crop of social media platforms have also included RSS support. You can follow people using RSS feeds on Mastodon, BlueSky, and Threads. While we're also experiencing an AI driven bot meltdown on the web my hope is that RSS feed practices will continue.
UPDATE: 2025-08-17, Skimmer will can now use a simple YAML file for configuration. If you set the "app_name" and "version" properties in that file that'll be used as the user agent string when harvesting content from the feed sources.
Skimmer's SQLite 3 database
Skimmer uses SQLite 3 databases to hold collections of feeds and their items. It doesn't use newsboat's cache.db but is very much inspired by it. The name of a Skimmer database ends in ".skim" and pairs with the name of the urls in a Skimmer url LIST. file. Example if I have a urls list named "mynews.txt" the skimmer program will use a database file (and create it if it doesn't exist) called "mynews.skim". Each time skimmer reads the urls file it will replace the content in the skimmer database file except for any notations about a given item having been read or saved.
skimmer feed types
Presently skimmer is focused on reading RSS 2, Atom and jsonfeeds as that is provided by the Go package skimmer uses (i.e. goread). Someday, maybe, I hope to include support for Gopher or Gemini feeds.
SYNOPSIS
~~~ skimmer [OPTIONS] URLLISTFILENAME skimmer [OPTIONS] SKIMMERDBFILENAME [TIME_RANGE] ~~~
skimmer have two ways to invoke it. You can fetch the contents from list of URLs in newsboat urls file format. You can read the items from the related skimmer database.
OPTIONS
-help : display a help page
-license : display license
-version : display version number and build hash
-limit N : Limit the display the N most recent items
-prune : The deletes items from the items table for the skimmer file provided. If a time range is provided then the items in the time range will be deleted. If a single time is provided everything older than that time is deleted. A time can be specified in several ways. An alias of "today" would remove all items older than today. If "now" is specified then all items older then the current time would be removed. Otherwise time can be specified as a date in YYYY-MM-DD format or timestamp YYYY-MM-DD HH:MM:SS format.
-i, -interactive : display an item and prompt for next action. e.g. (n)ext, (s)ave, (t)ag, (q)uit. If you press enter the next item will be displayed without marking changing the items state (e.g. marking it read). If you press "n" the item will be marked as read before displaying the next item. If you press "s" the item will be tagged as saved and next item will be displayed. If you press "t" you can tag the items. Tagged items are treated as save but the next item is not fetched. Pressing "q" will quit interactive mode without changing the last items state.
Examples
Fetch and read my newsboat feeds from .newsboat/urls. This will create a .newsboat/urls.skim
if it doesn't exist. Remember invoking skimmer with a URLs file will retrieve feeds and their contents and invoking skimmer with the skimmer database file will let you read them.
~~~shell skimmer .newsboat/urls skimmer .newsboat/urls.skim ~~~
This will fetch and read the feeds frommy-news.urls. This will create a my-news.skim file.
When the skimmer database is read a simplistic interactive mode is presented.
~~~shell skimmer my-news.urls skimmer -i my-news.skim ~~~
The same method is used to update your my-news.skim file and read it.
Export the current state of the skimmer database channels to a urls file. Feeds that failed to be retrieved will not be in the database channels table channels table. This is an easy way to get rid of the cruft and dead feeds.
~~~shell skimmer -urls my-news.skim >my-news.urls ~~~
Prune the items in the database older than today.
~~~shell skimmer -prune my-news.skim today ~~~
Prune the items older than September 30, 2023.
~~~shell skimmer -prune my-news.skim \ "2023-09-30 23:59:59" ~~~
Installation instructions
- INSTALL.md contains the general steps to install binary releases
- You can download a release from https://github.com/rsdoiel/skimmer/releases
Installation From Source
Requirements
skimmer is an experiment. The compiled binaries are not necessarily tested. To compile from source you need to have git, make, Pandoc, SQLite3 and Go.
- Git >= 2.39
- Make >= 3.8 (GNU Make)
- Pandoc > 3.6
- SQLite3 > 3.4
- Go >= 1.25
Steps to compile and install
Installation process I used to setup skimmer on a new machine.
~~~ git clone https://github.com/rsdoiel/skimmer cd skimmer make make install ~~~
Acknowledgments
This experiment would not be possible with the authors of newsboat, SQLite3, Pandoc and the gofeed package for Go.
Owner
- Name: R. S. Doiel
- Login: rsdoiel
- Kind: user
- Location: California
- Company: California Institute of Technology
- Website: https://rsdoiel.github.io
- Repositories: 149
- Profile: https://github.com/rsdoiel
I am a human. Once upon a time I wrote music and prose. I write software.
Citation (CITATION.cff)
cff-version: 1.2.0
message: "If you use this software, please cite it as below."
type: software
title: skimmer
abstract: "Skimmer is a lightweight feed reader inspired by [newsboat](https://newsboat.org). skimmer is very minimal and deliberately lacks features. Skimmer's best feature is what it doesn't do. Skimmer tries to do two things well.
1. Read a list of URLs, fetch the feeds and write the items to an SQLite 3 database
2. Display the items in the SQLite 3 database in reverse chronological order
That's it. That is skimmer secret power. It does only two things. There is no elaborate user interface beyond standard input, standard output and standard error found on POSIX type operating systems. Even if you invoke it in "interactive" mode your choices are limited, press enter and go to next item, press "n" and mark the item read, press "s" and save the item, press "q" and quit interactive mode."
authors:
- family-names: Doiel
given-names: R. S.
orcid: https://orcid.org/0000-0003-0900-6903
email: rsdoiel@gmail.com
repository-code: "git+https://github.com/rsdoiel/skimmer"
version: 0.0.25
date-released: 2025-08-17
license-url: "https://spdx.org/licenses/AGPL-3.0-or-later"
keywords:
- RSS
- Website genertor
CodeMeta (codemeta.json)
{
"@context": "https://doi.org/10.5063/schema/codemeta-2.0",
"type": "SoftwareSourceCode",
"codeRepository": "git+https://github.com/rsdoiel/skimmer",
"author": [
{
"id": "https://orcid.org/0000-0003-0900-6903",
"type": "Person",
"givenName": "R. S.",
"familyName": "Doiel",
"email": "rsdoiel@gmail.com"
}
],
"dateCreated": "2023-10-06",
"dateModified": "2025-08-20",
"datePublished": "2025-08-17",
"description": "Skimmer is a lightweight feed reader inspired by [newsboat](https://newsboat.org). skimmer is very minimal and deliberately lacks features. Skimmer's best feature is what it doesn't do. Skimmer tries to do two things well.\n\n1. Read a list of URLs, fetch the feeds and write the items to an SQLite 3 database\n2. Display the items in the SQLite 3 database in reverse chronological order\n\nThat's it. That is skimmer secret power. It does only two things. There is no elaborate user interface beyond standard input, standard output and standard error found on POSIX type operating systems. Even if you invoke it in \"interactive\" mode your choices are limited, press enter and go to next item, press \"n\" and mark the item read, press \"s\" and save the item, press \"q\" and quit interactive mode.",
"keywords": [
"RSS",
"Website genertor"
],
"name": "skimmer",
"license": "https://spdx.org/licenses/AGPL-3.0-or-later",
"operatingSystem": [
"Windows",
"macOS",
"Linux",
"Raspberry Pi OS"
],
"programmingLanguage": [
"Go"
],
"relatedLink": [
"https://github.com/mmcdole/gofeed",
"https://newsboat.org/",
"https://sqlite.org"
],
"softwareRequirements": [
"Go >= 1.25.0",
"CMTools >= 0.0.40"
],
"softwareSuggestions": [
"Git >= 2.3",
"GNU Make >= 3.8",
"Pandoc >= 3.1",
"SQLite3 >= 3.43"
],
"version": "0.0.25",
"developmentStatus": "wip",
"issueTracker": "https://github.com/rsdoiel/skimmer/issues",
"releaseNotes": "- **skimdups** is a utility to identify duplication URLs in one or more URL files.\n- **md2urls** will read a CommonMark/Markdown file extracting URLS found in a list of links.\n The results is written to standard output in the URL File format used by skimmer. This\n let's you maintain your list of links in a standard Markdown/CommonMark file.\n- **urls2opml** will convert one or more URL files into an OPML file",
"copyrightYear": 2025,
"copyrightHolder": "R. S. Doiel"
}
GitHub Events
Total
- Release event: 2
- Watch event: 1
- Delete event: 4
- Issue comment event: 1
- Push event: 48
- Pull request event: 6
- Create event: 6
Last Year
- Release event: 2
- Watch event: 1
- Delete event: 4
- Issue comment event: 1
- Push event: 48
- Pull request event: 6
- Create event: 6
Committers
Last synced: 8 months ago
Top Committers
| Name | Commits | |
|---|---|---|
| R. S. Doiel | r****l@g****m | 117 |
| R. S. Doiel | r****l@g****l | 40 |
| dependabot[bot] | 4****] | 5 |
Issues and Pull Requests
Last synced: 6 months ago
All Time
- Total issues: 8
- Total pull requests: 11
- Average time to close issues: 2 days
- Average time to close pull requests: 6 days
- Total issue authors: 1
- Total pull request authors: 1
- Average comments per issue: 0.63
- Average comments per pull request: 0.27
- Merged pull requests: 7
- Bot issues: 0
- Bot pull requests: 11
Past Year
- Issues: 0
- Pull requests: 8
- Average time to close issues: N/A
- Average time to close pull requests: 7 days
- Issue authors: 0
- Pull request authors: 1
- Average comments per issue: 0
- Average comments per pull request: 0.25
- Merged pull requests: 5
- Bot issues: 0
- Bot pull requests: 8
Top Authors
Issue Authors
- rsdoiel (8)
Pull Request Authors
- dependabot[bot] (12)
Top Labels
Issue Labels
Pull Request Labels
Packages
- Total packages: 1
- Total downloads: unknown
- Total dependent packages: 0
- Total dependent repositories: 0
- Total versions: 18
proxy.golang.org: github.com/rsdoiel/skimmer
- Homepage: https://github.com/rsdoiel/skimmer
- Documentation: https://pkg.go.dev/github.com/rsdoiel/skimmer#section-documentation
- License: AGPL-3.0
-
Latest release: v0.0.21
published about 1 year ago
Rankings
Dependencies
- github.com/PuerkitoBio/goquery v1.8.0
- github.com/andybalholm/cascadia v1.3.1
- github.com/dustin/go-humanize v1.0.1
- github.com/glebarez/go-sqlite v1.21.2
- github.com/google/uuid v1.3.0
- github.com/json-iterator/go v1.1.12
- github.com/kayako/bluemonday v0.0.0-20180221084351-e4f82faea2fe
- github.com/mattn/go-isatty v0.0.17
- github.com/mmcdole/gofeed v1.2.1
- github.com/mmcdole/goxpp v1.1.0
- github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd
- github.com/modern-go/reflect2 v1.0.2
- github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec
- golang.org/x/net v0.17.0
- golang.org/x/sys v0.13.0
- golang.org/x/text v0.13.0
- modernc.org/libc v1.22.5
- modernc.org/mathutil v1.5.0
- modernc.org/memory v1.5.0
- modernc.org/sqlite v1.23.1
- github.com/PuerkitoBio/goquery v1.8.0
- github.com/andybalholm/cascadia v1.3.1
- github.com/davecgh/go-spew v1.1.0
- github.com/davecgh/go-spew v1.1.1
- github.com/dustin/go-humanize v1.0.1
- github.com/glebarez/go-sqlite v1.21.2
- github.com/google/gofuzz v1.0.0
- github.com/google/pprof v0.0.0-20221118152302-e6195bd50e26
- github.com/google/uuid v1.3.0
- github.com/json-iterator/go v1.1.12
- github.com/kayako/bluemonday v0.0.0-20180221084351-e4f82faea2fe
- github.com/mattn/go-isatty v0.0.17
- github.com/mmcdole/gofeed v1.2.1
- github.com/mmcdole/goxpp v1.1.0
- github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421
- github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd
- github.com/modern-go/reflect2 v1.0.2
- github.com/pmezard/go-difflib v1.0.0
- github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0
- github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec
- github.com/stretchr/objx v0.1.0
- github.com/stretchr/testify v1.3.0
- github.com/stretchr/testify v1.8.1
- golang.org/x/net v0.0.0-20210916014120-12bc252f5db8
- golang.org/x/net v0.4.0
- golang.org/x/net v0.7.0
- golang.org/x/net v0.17.0
- golang.org/x/sys v0.0.0-20201119102817-f84b799fce68
- golang.org/x/sys v0.0.0-20210423082822-04245dca01da
- golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab
- golang.org/x/sys v0.7.0
- golang.org/x/sys v0.13.0
- golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1
- golang.org/x/text v0.3.6
- golang.org/x/text v0.5.0
- golang.org/x/text v0.7.0
- golang.org/x/text v0.13.0
- golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e
- gopkg.in/yaml.v3 v3.0.1
- modernc.org/libc v1.22.5
- modernc.org/mathutil v1.5.0
- modernc.org/memory v1.5.0
- modernc.org/sqlite v1.23.1