# The Stack Overflow Unofficial Patch (SOUP)

The Stack Overflow Unofficial Patch (SOUP) is a project to collect various minor client-side bug fixes, work-arounds and usability improvements for Stack Overflow and other Q&A sites on the Stack Exchange Network into a single user script.

The intent of SOUP is not to make any substantial or controversial changes to the Stack Exchange user interface, but to fix minor problems and omissions that the SE developers have overlooked or haven't got around to fixing yet. By combining these minor patches into a single user script, they become easier to install and maintain.

## Installing

The easiest way to install SOUP is to use the Greasemonkey (for Firefox) or Tampermonkey (for Chrome) extension for managing user scripts. (Other similar extensions, like Scriptish or NinjaKit, should also work.) After installing the extension, clicking the "download / install" button below should bring up a dialog asking you if you want to install SOUP. Answer "yes".

View source / GitHub repo / Stack Apps post

The "install" link above is for the stable branch of SOUP. If you like living on the edge, you can also install the development version, which gets all the latest fixes and updates as soon as they're written. Of course, it also gets all the latest bugs, too. If you do install the development version, please report any bugs or regressions you may find in it below!

SOUP can also be used on other browsers with compatible user script support, such as Opera or Safari. For detailed instructions on how to enable and install user scripts on different browsers, see the "script" tag wiki on Stack Apps.

Notes:

• When installing SOUP on Opera, please remove the ".user" part from the file name to disable Greasemonkey compatibility mode. While SOUP can run in either native or compatibility mode, a few MathJax-related fixes require native mode.

• SOUP has not yet been tested on Safari, but in principle it should work. If you do try to use it, please let me know how / if it works.

## Included fixes

SOUP v1.30 includes fixes or workarounds for the following issues:

### CSS-only fixes

These are pure CSS fixes. They will be applied even if JavaScript is disabled on the site.

### Site-specific CSS fixes

These pure CSS fixes are for issues specific to certain sites on the Stack Exchange network. Most of them are restricted to the affected site(s), but a few are applied globally, even though the issue they fix is only apparent on some sites.

### Chat-only fixes

These fixes apply only to the Stack Exchange Network chat.

### Site-specific fixes

These non-CSS fixes are applied only on specific SE sites. There's a lot fewer of these, since the SE JavaScript framework is shared between all sites, whereas CSS is different for each site. Thus, these fixes generally involve either rare site-specific customizations, or simply design fixes that cannot be implemented in pure CSS.

### HTTPS-only fixes

These fixes are only applied when using Stack Exchange over HTTPS. Note that HTTPS support for Stack Exchange is still experimental.

### MathJax-related fixes:

These fixes apply only to sites using MathJax for LaTeX math rendering.

In addition, permission is given to Stack Exchange, Inc. to make use of SOUP code in any way they see fit, including but not limited to incorporating all or parts of it within the Stack Exchange codebase, with or without credit.

This SOUP version includes a copy of the punycode.js library v1.2.4 by Mathias Bynens, distributed under the MIT license. The additional permissions granted above do not apply to this library.

## Credits

SOUP is currently maintained by Ilmari Karonen. Some of the fixes are based on suggestions or earlier user scripts made by others; see the source code and/or the meta.SO links above for details.

## Contributing

If you know a user script or stylesheet patch for SO or other SE sites that would be suitable for inclusion in SOUP, or an unfixed issue that you believe might be worth patching, please let me know (e.g. by posting a comment or an answer the SOUP page on Stack Apps).

If you'd like to help me out by contributing new fixes directly to SOUP, the SOUP wiki on GitHub has some useful tips. Any and all contributions will be appreciated!

