diff --git a/.eslintrc.yml b/.eslintrc.yml
index 59218cb24d337bbbcf058a818a1061785af23278..8d1bbc43a706ffe9fe4cfd75e2d15140bf3eff54 100644
--- a/.eslintrc.yml
+++ b/.eslintrc.yml
@@ -54,6 +54,9 @@ rules:
   comma-dangle:
   - error
   - always-multiline
+  object-curly-spacing:
+  - error
+  - always
 
   react/jsx-wrap-multilines: error
   react/jsx-no-bind: error
diff --git a/app/javascript/mastodon/components/avatar_overlay.js b/app/javascript/mastodon/components/avatar_overlay.js
index a9643499d3a4cfeda597fccaf0c635568e773400..e41d66ab104cbce9d26768baa4adcef2ac37c471 100644
--- a/app/javascript/mastodon/components/avatar_overlay.js
+++ b/app/javascript/mastodon/components/avatar_overlay.js
@@ -9,7 +9,7 @@ class AvatarOverlay extends React.PureComponent {
   };
 
   render() {
-    const {staticSrc, overlaySrc} = this.props;
+    const { staticSrc, overlaySrc } = this.props;
 
     const baseStyle = {
       backgroundImage: `url(${staticSrc})`,
diff --git a/app/javascript/mastodon/features/compose/components/emoji_picker_dropdown.js b/app/javascript/mastodon/features/compose/components/emoji_picker_dropdown.js
index fc921dfb8016bd73534eaa54a3c0e5fb0843932a..ffe5a1bcdf3307321b57b70155cdad8fcb22a175 100644
--- a/app/javascript/mastodon/features/compose/components/emoji_picker_dropdown.js
+++ b/app/javascript/mastodon/features/compose/components/emoji_picker_dropdown.js
@@ -46,21 +46,21 @@ class EmojiPickerDropdown extends React.PureComponent {
   }
 
   onShowDropdown = () => {
-    this.setState({active: true});
+    this.setState({ active: true });
     if (!EmojiPicker) {
-      this.setState({loading: true});
+      this.setState({ loading: true });
       import(/* webpackChunkName: "emojione_picker" */ 'emojione-picker').then(TheEmojiPicker => {
         EmojiPicker = TheEmojiPicker.default;
-        this.setState({loading: false});
+        this.setState({ loading: false });
       }).catch(err => {
         // TODO: show the user an error?
-        this.setState({loading: false});
+        this.setState({ loading: false });
       });
     }
   }
 
   onHideDropdown = () => {
-    this.setState({active: false});
+    this.setState({ active: false });
   }
 
   render () {
diff --git a/app/javascript/mastodon/features/getting_started/index.js b/app/javascript/mastodon/features/getting_started/index.js
index d1123878e23e4afabcaa9a87a52ffa957ed00675..f9619550cd09cacd2064e51e6e611f29397e4c85 100644
--- a/app/javascript/mastodon/features/getting_started/index.js
+++ b/app/javascript/mastodon/features/getting_started/index.js
@@ -12,8 +12,8 @@ import ImmutablePureComponent from 'react-immutable-pure-component';
 const messages = defineMessages({
   heading: { id: 'getting_started.heading', defaultMessage: 'Getting started' },
   public_timeline: { id: 'navigation_bar.public_timeline', defaultMessage: 'Federated timeline' },
-  navigation_subheading: { id: 'column_subheading.navigation', defaultMessage: 'Navigation'},
-  settings_subheading: { id: 'column_subheading.settings', defaultMessage: 'Settings'},
+  navigation_subheading: { id: 'column_subheading.navigation', defaultMessage: 'Navigation' },
+  settings_subheading: { id: 'column_subheading.settings', defaultMessage: 'Settings' },
   community_timeline: { id: 'navigation_bar.community_timeline', defaultMessage: 'Local timeline' },
   preferences: { id: 'navigation_bar.preferences', defaultMessage: 'Preferences' },
   follow_requests: { id: 'navigation_bar.follow_requests', defaultMessage: 'Follow requests' },
diff --git a/app/javascript/mastodon/features/ui/components/image_loader.js b/app/javascript/mastodon/features/ui/components/image_loader.js
index af2870517ef743023ac00e9ea1096e7168a5b505..2a2cbb9bf1d7faf9ba725abc955b63d124700c34 100644
--- a/app/javascript/mastodon/features/ui/components/image_loader.js
+++ b/app/javascript/mastodon/features/ui/components/image_loader.js
@@ -22,11 +22,11 @@ class ImageLoader extends React.PureComponent {
 
   loadImage(src) {
     const image = new Image();
-    image.onerror = () => this.setState({loading: false, error: true});
-    image.onload = () => this.setState({loading: false, error: false});
+    image.onerror = () => this.setState({ loading: false, error: true });
+    image.onload = () => this.setState({ loading: false, error: false });
     image.src = src;
     this.lastSrc = src;
-    this.setState({loading: true});
+    this.setState({ loading: true });
   }
 
   render() {
diff --git a/app/javascript/mastodon/features/ui/components/media_modal.js b/app/javascript/mastodon/features/ui/components/media_modal.js
index effa0aea3bebc4b6943741fb3ea8cf014de9c12b..4f27a0f7231e111366ce75e34e3175c2f19960d9 100644
--- a/app/javascript/mastodon/features/ui/components/media_modal.js
+++ b/app/javascript/mastodon/features/ui/components/media_modal.js
@@ -26,11 +26,11 @@ class MediaModal extends ImmutablePureComponent {
   };
 
   handleNextClick = () => {
-    this.setState({ index: (this.getIndex() + 1) % this.props.media.size});
+    this.setState({ index: (this.getIndex() + 1) % this.props.media.size });
   }
 
   handlePrevClick = () => {
-    this.setState({ index: (this.getIndex() - 1) % this.props.media.size});
+    this.setState({ index: (this.getIndex() - 1) % this.props.media.size });
   }
 
   handleKeyUp = (e) => {
diff --git a/app/javascript/mastodon/features/ui/components/onboarding_modal.js b/app/javascript/mastodon/features/ui/components/onboarding_modal.js
index cc3c0cdc5cafb01ec73a29bf7c3d5d81a1ee65ca..a06338b25a806943c5c11a77cea63c484131a85a 100644
--- a/app/javascript/mastodon/features/ui/components/onboarding_modal.js
+++ b/app/javascript/mastodon/features/ui/components/onboarding_modal.js
@@ -139,7 +139,7 @@ const PageSix = ({ admin, domain }) => {
       <p>
         <FormattedMessage id='onboarding.page_six.admin' defaultMessage="Your instance's admin is {admin}." values={{ admin: <Permalink href={admin.get('url')} to={`/accounts/${admin.get('id')}`}>@{admin.get('acct')}</Permalink> }} />
         <br />
-        <FormattedMessage id='onboarding.page_six.read_guidelines' defaultMessage="Please read {domain}'s {guidelines}!" values={{domain, guidelines: <a href='/about/more' target='_blank'><FormattedMessage id='onboarding.page_six.guidelines' defaultMessage='community guidelines' /></a> }}/>
+        <FormattedMessage id='onboarding.page_six.read_guidelines' defaultMessage="Please read {domain}'s {guidelines}!" values={{ domain, guidelines: <a href='/about/more' target='_blank'><FormattedMessage id='onboarding.page_six.guidelines' defaultMessage='community guidelines' /></a> }}/>
       </p>
     );
   }
diff --git a/app/javascript/mastodon/features/ui/containers/status_list_container.js b/app/javascript/mastodon/features/ui/containers/status_list_container.js
index 14222fedd902dae097e309e69f8ab6a34288e709..cbdd2d12d43211bb83cfd1b41f4664ce9bc4b04c 100644
--- a/app/javascript/mastodon/features/ui/containers/status_list_container.js
+++ b/app/javascript/mastodon/features/ui/containers/status_list_container.js
@@ -56,7 +56,7 @@ const mapDispatchToProps = (dispatch, { type, id }) => ({
   onScrollToBottom: debounce(() => {
     dispatch(scrollTopTimeline(type, false));
     dispatch(expandTimeline(type, id));
-  }, 300, {leading: true}),
+  }, 300, { leading: true }),
 
   onScrollToTop: debounce(() => {
     dispatch(scrollTopTimeline(type, true));
diff --git a/config/webpack/translationRunner.js b/config/webpack/translationRunner.js
index 8d2fb4893d228d0c6bd326169efcd5173393ad89..a546125494cd4cbfcf37640946d263b7a425b5a0 100644
--- a/config/webpack/translationRunner.js
+++ b/config/webpack/translationRunner.js
@@ -35,7 +35,7 @@ const validateLanguages = function (languages, validators) {
 
   if (invalidLanguages.length > 0) {
     console.log(`\nError: Specified invalid LANGUAGES:`);
-    for (let {language, error} of invalidLanguages) {
+    for (let { language, error } of invalidLanguages) {
       console.error(`* ${language}: ${error}`);
     }
     console.log(`\nUse yarn "manage:translations -- --help" for usage information\n`);