# Stack Overflow Unofficial Patch

The Stack Overflow Unofficial Patch (SOUP) is a project to collect various minor client-side bugfixes, 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 / StackApps post / UserScripts.org

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 StackApps.

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.8.1 includes fixes or workarounds for the following issues:

Notes:

• CSS: This is a pure CSS fix. It will be applied even if site JavaScript is disabled.
• chat: This fix applies to the Stack Exchange Network chat.
• 10k: This fix applies to the "moderator tools" interface available to users with 10,000+ rep (2,000+ on beta sites).
• math: This fix applies only to sites using MathJax for LaTeX math rendering.

## Credits

SOUP is currently maintained by Ilmari Karonen. Several 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 StackApps).

To be included in SOUP, a patch should:

• address a known unfixed issue: If you find a new interface bug on SO, please report it on MSO first, and give the devs some time to fix it. There's no hard limit on this, but there's not much point in patching something via SOUP if it's going to be fixed by the devs in a few minutes / hours / days anyway.

• be simple and fast: The mean length of individual patches in SOUP (excluding shared infrastructure) is currently around three lines of code. If adding a new patch would significantly increase the length of SOUP, cause a noticeable performance impact or introduce a significant external dependency (e.g. new syntax highlighting rules), it's probably not suitable.

• be uncontroversial: SOUP is intended to be a "least common denominator" patch set for everyone. While a simple [status-declined] doesn't necessarily disqualify an issue from being included in SOUP (sometimes it just means the devs are feeling lazy ;-), if a substantial number of people say they don't want it, it doesn't go in. In particular, patches that add significant new functionality, significantly change the appearance of the site or repaint the bikeshed are not suitable for SOUP.

• be safe and unobtrusive: This goes with the above points: if any patch in SOUP turns out to cause undesirable side effects (including usability or performance issues) on some platforms, it should be either fixed or removed.

If you notice that any fix included in SOUP is not working for you, causes undesirable side effects or has become obsolete (e.g. because the bug it's working around was fixed), please let me know!

-

# Bug reports

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

-

# Feature requests

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

### Scheduled for next release

These fixes have been or will soon be added to the development branch, and will be included in the next stable release:

These issues might be fixed in a future 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 at 20:06
@IlmariKaronen, OK, I've posted this question concerning the noErrors extension. –  Davide Cervone Jan 19 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 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 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 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 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 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 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 at 20:47

# 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.8

Changes in 1.8.3:

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

Changes in 1.8.2:

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

Changes in 1.8.1:

• The fix for mso212372 is no longer needed, and has been removed.
• The fix for mso104184 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

Changes in 1.6.1:

New fixes in 1.6.0:

# 1.4

New fixes in 1.4.0:

# 1.2

New fixes in 1.2.0:

# 1.0

Fixes included in the 1.0.x branch:

-