- Feature: Update MFR's Dockerfile to be based off of Debian Buster and install LibreOffice via
apt-get. It had been pulling down a LibreOffice .deb from LO's archive, but they only make the most
recent patch version available. This meant that the Dockerfile had to be update with every patch
release. The version in Debian Buster is v6.1.5.
- Fix: Update MFR dependencies on jinja and mistune python libraries.
- Fix: Update Dockerfile to install LibreOffice v6.1.6. v6.1.5 is no longer available from their
- Fix: Add white background to transparent .gifs to improve zooming appearance. The zooming code
keeps a copy of the image behind the zoomed version to improve performance. If the image is
transparent the actual-size copy will be visible behind the zoomed version. Making the background
opaque hides the original.
- Feature: Track when the hypothes.is sidebar is opened via Google Analytics. (thanks, @adlius!)
- Feature: Add timeouts to renderers that shell out to external processes for conversion. If a
conversion takes longer than the configured number of seconds, MFR will return an error message
instead of waiting forever. (thanks, @ExProbitasFiducia!)
- Code: Remove Rackspace cache-management tasks. MFR is now hosted on GoogleCloud, and these are no
longer needed. (thanks, @ExProbitasFiducia!)
- UPDATE: MFR is now following the CalVer (https://calver.org/) versioning scheme to match the
OSF. All new versions will use the `YY.MINOR.MICRO` format.
- Fix: Move Hypothes.is toolbar toggle button down, so that it doesn't block the pdf.js controls on
tiny mobile screens.
- Fix: Don't crash when the image exporter receives a misformatted dimensions argument.
- Fix: Show informative errors to users when a tabular file rendering action fails.
- Feature: Tell Keen analytics to strip ip on upload.
- Feature: Support the Hypothes.is annotator toolbar on pdfs and files converted to pdf. This is
not enabled by default; see `docs/integrations.rst` for instructions on enabling it. NB: the
default urls, page titles, and document ids that hypothes.is gets from the rendered document when
running in an MFR context are not very useful, so MFR will try to provide more appropriate values to
the annotator. These may not be valid for all use cases, please see the document mentioned
above for details. (h/t @jamescdavis for helping to debug a race condition in the loader!)
- Code: Don't let pytest descend into node_modules/. (thanks, @birdbrained!)
- Feature: Teach MFR to identify itself when requesting metadata from WaterButler. This will allow
WaterButler to signal to the OSF when a render or export request occurs, letting OSF tally better
metrics on file views.
- Feature: When asked to export a file in its current format, return the unmodified file instead of
complaining about the extension not having a supported exporter.
- Fix: Don't show scrollbars on videos. They should be entirely visible without scrolling.
- Fix: Render .tif files when extension is capitalized.
- Docs: Remove obsolete documentation, fix markup errors, and edit existing docs.
- Fix: Percent-encode quote characters in urls to avoid breaking some renderers.
- Fix: Brown-paper-bag release: actual change version in the code.
- Code: Pin base docker image to python:3.5-slim-jessie. 3.5-slim was recently updated to Debian
stretch, and MFR has not yet been verified to work on it.
- Fix: Render paletted pngs by converting them to RGB before saving as jpeg.
- Code: Fix flake errors unrelated to this hotfix that were causing CI failures.
- Feature: Allow settings config variables from the environment via JSON strings. (thanks,
- Fix: Explictly declare google-auth dependency needed by WaterButler.
- Fix: Upgrade WaterButler dependency to take advantage of the new Google Cloud Storage provider.
- Fix: When no exporter exists for the given extension, throw the "No supported exporter" error,
instead of the non-specific "Please try again later" error. This fixes a regression introduced
- Fix: Add a subprocess timeout to the unoconv exporter so MFR doesn't wait forever for a process
that might not complete.
- Feature: Add user-agent to tornado access logs to help identify spiders.
- Fix: Release memory consumed during csv-rendering process and force a garbage-collect cycle to
make it available for the next big render.
- Fix: Re-enable rendering for csv files.
- Fix: Temporarily disable rendering for csv files. csv continues to cause resource issues for MFR
and so will be disabled until those are resolved in another hotfix.
- Feature: Large files can now be zoomed! Images are scaled to fit the window, but clicking on the
image will show a higher-resolution version. The mousewheel or two-finger drag will zoom in up to
the maximum image size of 2400x2400px (increased from 1200x1200px). The zoomed image can be panned
around the display port by moving the mouse.
- Feature: Refuse to render tabular files (.xls, .xlsx, .csv) larger than 10Mb. Rendering these
files consumes a lot of memory and can crash MFR.
- Feature: Cached files now have the renderer that generated them appended to their names. This
allows DevOps to do more targeted cache-cleaning after a feature release.
- Fix: Make Libreoffice download mirror url configurable in the Dockerfile. The current mirror
was having difficulty serving requests for awhile. This makes it easier to switch mirrors during
times of trouble. The official mirror is working again, and MFR will continue to use that.
- Code: Update MFR to support setuptools versions greater than v30.4.0. MFR's `__version__`
declaration has moved from `mfr.__init__` to `mfr.version`. (thanks, @johnetordoff!)
- Fix: Update UNOCONV_BIN setting to reflect the default pip install path.
- Fix: Specifically install LibreOffice 22.214.171.124 and install unoconv 0.8.2.
- Feature: MFR now renders tiff files containing multiple images! The file will be exported to a
multi-page PDF, with one image per page. (thanks, @AddisonSchiller!)
- Feature: Matlab data files (.mat) are now rendered using the tabular formatter. (thanks,
- Feature: The 3D-object renderer now supports STEP (.step and .stp) files. (thanks,
- Fix: Don't send invalid payloads to MFR's metrics-tracking service. (thanks, @AddisonSchiller!)
- Fix: Don't reload the entire page when clicking on a tab header in the tabular renderer.
- Code: Upgrade Pillow dependency. (thanks, @AddisonSchiller!)
- Code: Upgrade MFR's pym.js version to latest. (thanks, @johnetordoff!)
- Code: Upgrade Codepygments dependency to get the newest code highlighters. (thanks,
- Code: Support rendering videos, PDFs, PDBs, and 3D objects in a local development environment.
- Docs: Add a guide for using MFR with the OSF via docker-compose. (thanks, @AddisonSchiller!)
- Fix: Update the Jamovi renderer to handle images with spaces in their name. (thanks,
- Feature: Add a renderer for zip files! Viewing a zip file in MFR will list the names, modified
dates, and sizes for all files in the zipball. (thanks, @johnetordoff!)
- Feature: Layered image files from Adobe Photoshop (*.psd) are now rendered by the image renderer.
- Feature: Stata dataset files (.dta) are now supported by the tabular file renderer, similar to
csv, tsv, and excel spreadsheets. (thanks, @AddisonSchiller!)
- Feature: Add a renderer for .omv files created in the Jamovi open statistical spreadsheet program.
- Feature: Add two new endpoints (/renderers and /exporters) to provide a programmatic view of MFR's
file type support. Both endpoints return a JSON object mapping extensions to the renderer or
exporter that handles them. (thanks, @johnetordoff!)
- Feature: Add a static list of supported file types (`supportedextensions.md`) to the project
repository. Includes a test to warn developers when they've failed to document a newly-added file
type. (thanks, @AddisonSchiller!)
- Feature: Add basic sandboxing to iframes. (thanks, @AddisonSchiller!)
- Fix: Update the MathJax CDN url in the IPython notebook renderer. (thanks, @AddisonSchiller!)
- Fix: Support uppercased extensions (e.g. .CSV) for tabular files. (thanks, @AddisonSchiller!)
- Fix: Links in a pdf inside an iframe now open in a new tab instead of the iframe. (thanks,
- Code: Catch OSF metadata request failures earlier and report them accurately. (thanks,
- Code: Tidy up and reduce layers in the Dockerfile (thanks, @binoculars!)
- Feature: Added support for rendering ~50 new plain-text file types via codepygments, including
FASTA files, ImageJ macros, and Turtle files. (thanks, @AddisonSchiller!)
- Feature: Add a unique request ID to MFR's response headers to help with tracking down errors.
- Feature: Add a new task to clean the export and render caches. (thanks, @icereval!)
- Fix: Error more gracefully when missing required query parameters.
- Fix: Make scrollbars visible on IE11 when content overflows the iframe.
- Fix: Fix ALLOWED_PROVIDER_DOMAINS example in MFR docs. (thanks, @jonathon-love for reporting!)
- Code: Teach MFR to listen for a SIGTERM signal and exit immediately upon receiving it. This
bypasses the 10 second wait for shutdown when running it in Docker.
- Code: Add code-coverage checking via coveralls.io. (thanks, @abought!)
- Code: Add Python 3.6 to travis testing matrix. (thanks, @abought!)
- Code: Add a Pull Request template for GitHub. (thanks, @cslzchen!)
- Fix: Update jQuery onload invocation to be compatible with jQuery 3. (thanks, @sloria!)
- Fix: Quiet some overly-verbose error logging.
- Feature: Turn on scrolling for the MFR iframe to support wide JASP files.
- Fix: Fix rendering of Google Drawing (.gdraw) files by directing them to the image renderer
rather than the unoconv renderer.
- Fix: Cast OSF file size metadata to an int before comparing to our maximum supported file size
limit. Some providers return file size as a string instead of int.
- The "(thanks, @johnetordoff!)" release
- Feature: The tabular spreadsheet renderer now recognizes date fields as dates and will format
them as such. (thanks, @johnetordoff!)
- Feature: Don't even try to render tabular files larger than 100Mb. Neither the server nor the
browser wants that. (thanks, @johnetordoff!)
- Feature: Render a better error message when encountering a csv file with a single field larger
than ~128kb. The underlying library can't handle that, so it's polite to let the user know.
- Feature: MFR will now render .m4v files using the <video> tag. (thanks, @johnetordoff!)
- Fix: Improve tooltip language on 3d object-renderer. (thanks, @johnetordoff!)
- Code: Start depending on upstream xlrd instead of our own fork. (thanks, @johnetordoff!)
- Fix: explicitly depend on IPython to fix ipynb rendering. nbconvert and nbformat have an
undeclared dependency on it. (thanks, @johnetordoff!)
- Feature: MFR errors are now categorized and have error-specific metadata added to then. If Keen
logging is enabled, the error metadata will be logged there for future investigation.
- Fix: The 3D object renderer now imposes a maximum zoom-out limit, so objects can't be shrunk to
infinitesimalness. (thanks, @johnetordoff!)
- Fix: MFR docs are once again building on readthedocs.org! (thanks, @johnetordoff!)
- Code: Update MFR to use invoke 0.13.0. If you have an existing checkout, you will need to
upgrade invoke manually: pip install invoke==0.13.0 (thanks, @johnetordoff!)
- Docs: MFR has been verified to work with python 3.5.3 and 3.6.0. From now on, the docs will
mention which python versions MFR has been verfied to work on. (thanks, @johnetordoff!)
- Fix: Increase max codepygments render size to 200kb from 64kb.
- Happy New Year!
- Fix: Be more ruthless about fixing setuptools breakage in Dockerfile. (thanks, @cwisecarver!)
- Pin setuptools to v30.4.0 to avoid package-namespace-related breakage.
- HALLOWEEN RELEASE!
- Feature: Add configurable size limit to text renderer to avoid dumping 100s of MB of text into
the user's browser. (thanks, @TomBaxter!)
- Fix: Pad MFR 404 errors to >512 bytes. IE discards 404 messages smaller than that and
substitutes its own 404 page. (thanks, @alexschiller!)
- Feature: WaterButler accepts configuration from the environment, overriding any file-based
configuration. This helps MFR integrate nicer in a docker-compose environment. (thanks, @icereval!)
- Fix: Fix pdf presentation mode on Safari. (thanks, @darioncassel!)
- Fix: Fix aiohttp crashing on gzipped HEAD requests.
- Fix: Fix incorrect WB API usage metrics.
- Code: Bump raven dependency to 5.27.0.
- Feature: MFR now does .sav conversion via pspp-convert instead of rpy2.
- Fix: Update ipython notebook renderer to use split-out nbconvert and nbformat libraries.
- Feature: add analytics to MFR requests. MFR now keeps track of requests, handlers, renderers,
and exporters, with more to come!
- Fix: Better error handling for a number of edge cases. (thanks, @TomBaxter!)
- Docs: many fixes to doc build, layout, and formatting. (thanks, @TomBaxter!)
- Docs: add overview of MFR architecture to docs
- Feature: The Dockerfile now sets up unoconv for you.
- Fix: Character encodings for text files are now detected with the chardet library. Inspired
by a file that was both valid ISO-8859-1 and UTF-16 at the same time.
- Avoid an unnecessary lookup when MFR's OSF provider gets a WaterButler V1 url for
downloading. (thanks, @pattisdr!)
- Update the install docs to pin invoke to 0.11.1.
- Pin some dependencies and update our travis config to avoid spurious build failures.
- Add a Dockerfile to simplify running MFR in dev environments.
- Pin invoke to v0.11.1. Our tasks.py is incompatible with v0.13.
- When an invalid provider is passed to MFR, HTML escape the url in the error message.
- MFR now requires python-3.5! Make sure to set the SERVER_DEBUG flag to false in your server
config to avoid the hated "throw() takes 2 positional arguments but 4 were given" error.
- Tabular files now sort numish columns numerically! (thanks, @mfraezz!)
- MFR correctly sets the Access-Control-Allow-Origin header when it receives a request with
an Authorization header but no cookie. IOW it can now be used outside the OSF! (thanks,
- Text files now wrap on Safari and Chrome. (thanks, @zamattiac!)
- Require admin to set a whitelist of permitted provider domains, to avoid spamming other sites
- IPython notebooks are now styled and look **much** better. (thanks, @erinspace!)
- The OSF (https://osf.io) has moved to Open Sans as the default font, so we shall do the same for
Markdown, ReStructred Text, and IPython notebooks. (thanks, @mfraezz!)
- COS is hiring! http://cos.io/jobs (thanks, @AndrewSallans!)
- Update copyright date. (thanks, monotonic progression of time!)
- Pin WaterButler version to v0.18, the last version using python-3.4.
- Fix bug in text encoding detector that was causing utf-8 to always detect as cp-1252.
- Markdown and ReStructuredText files are now rendered in their formatted
display. (thanks, @TomBaxter!)
- ...oh, and they're styled, too! (thanks, @erinspace!)
- Update MFR install instructions. (thanks, @rafaeldelucena!)
- A few helpful tips for the user when rendering 3D objects
- Remove Sentry Ravent Client patch, latest version no longer requires
- Updated Sentry Raven Client to send release w/ Tornado patch and tests
- Fix to provide IE10 support for JSC3D
- Fix to prevent JSC3D CTM Loader from removing download url query parameters
- Support for 3D model file formats (.stl, .3ds, .ctm, .obj) via jsc3d,
- Support for .scad (OpenSCAD) syntax highlighting
- Exclude .ico files from image scaling
- Support maximum dimensions for images
- Images larger than maximum dimensions are scaled down
- Remove invoke from requirements
- Manually garbage collect exceptions to work around issue in python 3.4
- Support word breaks in <pre> tags in Firefox.
- Codepygments extension: remove dependency on bootstrap css; add minimal
styling to maintain look.
- Unpin numpy to avoid error in pandas.
- Add support for rendering JASP files
- Add support for searching tabular renderers
- Add support for cookie based authentication for pdfs and pdbs
- service oriented architecture (SOA)
- plugin system for providers (file resources)
- plugin system for extensions (renderers and exporters)
- embeddable rendering via iframe widget
- initial unit tests