-
After I install it, I can't see what have changed. Do we have a GUI panel so that I can turn on and off features? –  Ooker Feb 6 at 3:16
No, there currently isn't any control panel. I've thought of having one, and the code is structured to sort of support it, but so far it's been a fairly low priority for me. If you're just curious and want to see what the different fixes do, you can always click the links above: most of the linked bug reports / feature requests include instructions for reproducing the bug. Try it with SOUP on and off, and compare the behavior. (And if you find some cases where there no longer is any difference, please do tell me; it's been a while since I last did that myself.) –  Ilmari Karonen Feb 6 at 10:24
Wow, i just have dug your GitHub and very impressed that you maintain and even write wikis. Have you think about make a Trello board for easier to maintain the script? An example of HabitRPG using Trello –  Ooker Feb 6 at 11:45

# Feature requests

Know a fix that should be included in SOUP (or an issue that could be fixed)? List it here.

### Future plans

Plans for the long-term future of SOUP 2.0:

• Break up the monolithic SOUP.user.js file into multiple files, separating the actual fixes from the framework and metadata. Use a (Perl?) build script to assemble the pieces into the actual (minified?) user script file.

• Build native browser extensions for Chrome and Firefox (and other browsers?) and distribute these through th appropriate official channels.

• Create a UI to allow individual fixes to be toggled on and off at will (and maybe allow user-tweakable parameters for fixes)?

These issues might be fixed in a future SOUP 1.x release, but need some work first:

### Declined:

These issues are out of scope for SOUP, or cannot be easily fixed:

### Proposed:

Feel free to add new proposals here.

-
@DavideCervone: Thanks! Has the "disable noerrors extension while editing" thing even been feature-requested on meta? And if not, would you mind doing that so I'll have a request to link to? –  Ilmari Karonen Jan 19 '14 at 20:06
@IlmariKaronen, OK, I've posted this question concerning the noErrors extension. –  Davide Cervone Jan 19 '14 at 21:58
@IlmariKaronen, you may also want to call your MathJax reset function (I forget the exact name) in the Begin Process message handler, so that the definitions will be reset for each typeset pass (i.e., the definitions from the previous typeset will not be in effect for the next typeset). –  Davide Cervone Jan 19 '14 at 22:06
@DavideCervone: I already do that. However, I just realized that my earlier code had a race condition bug: it would break if the begingroup extension didn't get loaded before the initial typeset pass began. This never seemed to happen on Chrome, but it happens very often in Firefox. I've fixed it now, though. –  Ilmari Karonen Jan 20 '14 at 8:59
@DavideCervone: Also, I got your fixes working in the devel branch, but I have something slightly more ambitious yet in mind: making \labels in separate posts completely independent of each other. I think I know how to do this (it involves changing the formatID function), but the race condition bug mentioned above messed up my testing of it yesterday. –  Ilmari Karonen Jan 20 '14 at 9:03
@IlmariKaronen, nice solution to the begingroup issue. I'll be interested in your solution to the label problem. –  Davide Cervone Jan 20 '14 at 13:13
@DavideCervone: Just FYI, I've been a bit slow with getting the improved \label fix done, so decided to just release SOUP v1.4 with your original fixes. I'm planning to get the improved fix done for v1.6. –  Ilmari Karonen Jan 24 '14 at 21:22
I had this idea for the new Android app but it applies to the browser version of SE, too. Is it possible to disable the preemptive compilation MathJax does and instead compile only when the user clicks on a piece of math? (On my Mini PC with an Atom Dxxx, long math-heady posts load a long time.) I guess that won't be exactly "consensus" for this here fix, but it may be an option for the proposed turning-off feature (with GUI?). –  Raphael Jan 29 '14 at 18:55
@Raphael: That is doable, yes. (The trick is to use @run-at document-start to inject a custom MathJax config script before MathJax loads, just like SOUP does for the \newcommand fix.) It not something I'd consider suitable for SOUP, but I'll add it to my list of possible ideas for new user scripts. Thanks! –  Ilmari Karonen Jan 29 '14 at 20:47
I'm not sure if that's feasible, but moving discussions to chat would be great. The script would have to a) create a new chatroom, b) copy (selected) comments there and c) delete comments. –  Raphael Jul 3 '14 at 11:01
@Raphael: Unless there's some way to hook into the existing comment migration feature (and I kind of doubt it, since it seems like it'd be a security hole), step c would have to be mod-only. And I'm not a mod on any SE site, so I can't really develop and test it myself. (There was one mod-only fix in SOUP once, but it was mostly developed by Manishearth, who is a mod.) That said, if somebody does come up with a nice and working user script to do that, I'd be glad to steal it for SOUP. –  Ilmari Karonen Jul 3 '14 at 11:12
@AstroCB: Thanks! A fix for mse266852: Bar between “add a comment” and “show more comments” is inconsistent, loosely based on your script, is now included in the just released SOUP v1.20. –  Ilmari Karonen Jul 28 '14 at 14:07
@IlmariKaronen Great: thanks. It doesn't appear to be getting much traction over at MSO, so I don't see it happening officially anytime soon. –  AstroCB Jul 28 '14 at 14:09
Regarding comment management: bulk operations might be doable by userscript? –  Raphael Aug 14 '14 at 20:00
@Raphael: Probably, but you'll need to find a mod with userscript skills to code and test it. I know there are a bunch, so it's doable, and I'd probably be happy to, ahem, borrow the code for SOUP if someone does write it (and it doesn't break the existing interface or have any other obvious issues, of course). –  Ilmari Karonen Aug 17 '14 at 19:30

