{"id":21310616,"url":"https://github.com/jtanza/rufus","last_synced_at":"2025-07-11T23:31:54.785Z","repository":{"id":43393802,"uuid":"92879457","full_name":"jtanza/rufus","owner":"jtanza","description":"Rufus - fetches the paper for you!","archived":false,"fork":false,"pushed_at":"2023-11-29T00:34:12.000Z","size":249,"stargazers_count":106,"open_issues_count":6,"forks_count":8,"subscribers_count":8,"default_branch":"master","last_synced_at":"2023-11-30T00:39:18.122Z","etag":null,"topics":["dropwizard","h2-database","java","jwt","rss"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jtanza.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2017-05-30T21:52:59.000Z","updated_at":"2023-11-29T07:29:40.000Z","dependencies_parsed_at":"2023-01-17T19:15:57.585Z","dependency_job_id":null,"html_url":"https://github.com/jtanza/rufus","commit_stats":null,"previous_names":[],"tags_count":0,"template":null,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jtanza%2Frufus","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jtanza%2Frufus/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jtanza%2Frufus/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jtanza%2Frufus/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jtanza","download_url":"https://codeload.github.com/jtanza/rufus/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":225769345,"owners_count":17521258,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["dropwizard","h2-database","java","jwt","rss"],"created_at":"2024-11-21T17:14:12.461Z","updated_at":"2024-11-21T17:14:13.144Z","avatar_url":"https://github.com/jtanza.png","language":"Java","readme":"# Rufus\n\nRufus is a free, open-source web based RSS reader, designed to be both simple and fast. It can be built and managed locally following the instructions below, or accessed at the [public instance](http://rufus.news/). Rufus is written in Java atop [Dropwizard](http://www.dropwizard.io/). The frontend is vanilla javascript, with the help of [Mustache](https://mustache.github.io/) [and others](/src/main/resources/app/dependencies).\n\n### Building\n\nThe project is packaged with Maven and is built as a fat jar. \nOnce the jar is built, it is possible to both initialize the database and start the HTTP server with the snapshot jar and the Dropwizard `db` and `server` commands. These steps are covered below. \n\n1) Clone the repo.\n\n`$ git clone https://github.com/jtanza/rufus.git \u0026\u0026 cd rufus`\n\n2) Set the JWT hash. \n\nRufus uses JWT for creating access tokens for user claims. The server key is read as an environment variable `(JWT_SECRET)` and must be set prior to server startup. For convenience, a hash can be generated with bash/md5 and set directly.\n\n`$ export JWT_SECRET=$(echo -n a_super_secret_password | md5)`\n\n3) Package the project.\n\n`$ mvn package`\n\n4) Configure the H2 database.\n\n`$ java -jar target/rufus-1.0-SNAPSHOT.jar db migrate config.yml`\n\n5) Start the server. \n\n`$ java -jar target/rufus-1.0-SNAPSHOT.jar server config.yml`\n\nEt voila, you're done, enjoy!\n\n(Once the application is up it will be listening on port `8080` and can be accessed in the browser at `localhost:8080`.)\n\nP.S. On all subsequent launches (barring any including database migrations) it is simply enough to run the `./launch` script to start the application.\n\n### Overview \u0026 Getting Started\nRufus leverages the [ROME](https://rometools.github.io/rome/) framework to parse user's syndication feeds for use throughout the rest of the application.\n\nThe application operates on both anonymous and authenticated user sessions. Anonymous sessions return data from a predefined collection of 'public' RSS feeds. \n\nSyndication feeds (`Source`s internally) are displayed as `Article`s on the frontend. After initial load, articles are cached internally with a short TTL as a trade-off on application speed/ real-time source updates. Most all feed processing logic (download, parsing, aggregation etc.) is contained within the [FeedProcessor](/src/main/java/com/tanza/rufus/feed/FeedProcessorImpl.java). All user facing article functionality is grouped within the [ArticleResource](/src/main/java/com/tanza/rufus/resources/ArticleResource.java) and exposed through requests at `/api/articles/*`\n\nAlso, please note that this project is still under development and as such much functionality may be currently broken/ missing. Below there is a small list of todo items I plan on implementing as quickly as possible (:\n\n### Database\n\nRufus uses H2 and JDBI on the persistence layer. If user's wish to inspect the contents of the application's database, it is as simple as downloading the H2 jar/zip and launching the shell console (H2 also supports a browser console, which is not covered here). \n\nAssuming the user has setup the application following the build instructions above, the H2 database will have been automatically created and initiated with the requisite schema in the `/target` subdirectory. Below are some instructions on setting up the H2 console. \n\nDownload the zip from H2, and unzip to bin or wherever you see fit. \n\n`$ unzip h2-2017-06-10.zip -d destination_dir`\n\nAfter unpackaging, launch the shell console. (Be sure to update paths to the H2 jar and the rufus directory below).\n\n```\n$ java -cp ~/bin/h2/bin/h2*.jar org.h2.tools.Shell -url \"jdbc:h2:~/path_to_rufus/target/rufusdb\" -driver \"org.h2.Driver\" -user \"\" -password \"\"\n\nWelcome to H2 Shell 1.4.196 (2017-06-10)\nExit with Ctrl+C\nCommands are case insensitive; SQL statements end with ';'\nhelp or ?      Display this help\nlist           Toggle result list / stack trace mode\nmaxwidth       Set maximum column width (default is 100)\nautocommit     Enable or disable autocommit\nhistory        Show the last 20 statements\nquit or exit   Close the connection and exit\n\nsql\u003e SHOW TABLES;\n\nTABLE_NAME            | TABLE_SCHEMA\nARTICLES              | PUBLIC\nDATABASECHANGELOG     | PUBLIC\nDATABASECHANGELOGLOCK | PUBLIC\nPUBLICSOURCES         | PUBLIC\nRUFUSUSER             | PUBLIC\nSOURCES               | PUBLIC\n(6 rows, 32 ms)\n\nsql\u003e\n```\n\n### API\nMost endpoints return articles as HTML straight from the server for consumption on the client. However, if JSON is desired, once can simply ask for it.\n\nas HTML\n\n```\n$ curl -i http://localhost:8080/api/articles/frontpage\n\nHTTP/1.1 200 OK\nDate: Thu, 28 Dec 2017 00:44:53 GMT\nContent-Type: text/html\nVary: Accept-Encoding\nTransfer-Encoding: chunked\n\n\u003cdiv class=\"eight columns\" id=https://www.wired.com/story/most-read-wired-business-stories-2017\u003e\n   \u003cdiv class=\"article-content\"\u003e\n      \u003cdiv class=\"title\"\u003e\n         \u003ch6\u003e\u003ca href=https://www.wired.com/story/most-read-wired-business-stories-2017\u003eWIRED Business Stories of 2017\u003c/a\u003e\u003c/h6\u003e\n      \u003c/div\u003e\n      \u003cdiv class=\"description\"\u003e\n         \u003cp\u003eThe future of jobs weighed heavy on everyone\u0026#39;s minds\u003c/p\u003e\n      \u003c/div\u003e\n   \u003c/div\u003e\n\u003c/div\u003e\n```\nas JSON\n```\n$ curl -i -H \"Accept: application/json\" http://localhost:8080/api/articles/frontpage\n\nHTTP/1.1 200 OK\nDate: Wed, 27 Dec 2017 23:36:51 GMT\nContent-Type: application/json\nVary: Accept-Encoding\nContent-Length: 6503\n\n{\"articles\":[{\"title\":\"The Most-read WIRED Business Stories of 2017\",\"publicationDate\":\"15:00 PM UTC - 12/27/2017\",\"authors\":[\"Andrea Valdez\"],\"description\":\"The future of jobs weighed heavy on everyone's minds.\",\"url\":\"https://www.wired.com/story/most-read-wired-business-stories-2017\",\"channelTitle\":\"Wired\",\"channelUrl\":\"https://www.wired.com\",\"bookmark\":false}, ...\n```\n\n### Todos\n* HTTPS on the public instance.\n* OPML import/export.\n* Pagination of endpoints returning article collections.\n* Cache investigation, i.e. is non real-time article feed updates preferable?\n* Add \"bookmarking\" functionality on frontend. Endpoints and data services are complete on the backend, but lack the frontend access.\n* Add options to add and view collection tags on the frontend. Again, endpoints and data services for the functionality is complete on the backend yet lack the client integration. \n* User management\n  * password recovery.\n  * username updates.\n  * etc.\n* [Mark articles as read.](https://github.com/jtanza/rufus/issues/2)\n* Make things generally _better_ on the frontend. I am unfortunately not a frontend developer and may have leveraged one or more js hacks than is generally advisable (:\n\n### Bugs/ Contributing\nContributions are welcome, and would be greatly appreciated on the frontend side of things! (refer to the todos above if looking for something to tackle).\n\nFeel free to shoot me an email about any questions or bugs that you come across @ tanzajohn@gmail.com\n\n### License\nRufus is [MIT](https://github.com/jtanza/rufus/blob/master/LICENSE.txt) licensed.\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjtanza%2Frufus","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjtanza%2Frufus","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjtanza%2Frufus/lists"}