AO3 News

Post Header

2022-08-18 08:55:30 UTC

Over the last few months, we introduced a couple of new features, like a revamped tag search and the ability to block users (which currently prevents them from leaving comments on your works or replying to your comments). We also provided the Policy & Abuse team with some new tools in their work against harassment and abuse, fixed a whole host of bugs, and continued to optimize our code and infrastructure.

A special thank you to everyone who contributed a bug fix or improvement for the first time: Tara Rosenthal, dark-veracity, Ceithir, EchoEkhi, irrationalpie, giuxtaposition, Potpotkettle, printfn, and speckled_dragon! And thank you to Affan Rashid for alerting us to a security issue, which is now fixed.


  • Coders: agenderdanvers, Brian Austin, C.M. Carreiro, Ceithir, dark-veracity, EchoEkhi, Enigel, giuxtaposition, irrationalpie, korrien, Potpotkettle, printfn, redsummernight, Sarken, speckled_dragon, Stephen Lewis, Tara Rosenthal, ticking instant, weeklies
  • Code reviewers: Enigel, james_, redsummernight, Sarken, ticking instant
  • Testers: AmberW, CJ Record, Frost the Fox, GoldenFalls, james_, lydia-theda, Maine, mumble, Nary, Nat, Priscilla, Qem, redsummernight, Rebecca Sentance, Runt, Sarken, Teyke



