Skip to content
Enhanced Social Tagging for Academic Communities
Ruby HTML JavaScript CSS Other
Branch: dev
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Type Name Latest commit message Commit time
Failed to load latest commit information.
app Merge pull request #68 from berkmancenter/travisy-it Sep 17, 2019
bin Upgrade to Ruby 2.4.1, Rails 5.1, and upgrade gem dependencies Jun 6, 2018
config Add Travis support Sep 17, 2019
db Get tests running, with coverage report Jul 25, 2019
doc Reflect migration to sidekiq in setup documentation Oct 26, 2016
docker Add Travis support Sep 17, 2019
lib Large chunk of work on tag filter refactoring. Aug 9, 2018
public added supplemental rules per issue 3739 Jul 18, 2019
script fix sidekiq job queues Dec 3, 2014
solr Fix issues with Solr configuration files Apr 24, 2018
spec Fix specs Sep 25, 2019
.env.development Add dev environment reCAPTCHA keys Jul 18, 2019
.gitignore Prevent bookmarkers from seeing HTML settings page Jul 31, 2019
.haml-lint.yml Convert ERB views to Haml Mar 2, 2017
.rspec Upgrade TagTeam to Rails 4.0 Feb 7, 2017
.rubocop.yml Update RuboCop configuration Jun 26, 2018
.travis.yml Add Travis support Sep 17, 2019
Gemfile Update feed-abstract gem Sep 16, 2019
Gemfile.lock Update feed-abstract gem Sep 16, 2019
LICENSE adding AGPL license file Jul 18, 2019
README.rdoc Add Travis support Sep 17, 2019
Rakefile Lint Rakefile Feb 16, 2017 Lint Feb 16, 2017


Build Status


TagTeam is an RSS / Atom / RDF aggregator with the ability to filter and remix its input feeds with a high degree of flexibility.

Items can be added directly to TagTeam “bookmarking collections” via the provided delicious-like bookmarklet, and these items can be remixed and filtered like any other item.

TagTeam can aggregate content from anything that emits RSS, Atom, or RDF. This includes delicious, zotero, WordPress, twitter, mediawiki, connotea, blogger, github, and too many other applications and services to mention. It uses the feed-abstract gem, written as part of this project to create a better way of dealing with structured feeds. feed-abstract understands some generators and does magical things - like turning twitter hashtags into actual tags on aggregated items.

TagTeam can import Delicious and Connotea backups directly into a bookmark collection, and will support more formats soon.

Remixed feeds are available as RSS 2.0, Atom, and jsonp output and can be viewed directly in a hub. Feeds, FeedItems, and Tags can be added and removed from a Remixed feed contextually within the application.

Tag filters can be applied at different levels to allow hub owners to maintain a consistent collection of tags - you can take messy tags in and give clean tags out.

TagTeam can be many things to many people, allowing you to ignore or utilize its many features depending on what you need. Examples:

  • It can aggregate RSS feeds and simply give you a Planet-like collection of items from many sources,

  • It can be your own delicious-like bookmarking platform,

  • It can help you find items via its built-in search engine and through its support of “more like this” queries,

  • It can be a delivery platform to enable you to aggregate content and updates from all over your enterprise and all over the web as jsonp for use in web apps,

  • It can collect data about the input sources you watch (as it keeps detailed changelogs of all content it collects) for later analysis,

  • It can be a permanent archive of anything that emits formats TagTeam understands.

System Requirements

  • A 'nix hosting environment,

  • postgres - though mysql should work with minimal changes, it's just not tested,

  • redis - for resque background job processing,

  • java - for sunspot fulltext searching. This has been tested under openjdk-6-jre on multiple flavors of ubuntu,

  • ruby 2.4.1

  • wget