# Known bugs

• Markdown editor hooks (e.g. mse224533, math11392, boardgames1152, french347) sometimes fail to run on Opera, apparently due to a race condition where the editor gets initialized before SOUP has a chance to add the hook. Reloading the edit page usually fixes the problem.

• The kluge used to monitor WebSocket messages on SE chat doesn't seem to work on Opera, so SOUP falls back to polling for changes at ½ second intervals. This works, but is less efficient.

• SOUP does not work (at all) on Scriptish 0.1.11, because document.documentElement is not available at document-start. Apparently, this is a bug in Scriptish that has been fixed in Scriptish 0.1.12, but that version was never properly approved for distribution on addons.mozilla.org.

• The new mse154788 / stats1987 fix in SOUP v1.22 may sometimes add spurious scroll bars to comments on Chrome. This should hopefully be fixed in SOUP v1.24, but since I can't personally reproduce the bug, and since the underlying cause is uncertain (I suspect a bug in Chrome), it's hard to be sure. If it still happens for you, please let me know!

• MathJax config fixes sometimes don't get applied on Chrome, apparently due to a race condition. Reloading the page usually fixes it. Investigating.

# Bug reports

This includes any unwanted side effects or regressions due to changes in the SE codebase.

-

# Change log

This is a list of new fixes and other changes made to SOUP during its continued development.

SOUP version numbering generally follows the major.minor.patch scheme. Odd minor versions (1.1.x, 1.3.x, 1.5.x, etc.) are reserved for unstable development versions ("devel" branch on GitHub), while even ones denote stable releases ("master" branch on GitHub). The change log below thus only includes even version numbers, as changes between development versions are too numerous to list.

# 1.30 (22 Jun 2015)

This is another late I-forgot-to-release-this-earlier version. :( I've been quite busy since spring and haven't had much time to work on SOUP much, and the big SE redesign earlier this year made too many things into moving targets. Anyway, all these fixes have been in the devel branch for several months, so at least they should be thoroughly tested. :)

My future plans involve doing another big testing session to see which old fixes can be safely removed, now that the new design has mostly stabilized, in preparation for SOUP v2.0. (This is somewhat complicated by the fact that some of the issue have only been fixed partially.) The 2.0 version, planned for sometime in August or September, will feature a more modular design, with the actual user script being built from many individual scriptlet files. This should hopefully simplify editing and contributing new fixes, and also allow e.g. compiling SOUP into a stand-alone Chrome / Firefox extension.

New fixes in 1.30.0:

Other changes:

• Improved the mse154788 fix by adding word-wrap: break-word to comment styles; this should avoid the need for scroll bars in many cases.