Deployed on April 23. Included a tag search overhaul, changes to the abuse report form, and invisible code improvements.

  • [AO3-5830] - We greatly improved our Tag Search by letting you limit your searches to tags within in a specific fandom, allowing searches for non-canonical tags, and sorting your results.
  • [AO3-6309] - We updated the message you receive if you try to report a work on the Archive more than the allowed number of times. (Our Policy & Abuse team only need one report. Any more reports of the same issue needlessly slow them down.)
  • [AO3-6274] - Additionally, there is now a limit to the number of abuse reports one person (i.e., email address) can submit per day. (Please only report issues you encounter as part of your Archive experience, and don't specifically seek out problems for mass-reporting.)
  • [AO3-6306] - It was previously impossible to bookmark an external work if the URL in question gave a server response of 307 or 308 (i.e., a redirect). Now you can create that bookmark just fine!
  • [AO3-6305] - The entries in the "Hi, NAME!" dropdown menu, such as My Dashboard or My Works, weren't links if you were currently on that page. Now everything stays a link at all times, as is proper.
  • [AO3-5955], [AO3-5956], [AO3-6294] - We now automatically retry sending emails that fail with certain error messages. This helps keep expected errors off the Resque error page, allowing us to focus on errors we don't expect that may indicate new bugs. (An expected error would happen when, e.g., a subscriber to a work deletes their AO3 account after the work is updated but before the subscription email is sent.)
  • [AO3-6253] - We've started localizing dates in our email footers in preparation for translated emails.
  • [AO3-6330] - We updated the nokogiri gem to 1.13.4.
  • [AO3-6185] - Cleaned up some unused comment code that was still hanging around!


Deployed on May 17. Improved the search engine and gave the Policy & Abuse team some new tools.

  • [AO3-6333] - We made the code for listing comments on a work more efficient.
  • [AO3-6291] - Previously, it was possible for a work to show up on more than one page of search results, due to the way things were sorted (or not sorted) in our search index. Now we tell our search engine how to break a tie if multiple works fulfill the same search criteria, for more consistency.
  • [AO3-6315] - When bulk updating the data in our bookmark search index, only works with bookmarks were queued for reindexing. Then we found that simply queuing all works is much faster, so we're doing that now.
  • [AO3-5763] - The email notification informing you of a gift work only contained the title, creator, word count, fandom, and summary of said work. We now include all the metadata, so you're aware of any warnings or additional tags before accessing the work.
  • [AO3-5348] - Gift notifications are now translateable.
  • [AO3-6256] - To prepare for translated emails, we made sure that the word for "guests" in our kudos notifications would be displayed correctly in languages that capitalize the word.
  • [AO3-6254] - We also found that, when determining the correct verb form for the kudos notification, we were counting the number of people who have left kudos incorrectly. This doesn't matter much in English, but might affect the verb form in other languages. That's fixed now! (Note: The counts in the emails were never wrong -- this is only a grammar issue.)
  • [AO3-4313] - To fix an issue with draft chapters, we now make sure that only posted chapters are considered when showing a work in chapter-by-chapter mode.
  • [AO3-6342] - We limited which admins can set a banner, such as a downtime announcement or membership drive information.
  • [AO3-6156] - Members of the Policy & Abuse team are now able to edit user profiles.
  • [AO3-6148] - We've further restricted which admins can access the IP address associated with works and comments, and also made the email address associated with guest comments available to certain admins.
  • [AO3-6334] - To help with spam, we'd put a limit on the number of times a password reset could be requested for a given account (e.g., two requests per hour), but in some cases the restriction was preventing users from actually changing their password after making the request. We've now made sure the server can apply the limit to requesting the reset without affecting actually resetting the password.
  • [AO3-6146] - We've limited how frequently a user can change their username.
  • [AO3-6323] - We have added a class containing a user's ID to their comments, so you can create (for example) a skin that hides all comments by a specific user. (You can find detailed instructions in our post announcing comment blocking.)
  • [AO3-6214] - You previously had to select "Choose Skin" in the footer to access a list of official site skins. We now display all of the supported skins by default.
  • [AO3-6030] - Fixed a couple of bad page titles!
  • [AO3-6340] - We updated the sinatra gem from 2.1.0 to 2.2.0.


Deployed on May 30. A few things we needed to do before comment blocking.

  • [AO3-6351] - Comments from the Dawn of Time (i.e., 2009) didn't have the right data to tell them how to thread themselves. We wrote and ran a script to fix that.
  • [AO3-6325] - We added a class containing a user's ID to bookmarks (both bookmarks they created and bookmarks of their works), so you can hide those with a site skin, too.
  • [AO3-5986] - Several of our teams own AO3 accounts that they use to communicate with users on news posts. Previously, those comments were indistinguishable from those left by any other account. They now come with an "(Official)" note to show that they are indeed that.
  • [AO3-6350] - We updated Rack to
  • [AO3-6347] - Also bumped the nokogiri gem to 1.13.6.


Deployed on June 10. The first set of blocking features! 🥳

  • [AO3-6327] - You can now block other users from commenting on your works or replying to your comments elsewhere on the site.
  • [AO3-4659], [AO3-5239] - The user autocomplete on Collection Participants and Blocked User pages looked very wonky. We updated the styling for autocomplete boxes and now they're all shiny and functional on mobile.
  • [AO3-6354] - In some of our automated tests, we were using a setting that takes page elements into account even if those are hidden to the user. For more consistency, we changed this setting to ignore invisible content, which better matches the user experience.


Deployed on July 9. Fixed some issues with downloads!

  • [AO3-6200] - When logged into the orphan_account (something certain volunteers can do), it was impossible to access any work pages. It turns out this was because orphan_account has a whole lot of pseuds, which meant checking to see if orphan_account had the work bookmarked was very slow. We made that code a lot faster, which now makes the work load.
  • [AO3-6216] - In downloads, the "Inspired by:" links leading to a related work were broken if the work wasn't hosted on the Archive. Now the links point to the external work in question.
  • [AO3-5775] - We now include language information at the top of downloaded works, just like on the site itself.
  • [AO3-5709] - The author information in the metadata of a downloaded work only contained the pseud, not the username it belonged to. Now it uses the proper "Pseud (Username)" format.
  • [AO3-6346] - Appending .htm to the URLs for Archive pages (like a work or a collection) would sometimes lead to an ugly white error page (and sometimes just display the intended page). We now make sure you get a nice-looking Error 404 at least.
  • [AO3-6345] - Trying to access the admin page for a nonexistent user would cause an internal server error (500). Now the site admin gets a more helpful error 404.
  • [AO3-6159] - On the confirmation page for deleting a pseud, we previously provided incorrect information about what would happen to comments. It now correctly states that any works, series, or comments you have created under the about-to-be-deleted pseud will be transferred to your default pseud.
  • [AO3-3846] - When reordering a work's chapters, it wasn't possible to move draft chapters, because draft chapters weren't listed on that page. Now they are.
  • [AO3-2675] - When creating a site skin and choosing to add a parent skin without actually entering a parent skin, a snippet of unwanted CSS would be added to the skin. Now if you open the parent skin field, but leave it empty, we'll just quietly pretend nothing happened.
  • [AO3-5780] - We added thousands separators to all numbers on series pages (such as the number of bookmarks of that series).
  • [AO3-6339] - Updated Rails to 6.0.5.
  • [AO3-6357] - Bumped mechanize from 2.8.4 to 2.8.5.
  • [AO3-6355] - Bumped jmespath from 1.5.0 to 1.6.1.
  • [AO3-6338] - Cleaned up some unused code.
  • [AO3-6358] - We updated our Docker file to make it easier to rerun if it fails the first time.
  • [AO3-6352] - We added Content-Security-Policy: frame-ancestors 'self' to our default response headers to complement our existing X-Frame-Options header.