TagTeam is a fairly traditional rails 5.0 app that needs a java daemon and redis for job tracking / management.

  • Install all system requirements (above).

    • Redis is really only being used as a job queue, so configuring it to write to disk isn't all that necessary.

    • If you get an installation failure related to openssl on OS X: +rvm install 2.4.1 –with-openssl-dir=/usr/local/opt/openssl+.

    • If you're using rvm, create a gemset to hold this application's gem environment

  • +git clone tagteam && cd tagteam && bundle+

  • Review config files:

    • config/environments/production.rb: configure email delivery if “sendmail” isn't good enough.

    • config/initializers/devise.rb: Check values, especially pepper and mailer_sender.

  • Set up .yml configs:

    • +cp config/sunspot.yml.example config/sunspot.yml+

    • +cp config/tagteam.yml.example config/tagteam.yml+

    • +cp config/database.yml.example config/database.yml+ and set it up to connect to your postgres database.

  • `cp .env.development .env` and alter it as needed for your environment.

  • Make sure sunspot is running all on the same port in sunspot.yml and solr/conf/scripts.conf or else the test suite will not run.

  • +export RAILS_ENV=production+

  • Set up databases and docs via +rake db:setup && rake db:migrate && rake db:seed+

  • +rake sunspot:solr:start+

  • Start sidekiq (+bundle exec sidekiq+) to run scheduled tasks

To run with `RAILS_ENV=production` on localhost

  • Add +config.serve_static_assets = true+ to config/production.rb

  • Comment out the lines with force_ssl in config/production.rb

    • _Remove both of the above before git push._

  • Install yarn

  • +rake assets:precompile+

  • In config/sunspot.yml, change the production solr path to /solr/default.

  • redis-server

  • +rake sunspot:solr:start+

  • +bundle exec sidekiq+

  • +RAILS_ENV=production rails s+




The only thing you need is Docker ( and +Docker Compose+ (

  • Install Docker and Docker Compose

  • Run +docker-compose up+ and wait until it sets up everything

  • The app will be available on localhost:3000


Most of TagTeam is action cached for non-authenticated users, and sometimes for users without administrative rights. The default cache time is 15 minutes, and the file-based cache is expired via the cron jobs articulated above. Feel free to switch the caching backend, but honestly if you're not clustering and have a moderately fast disk subsystem there's almost no point. “rake tmp:clear” can be your cache-clearing sledgehammer, of course.

Architectural Overview

  • A Hub is the highest level of organization. It has many HubFeeds, HubTagFilters, and RepublishedFeeds. It also has many Feeds and FeedItems through these other relationships.

  • A HubFeed links a Hub and a Feed together, giving a Hub owner the ability to override the title and description for a Feed but only in this Hub.

  • A HubFeed has many FeedItems through the Feed it relates to. A HubFeed also has many HubFeedTagFilters. A HubFeed can be a bookmarking feed, which means it doesn't have an actual RSS/Atom feed that it's aggregating, it only serves to group items added via the Bookmarklet or by a direct import.

  • A Feed is an actual RSS or Atom feed that we're aggregating and is unique to this entire TagTeam instance. Feed spidering events are tracked in a FeedRetrieval model. A Feed can be an InputSource for a RepublishedFeed.

  • A FeedItem belongs to many Feeds and is tracked in the changelog YAML contained in a FeedRetrieval where appropriate. It can serve as an InputSource for a RepublishedFeed. It can also have HubFeedItemTagFilters.

  • A Tag is provided by the ActsAsTaggableOn::Tag class and is related to a FeedItem through an ActsAsTaggableOn::Tagging relation. It can be an InputSource in a RepublishedFeed. It also serves as the sources used in the Hub, FeedItem, and Feed TagFilter classes.

  • A RepublishedFeed is a “remix” - it aggregates together InputSources (Feeds, FeedItems, and Tags) as defined by a Hub owner.

More info can be found in the rdoc-generated API docs (check out this repo and run “rake doc:app”) and in the doc/ddl.png graphical schema overview.


  • Add more InputSources for remixing, including searches, hubs, and remixed feeds,

  • Create a bookmarklet / chrome extension to streamline adding autodiscovered feeds from around the web,

  • Make TagTeam more social, exercising the excellent ACL9 framework for rights delegation,

  • Expose more of Sunspot's capabilities in the frontend search interface,

  • Add more Tagteam::Importer subclasses to support more import file types,

  • Improve the UI to make the features more obvious,

  • Improve the API to allow objects to be managed via xml/json,

  • Better API docs.



  • Dan Collis-Puro - everything technical

  • Peter Suber - the concept


TagTeam is licensed under the AGPL


2016 President and Fellows of Harvard College

Performance Monitoring

You can’t perform that action at this time.