# 1.28 (3 Feb 2015)

This version mainly features some older styling fixes that didn't make it into 1.26, released in preparation for a bunch of new fixes involving the Stack Overflow redesign.

New fixes in 1.28.0:

Other changes:

• Tweaked the mse227975 fix to look better on the new login page.
• Tweaked comment body padding for mse154788 to avoid link underlines sometimes being hidden on meta.SO.

Changes in 1.28.1 (17 Mar 2015):

• Fixed beta site detection after SE design change.

Changes in 1.28.2 (10 Apr 2015):

# 1.26 (10 Dec 2014)

It's been a while since the last stable release, again. I'd been meaning to carry out more systematic browser compatibility and regression testing before the next release, and to find and prune away fixes that may have become unnecessary, but I never got around to finishing that. However, I've been using the devel version myself on both Firefox and Chrome long enough that I can probably consider it pretty well tested by now. Opera compatibility is currently untested; if you're using SOUP on Opera and find any issues with it, please let me know!

Most of the changes in this version are back-end tweaks meant to improve performance and stability. I've also partially rewritten the README page, and started documenting the SOUP internal structure and API at the SOUP wiki on GitHub to make third-party contributions easier. Any feedback is welcome!

New fixes in 1.26.0:

Removed fixes:

Other changes:

• Content filters are now applied to new comments loaded via Ajax.
• Made the content filter mechanism more flexible, so that filters can be made to run only on specific events.
• Made Ajax hooks run immediately by default to minimize flicker; let's see if this breaks anything...
• Content filters are now applied to answers loaded in review by the mse172931 fix.
• New utility function SOUP.hookChat() for monitoring chat events.
• Chat content filters now use the page visibility API to only run in active tabs.
• Removed unused SOUP.requestAnimationFrame() compatibility wrapper.
• The fix list in README.md is now grouped into sections, just like in the source.
• The license section now contains an explicit "do whatever you want" license grant to SE, Inc. in addition to the general ISC license.
• Various other README.md changes, including a direct install link for the devel branch and a link to the SOUP wiki on GitHub.

New fixes in 1.26.1:

This is a quick single-fix releast for the math.SE moderator election.

Changes in 1.26.2:

• Fixed a silly SOUP bug causing JS fixes to run before DOM was fully loaded on some browsers.

Changes in 1.26.3:

• The mse217779 spoiler fix no longer breaks clicking the spoiler to toggle visibility.

# 1.24 (7 Oct 2014)

A relatively fast-track release for mse240485 and mse240486, which both involve loss of UI functionality. Also includes a couple of new lower priority fixes, and one internal fix to a SOUP-induced UI regression on Chrome.

Changes in 1.24.2:

Changes in 1.24.1:

• Removed the mse240553 fix added in 1.24.0, as it's no longer needed.

New fixes in 1.24.0:

Removed fixes:

Other changes:

# 1.22 (15 Sep 2014)

This is just an incremental release to push out a few updates that missed v1.20 and were stuck in the devel branch. More active development may or may not resume later in the year. As always, contributions are welcome.

New fixes in 1.22.0:

Other changes:

• Improved and simplified the stats1987 fix by using max-width instead of table-layout: fixed. This fixes a minor layout issue with large vote counts and adds scroll bars to over-wide comments.
• Added release dates to change log. Trying out short release notes as well.
• Added @homepageURL, @copyright and @license metadata lines.

# 1.20 (28 Jul 2014)

New fixes in 1.20.0:

Removed fixes:

Other changes:

• SOUP now hooks the WebSocket interface to detect chat events instead of polling for them.
• mse229363: Hot question titles from the Aviation and Puzzling sites are now eligible for MathJax parsing.

# 1.18 (5 Jul 2014)

New fixes in 1.18.0:

Other changes:

• The sidebar question score wrap fix (mse229751) is split into a global part and a site-specific part.
• The mobile link cursor fix (mse108046) is applied to all links without name attributes.
• The HTTPS link rewrite fix (mse221304) is now applied also to chat and area51 links.
• Content filters now work properly on chat (using brute-force 0.5s interval polling, since there's no proper hook for chat updates).
• SOUP.isChat() and SOUP.isMeta() are now set already during early setup.
• Devel branch versions should now auto-update properly (and not just when a new master release is made).
• Update checking is optimized by duplicating the script metadata in SOUP.meta.js and pointing @updateURL to it instead of the main script.

# 1.16 (26 Jun 2014)

Changes in 1.16.1:

• The mse229759 fix has been made redundant, only a few hours after v1.16.0 was released.

New fixes in 1.16.0:

Other changes:

• The mse230607 fix is no longer needed, and has been removed.
• The mse224628 fix is no longer relevant, since the 10k flag review page no longer exists; the code has been adapted for mse115702 instead.
• mse229363: MathJax is now also parsed in hot question titles from earthscience.SE.
• The math12803 fix is now split into two parts, of which one is math.SE specific and the other is applied on all sites.
• The mse215473 styles are no longer incorrectly applied to links in popups created from the post menu.
• Fixes can now run scripts early, before the document loads, by specifying them with the early property. Note that jQuery is typically not yet available at that stage.
• New SOUP.addContentFilter() utility method to simplify fixes that manipulate post content.
• Fancy new icon.

# 1.14 (11 May 2014)

Changes in 1.14.1:

• The mse230607 fix is now applied on academia.SE too.

New fixes in 1.14.0:

Other changes:

# 1.12 (15 Apr 2014)

New fixes in 1.12.0:

Other changes:

# 1.10 (10 Mar 2014)

Changes in 1.10.2:

• Removed workplace2437 CSS fix, no longer needed.
• The fix for mse223866 caused a formatting regression for moderators, rewrote the code to be more careful. (Thanks, Monica Cellio!)

Changes in 1.10.1:

• Fixed minor issue with stats1987 causing vote counts on self-posted comments to be misaligned. (Thanks, Jonathan Hobbs!)

New fixes in 1.10.0:

Other changes:

• JS fixes are now isolated from each other, one fix failing will no longer break others.
• New utility function SOUP.forEachTextNode() for easier page text manipulation.
• New SOUP.userRep, SOUP.isBeta and SOUP.isMeta properties for user privilege checking.
• Bugfix: SOUP no longer leaks variable or runs outside the SE network on Opera.

# 1.8 (24 Feb 2014)

Changes in 1.8.3:

• The fix for mse160338 is no longer needed, and has been removed. (Thanks, Manish!)

Changes in 1.8.2:

• The fix for mse150069 is no longer needed, and has been removed.

Changes in 1.8.1:

• The fix for mse212372 is no longer needed, and has been removed.
• The fix for mse104184 is no longer applied in the mobile view; see this feature request for details.
• The README Markdown has been simplified for better compatibility between GitHub, StackApps and UserScripts.org.

New fixes in 1.8.0:

Other changes:

• The code has been reorganized into self-contained modules, each corresponding to one bugfix / workaround. Currently, this has little effect on functionality, but it could be used e.g. to allow toggling individual fixes on/off.
• Utility functions like hookAjax() are now contained in a page-global SOUP object.
• A new SOUP.hookEditPreview() utility function has been added to allow easier editing fixes.
• CSS fixes are now injected before the document is loaded, reducing the risk of "flickering". As a side effect, a few selectors had to be adjusted to increase their specificity over conflicting SE default styles.
• Added a change log, with retroactive logging for earlier releases.

# 1.6 (10 Feb 2014)

Changes in 1.6.1:

New fixes in 1.6.0:

# 1.4 (24 Jan 2014)

New fixes in 1.4.0:

# 1.2 (17 Jan 2014)

New fixes in 1.2.0:

# 1.0 (12 Jan 2014)

Fixes included in the 1.0.x branch:

-