diff --git a/app/helpers/accounts_helper.rb b/app/helpers/accounts_helper.rb
index 158a0815e123ae71adc7b131abab6096fdd9c894..d804566c93577655f9be52ed80785ea1d0c67185 100644
--- a/app/helpers/accounts_helper.rb
+++ b/app/helpers/accounts_helper.rb
@@ -19,14 +19,6 @@ module AccountsHelper
     end
   end
 
-  def account_action_button(account)
-    return if account.memorial? || account.moved?
-
-    link_to ActivityPub::TagManager.instance.url_for(account), class: 'button logo-button', target: '_new' do
-      safe_join([logo_as_symbol, t('accounts.follow')])
-    end
-  end
-
   def account_formatted_stat(value)
     number_to_human(value, precision: 3, strip_insignificant_zeros: true)
   end
diff --git a/app/helpers/media_component_helper.rb b/app/helpers/media_component_helper.rb
index fa8f34fb4d3d731af3985e604b636997cf6cb2b6..60ccdd083590387e2e0427c6daab5e7ab8a9bb6a 100644
--- a/app/helpers/media_component_helper.rb
+++ b/app/helpers/media_component_helper.rb
@@ -57,26 +57,6 @@ module MediaComponentHelper
     end
   end
 
-  def render_card_component(status, **options)
-    component_params = {
-      sensitive: sensitive_viewer?(status, current_account),
-      card: serialize_status_card(status).as_json,
-    }.merge(**options)
-
-    react_component :card, component_params
-  end
-
-  def render_poll_component(status, **options)
-    component_params = {
-      disabled: true,
-      poll: serialize_status_poll(status).as_json,
-    }.merge(**options)
-
-    react_component :poll, component_params do
-      render partial: 'statuses/poll', locals: { status: status, poll: status.preloadable_poll, autoplay: prefers_autoplay? }
-    end
-  end
-
   private
 
   def serialize_media_attachment(attachment)
@@ -86,22 +66,6 @@ module MediaComponentHelper
     )
   end
 
-  def serialize_status_card(status)
-    ActiveModelSerializers::SerializableResource.new(
-      status.preview_card,
-      serializer: REST::PreviewCardSerializer
-    )
-  end
-
-  def serialize_status_poll(status)
-    ActiveModelSerializers::SerializableResource.new(
-      status.preloadable_poll,
-      serializer: REST::PollSerializer,
-      scope: current_user,
-      scope_name: :current_user
-    )
-  end
-
   def sensitive_viewer?(status, account)
     if !account.nil? && account.id == status.account_id
       status.sensitive
diff --git a/app/javascript/entrypoints/embed.tsx b/app/javascript/entrypoints/embed.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..f8c824d287ad31a61062516233bd9e47cbbc86c4
--- /dev/null
+++ b/app/javascript/entrypoints/embed.tsx
@@ -0,0 +1,74 @@
+import './public-path';
+import { createRoot } from 'react-dom/client';
+
+import { afterInitialRender } from 'mastodon/../hooks/useRenderSignal';
+
+import { start } from '../mastodon/common';
+import { Status } from '../mastodon/features/standalone/status';
+import { loadPolyfills } from '../mastodon/polyfills';
+import ready from '../mastodon/ready';
+
+start();
+
+function loaded() {
+  const mountNode = document.getElementById('mastodon-status');
+
+  if (mountNode) {
+    const attr = mountNode.getAttribute('data-props');
+
+    if (!attr) return;
+
+    const props = JSON.parse(attr) as { id: string; locale: string };
+    const root = createRoot(mountNode);
+
+    root.render(<Status {...props} />);
+  }
+}
+
+function main() {
+  ready(loaded).catch((error: unknown) => {
+    console.error(error);
+  });
+}
+
+loadPolyfills()
+  .then(main)
+  .catch((error: unknown) => {
+    console.error(error);
+  });
+
+interface SetHeightMessage {
+  type: 'setHeight';
+  id: string;
+  height: number;
+}
+
+function isSetHeightMessage(data: unknown): data is SetHeightMessage {
+  if (
+    data &&
+    typeof data === 'object' &&
+    'type' in data &&
+    data.type === 'setHeight'
+  )
+    return true;
+  else return false;
+}
+
+window.addEventListener('message', (e) => {
+  // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- typings are not correct, it can be null in very rare cases
+  if (!e.data || !isSetHeightMessage(e.data) || !window.parent) return;
+
+  const data = e.data;
+
+  // We use a timeout to allow for the React page to render before calculating the height
+  afterInitialRender(() => {
+    window.parent.postMessage(
+      {
+        type: 'setHeight',
+        id: data.id,
+        height: document.getElementsByTagName('html')[0]?.scrollHeight,
+      },
+      '*',
+    );
+  });
+});
diff --git a/app/javascript/entrypoints/public.tsx b/app/javascript/entrypoints/public.tsx
index b06675c2ee2cce28b2b163c54a9004cf7398b75d..d33e00d5da88cedad1dd23e14bdd7cf4edcf0d52 100644
--- a/app/javascript/entrypoints/public.tsx
+++ b/app/javascript/entrypoints/public.tsx
@@ -37,43 +37,6 @@ const messages = defineMessages({
   },
 });
 
-interface SetHeightMessage {
-  type: 'setHeight';
-  id: string;
-  height: number;
-}
-
-function isSetHeightMessage(data: unknown): data is SetHeightMessage {
-  if (
-    data &&
-    typeof data === 'object' &&
-    'type' in data &&
-    data.type === 'setHeight'
-  )
-    return true;
-  else return false;
-}
-
-window.addEventListener('message', (e) => {
-  // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- typings are not correct, it can be null in very rare cases
-  if (!e.data || !isSetHeightMessage(e.data) || !window.parent) return;
-
-  const data = e.data;
-
-  ready(() => {
-    window.parent.postMessage(
-      {
-        type: 'setHeight',
-        id: data.id,
-        height: document.getElementsByTagName('html')[0]?.scrollHeight,
-      },
-      '*',
-    );
-  }).catch((e: unknown) => {
-    console.error('Error in setHeightMessage postMessage', e);
-  });
-});
-
 function loaded() {
   const { messages: localeData } = getLocale();
 
diff --git a/app/javascript/hooks/useRenderSignal.ts b/app/javascript/hooks/useRenderSignal.ts
new file mode 100644
index 0000000000000000000000000000000000000000..740df4a35a306a24f3f80c4fca2be32f1f60ba43
--- /dev/null
+++ b/app/javascript/hooks/useRenderSignal.ts
@@ -0,0 +1,32 @@
+// This hook allows a component to signal that it's done rendering in a way that
+// can be used by e.g. our embed code to determine correct iframe height
+
+let renderSignalReceived = false;
+
+type Callback = () => void;
+
+let onInitialRender: Callback;
+
+export const afterInitialRender = (callback: Callback) => {
+  if (renderSignalReceived) {
+    callback();
+  } else {
+    onInitialRender = callback;
+  }
+};
+
+export const useRenderSignal = () => {
+  return () => {
+    if (renderSignalReceived) {
+      return;
+    }
+
+    renderSignalReceived = true;
+
+    if (typeof onInitialRender !== 'undefined') {
+      window.requestAnimationFrame(() => {
+        onInitialRender();
+      });
+    }
+  };
+};
diff --git a/app/javascript/mastodon/actions/statuses.js b/app/javascript/mastodon/actions/statuses.js
index 340cee8024b0eb71bbc1ee612cb3a8356bf77dd8..1e4e545d8c97114139ecb61c33e4b7d3e97ac4b5 100644
--- a/app/javascript/mastodon/actions/statuses.js
+++ b/app/javascript/mastodon/actions/statuses.js
@@ -49,11 +49,13 @@ export function fetchStatusRequest(id, skipLoading) {
   };
 }
 
-export function fetchStatus(id, forceFetch = false) {
+export function fetchStatus(id, forceFetch = false, alsoFetchContext = true) {
   return (dispatch, getState) => {
     const skipLoading = !forceFetch && getState().getIn(['statuses', id], null) !== null;
 
-    dispatch(fetchContext(id));
+    if (alsoFetchContext) {
+      dispatch(fetchContext(id));
+    }
 
     if (skipLoading) {
       return;
diff --git a/app/javascript/mastodon/components/logo.tsx b/app/javascript/mastodon/components/logo.tsx
index b7f8bd6695008af92b94610d62ab856a73be6382..fe9680d0e3a4b33bef71dd0641a37187ec8ac223 100644
--- a/app/javascript/mastodon/components/logo.tsx
+++ b/app/javascript/mastodon/components/logo.tsx
@@ -7,6 +7,13 @@ export const WordmarkLogo: React.FC = () => (
   </svg>
 );
 
+export const IconLogo: React.FC = () => (
+  <svg viewBox='0 0 79 79' className='logo logo--icon' role='img'>
+    <title>Mastodon</title>
+    <use xlinkHref='#logo-symbol-icon' />
+  </svg>
+);
+
 export const SymbolLogo: React.FC = () => (
   <img src={logo} alt='Mastodon' className='logo logo--icon' />
 );
diff --git a/app/javascript/mastodon/components/more_from_author.jsx b/app/javascript/mastodon/components/more_from_author.jsx
index c20e76ac459f9a78adb42d1be798d696dce7b04a..719f4dda86fa0e30cf1a3863321fff15f0494f70 100644
--- a/app/javascript/mastodon/components/more_from_author.jsx
+++ b/app/javascript/mastodon/components/more_from_author.jsx
@@ -2,14 +2,12 @@ import PropTypes from 'prop-types';
 
 import { FormattedMessage } from 'react-intl';
 
+import { IconLogo } from 'mastodon/components/logo';
 import { AuthorLink } from 'mastodon/features/explore/components/author_link';
 
 export const MoreFromAuthor = ({ accountId }) => (
   <div className='more-from-author'>
-    <svg viewBox='0 0 79 79' className='logo logo--icon' role='img'>
-      <use xlinkHref='#logo-symbol-icon' />
-    </svg>
-
+    <IconLogo />
     <FormattedMessage id='link_preview.more_from_author' defaultMessage='More from {name}' values={{ name: <AuthorLink accountId={accountId} /> }} />
   </div>
 );
diff --git a/app/javascript/mastodon/features/standalone/status/index.tsx b/app/javascript/mastodon/features/standalone/status/index.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..d5cb7e7f40b97a4ed37cab803435aab0cdf3a7b6
--- /dev/null
+++ b/app/javascript/mastodon/features/standalone/status/index.tsx
@@ -0,0 +1,87 @@
+/* eslint-disable @typescript-eslint/no-unsafe-return,
+                  @typescript-eslint/no-explicit-any,
+                  @typescript-eslint/no-unsafe-assignment */
+
+import { useEffect, useCallback } from 'react';
+
+import { Provider } from 'react-redux';
+
+import { useRenderSignal } from 'mastodon/../hooks/useRenderSignal';
+import { fetchStatus, toggleStatusSpoilers } from 'mastodon/actions/statuses';
+import { hydrateStore } from 'mastodon/actions/store';
+import { Router } from 'mastodon/components/router';
+import { DetailedStatus } from 'mastodon/features/status/components/detailed_status';
+import initialState from 'mastodon/initial_state';
+import { IntlProvider } from 'mastodon/locales';
+import { makeGetStatus, makeGetPictureInPicture } from 'mastodon/selectors';
+import { store, useAppSelector, useAppDispatch } from 'mastodon/store';
+
+const getStatus = makeGetStatus() as unknown as (arg0: any, arg1: any) => any;
+const getPictureInPicture = makeGetPictureInPicture() as unknown as (
+  arg0: any,
+  arg1: any,
+) => any;
+
+const Embed: React.FC<{ id: string }> = ({ id }) => {
+  const status = useAppSelector((state) => getStatus(state, { id }));
+  const pictureInPicture = useAppSelector((state) =>
+    getPictureInPicture(state, { id }),
+  );
+  const domain = useAppSelector((state) => state.meta.get('domain'));
+  const dispatch = useAppDispatch();
+  const dispatchRenderSignal = useRenderSignal();
+
+  useEffect(() => {
+    dispatch(fetchStatus(id, false, false));
+  }, [dispatch, id]);
+
+  const handleToggleHidden = useCallback(() => {
+    dispatch(toggleStatusSpoilers(id));
+  }, [dispatch, id]);
+
+  // This allows us to calculate the correct page height for embeds
+  if (status) {
+    dispatchRenderSignal();
+  }
+
+  // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access
+  const permalink = status?.get('url') as string;
+
+  return (
+    <div className='embed'>
+      <DetailedStatus
+        status={status}
+        domain={domain}
+        pictureInPicture={pictureInPicture}
+        onToggleHidden={handleToggleHidden}
+        withLogo
+      />
+
+      <a
+        className='embed__overlay'
+        href={permalink}
+        target='_blank'
+        rel='noreferrer noopener'
+        aria-label=''
+      />
+    </div>
+  );
+};
+
+export const Status: React.FC<{ id: string }> = ({ id }) => {
+  useEffect(() => {
+    if (initialState) {
+      store.dispatch(hydrateStore(initialState));
+    }
+  }, []);
+
+  return (
+    <IntlProvider>
+      <Provider store={store}>
+        <Router>
+          <Embed id={id} />
+        </Router>
+      </Provider>
+    </IntlProvider>
+  );
+};
diff --git a/app/javascript/mastodon/features/status/components/detailed_status.jsx b/app/javascript/mastodon/features/status/components/detailed_status.jsx
deleted file mode 100644
index 8ee1ec9b9bd40df35abeba89e406be770388a4d1..0000000000000000000000000000000000000000
--- a/app/javascript/mastodon/features/status/components/detailed_status.jsx
+++ /dev/null
@@ -1,322 +0,0 @@
-import PropTypes from 'prop-types';
-
-import { FormattedDate, FormattedMessage } from 'react-intl';
-
-import classNames from 'classnames';
-import { Link, withRouter } from 'react-router-dom';
-
-import ImmutablePropTypes from 'react-immutable-proptypes';
-import ImmutablePureComponent from 'react-immutable-pure-component';
-
-import AlternateEmailIcon from '@/material-icons/400-24px/alternate_email.svg?react';
-import { AnimatedNumber } from 'mastodon/components/animated_number';
-import { ContentWarning } from 'mastodon/components/content_warning';
-import EditedTimestamp from 'mastodon/components/edited_timestamp';
-import { getHashtagBarForStatus } from 'mastodon/components/hashtag_bar';
-import { Icon }  from 'mastodon/components/icon';
-import PictureInPicturePlaceholder from 'mastodon/components/picture_in_picture_placeholder';
-import { VisibilityIcon } from 'mastodon/components/visibility_icon';
-import { WithRouterPropTypes } from 'mastodon/utils/react_router';
-
-import { Avatar } from '../../../components/avatar';
-import { DisplayName } from '../../../components/display_name';
-import MediaGallery from '../../../components/media_gallery';
-import StatusContent from '../../../components/status_content';
-import Audio from '../../audio';
-import scheduleIdleTask from '../../ui/util/schedule_idle_task';
-import Video from '../../video';
-
-import Card from './card';
-
-class DetailedStatus extends ImmutablePureComponent {
-
-  static propTypes = {
-    status: ImmutablePropTypes.map,
-    onOpenMedia: PropTypes.func.isRequired,
-    onOpenVideo: PropTypes.func.isRequired,
-    onToggleHidden: PropTypes.func.isRequired,
-    onTranslate: PropTypes.func.isRequired,
-    measureHeight: PropTypes.bool,
-    onHeightChange: PropTypes.func,
-    domain: PropTypes.string.isRequired,
-    compact: PropTypes.bool,
-    showMedia: PropTypes.bool,
-    pictureInPicture: ImmutablePropTypes.contains({
-      inUse: PropTypes.bool,
-      available: PropTypes.bool,
-    }),
-    onToggleMediaVisibility: PropTypes.func,
-    ...WithRouterPropTypes,
-  };
-
-  state = {
-    height: null,
-  };
-
-  handleAccountClick = (e) => {
-    if (e.button === 0 && !(e.ctrlKey || e.metaKey) && this.props.history) {
-      e.preventDefault();
-      this.props.history.push(`/@${this.props.status.getIn(['account', 'acct'])}`);
-    }
-
-    e.stopPropagation();
-  };
-
-  handleOpenVideo = (options) => {
-    this.props.onOpenVideo(this.props.status.getIn(['media_attachments', 0]), options);
-  };
-
-  handleExpandedToggle = () => {
-    this.props.onToggleHidden(this.props.status);
-  };
-
-  _measureHeight (heightJustChanged) {
-    if (this.props.measureHeight && this.node) {
-      scheduleIdleTask(() => this.node && this.setState({ height: Math.ceil(this.node.scrollHeight) + 1 }));
-
-      if (this.props.onHeightChange && heightJustChanged) {
-        this.props.onHeightChange();
-      }
-    }
-  }
-
-  setRef = c => {
-    this.node = c;
-    this._measureHeight();
-  };
-
-  componentDidUpdate (prevProps, prevState) {
-    this._measureHeight(prevState.height !== this.state.height);
-  }
-
-  handleModalLink = e => {
-    e.preventDefault();
-
-    let href;
-
-    if (e.target.nodeName !== 'A') {
-      href = e.target.parentNode.href;
-    } else {
-      href = e.target.href;
-    }
-
-    window.open(href, 'mastodon-intent', 'width=445,height=600,resizable=no,menubar=no,status=no,scrollbars=yes');
-  };
-
-  handleTranslate = () => {
-    const { onTranslate, status } = this.props;
-    onTranslate(status);
-  };
-
-  _properStatus () {
-    const { status } = this.props;
-
-    if (status.get('reblog', null) !== null && typeof status.get('reblog') === 'object') {
-      return status.get('reblog');
-    } else {
-      return status;
-    }
-  }
-
-  getAttachmentAspectRatio () {
-    const attachments = this._properStatus().get('media_attachments');
-
-    if (attachments.getIn([0, 'type']) === 'video') {
-      return `${attachments.getIn([0, 'meta', 'original', 'width'])} / ${attachments.getIn([0, 'meta', 'original', 'height'])}`;
-    } else if (attachments.getIn([0, 'type']) === 'audio') {
-      return '16 / 9';
-    } else {
-      return (attachments.size === 1 && attachments.getIn([0, 'meta', 'small', 'aspect'])) ? attachments.getIn([0, 'meta', 'small', 'aspect']) : '3 / 2';
-    }
-  }
-
-  render () {
-    const status = this._properStatus();
-    const outerStyle = { boxSizing: 'border-box' };
-    const { compact, pictureInPicture } = this.props;
-
-    if (!status) {
-      return null;
-    }
-
-    let media           = '';
-    let applicationLink = '';
-    let reblogLink = '';
-    let favouriteLink = '';
-
-    if (this.props.measureHeight) {
-      outerStyle.height = `${this.state.height}px`;
-    }
-
-    const language = status.getIn(['translation', 'language']) || status.get('language');
-
-    if (pictureInPicture.get('inUse')) {
-      media = <PictureInPicturePlaceholder aspectRatio={this.getAttachmentAspectRatio()} />;
-    } else if (status.get('media_attachments').size > 0) {
-      if (status.getIn(['media_attachments', 0, 'type']) === 'audio') {
-        const attachment = status.getIn(['media_attachments', 0]);
-        const description = attachment.getIn(['translation', 'description']) || attachment.get('description');
-
-        media = (
-          <Audio
-            src={attachment.get('url')}
-            alt={description}
-            lang={language}
-            duration={attachment.getIn(['meta', 'original', 'duration'], 0)}
-            poster={attachment.get('preview_url') || status.getIn(['account', 'avatar_static'])}
-            backgroundColor={attachment.getIn(['meta', 'colors', 'background'])}
-            foregroundColor={attachment.getIn(['meta', 'colors', 'foreground'])}
-            accentColor={attachment.getIn(['meta', 'colors', 'accent'])}
-            sensitive={status.get('sensitive')}
-            visible={this.props.showMedia}
-            blurhash={attachment.get('blurhash')}
-            height={150}
-            onToggleVisibility={this.props.onToggleMediaVisibility}
-          />
-        );
-      } else if (status.getIn(['media_attachments', 0, 'type']) === 'video') {
-        const attachment = status.getIn(['media_attachments', 0]);
-        const description = attachment.getIn(['translation', 'description']) || attachment.get('description');
-
-        media = (
-          <Video
-            preview={attachment.get('preview_url')}
-            frameRate={attachment.getIn(['meta', 'original', 'frame_rate'])}
-            aspectRatio={`${attachment.getIn(['meta', 'original', 'width'])} / ${attachment.getIn(['meta', 'original', 'height'])}`}
-            blurhash={attachment.get('blurhash')}
-            src={attachment.get('url')}
-            alt={description}
-            lang={language}
-            width={300}
-            height={150}
-            onOpenVideo={this.handleOpenVideo}
-            sensitive={status.get('sensitive')}
-            visible={this.props.showMedia}
-            onToggleVisibility={this.props.onToggleMediaVisibility}
-          />
-        );
-      } else {
-        media = (
-          <MediaGallery
-            standalone
-            sensitive={status.get('sensitive')}
-            media={status.get('media_attachments')}
-            lang={language}
-            height={300}
-            onOpenMedia={this.props.onOpenMedia}
-            visible={this.props.showMedia}
-            onToggleVisibility={this.props.onToggleMediaVisibility}
-          />
-        );
-      }
-    } else if (status.get('spoiler_text').length === 0) {
-      media = <Card sensitive={status.get('sensitive')} onOpenMedia={this.props.onOpenMedia} card={status.get('card', null)} />;
-    }
-
-    if (status.get('application')) {
-      applicationLink = <>·<a className='detailed-status__application' href={status.getIn(['application', 'website'])} target='_blank' rel='noopener noreferrer'>{status.getIn(['application', 'name'])}</a></>;
-    }
-
-    const visibilityLink = <>·<VisibilityIcon visibility={status.get('visibility')} /></>;
-
-    if (['private', 'direct'].includes(status.get('visibility'))) {
-      reblogLink = '';
-    } else if (this.props.history) {
-      reblogLink = (
-        <Link to={`/@${status.getIn(['account', 'acct'])}/${status.get('id')}/reblogs`} className='detailed-status__link'>
-          <span className='detailed-status__reblogs'>
-            <AnimatedNumber value={status.get('reblogs_count')} />
-          </span>
-          <FormattedMessage id='status.reblogs' defaultMessage='{count, plural, one {boost} other {boosts}}' values={{ count: status.get('reblogs_count') }} />
-        </Link>
-      );
-    } else {
-      reblogLink = (
-        <a href={`/interact/${status.get('id')}?type=reblog`} className='detailed-status__link' onClick={this.handleModalLink}>
-          <span className='detailed-status__reblogs'>
-            <AnimatedNumber value={status.get('reblogs_count')} />
-          </span>
-          <FormattedMessage id='status.reblogs' defaultMessage='{count, plural, one {boost} other {boosts}}' values={{ count: status.get('reblogs_count') }} />
-        </a>
-      );
-    }
-
-    if (this.props.history) {
-      favouriteLink = (
-        <Link to={`/@${status.getIn(['account', 'acct'])}/${status.get('id')}/favourites`} className='detailed-status__link'>
-          <span className='detailed-status__favorites'>
-            <AnimatedNumber value={status.get('favourites_count')} />
-          </span>
-          <FormattedMessage id='status.favourites' defaultMessage='{count, plural, one {favorite} other {favorites}}' values={{ count: status.get('favourites_count') }} />
-        </Link>
-      );
-    } else {
-      favouriteLink = (
-        <a href={`/interact/${status.get('id')}?type=favourite`} className='detailed-status__link' onClick={this.handleModalLink}>
-          <span className='detailed-status__favorites'>
-            <AnimatedNumber value={status.get('favourites_count')} />
-          </span>
-          <FormattedMessage id='status.favourites' defaultMessage='{count, plural, one {favorite} other {favorites}}' values={{ count: status.get('favourites_count') }} />
-        </a>
-      );
-    }
-
-    const {statusContentProps, hashtagBar} = getHashtagBarForStatus(status);
-    const expanded = !status.get('hidden') || status.get('spoiler_text').length === 0;
-
-    return (
-      <div style={outerStyle}>
-        <div ref={this.setRef} className={classNames('detailed-status', { compact })}>
-          {status.get('visibility') === 'direct' && (
-            <div className='status__prepend'>
-              <div className='status__prepend-icon-wrapper'><Icon id='at' icon={AlternateEmailIcon} className='status__prepend-icon' /></div>
-              <FormattedMessage id='status.direct_indicator' defaultMessage='Private mention' />
-            </div>
-          )}
-          <a href={`/@${status.getIn(['account', 'acct'])}`} data-hover-card-account={status.getIn(['account', 'id'])} onClick={this.handleAccountClick} className='detailed-status__display-name'>
-            <div className='detailed-status__display-avatar'><Avatar account={status.get('account')} size={46} /></div>
-            <DisplayName account={status.get('account')} localDomain={this.props.domain} />
-          </a>
-
-          {status.get('spoiler_text').length > 0 && <ContentWarning text={status.getIn(['translation', 'spoilerHtml']) || status.get('spoilerHtml')} expanded={expanded} onClick={this.handleExpandedToggle} />}
-
-          {expanded && (
-            <>
-              <StatusContent
-                status={status}
-                onTranslate={this.handleTranslate}
-                {...statusContentProps}
-              />
-
-              {media}
-              {hashtagBar}
-            </>
-          )}
-
-          <div className='detailed-status__meta'>
-            <div className='detailed-status__meta__line'>
-              <a className='detailed-status__datetime' href={`/@${status.getIn(['account', 'acct'])}/${status.get('id')}`} target='_blank' rel='noopener noreferrer'>
-                <FormattedDate value={new Date(status.get('created_at'))} year='numeric' month='short' day='2-digit' hour='2-digit' minute='2-digit' />
-              </a>
-
-              {visibilityLink}
-
-              {applicationLink}
-            </div>
-
-            {status.get('edited_at') && <div className='detailed-status__meta__line'><EditedTimestamp statusId={status.get('id')} timestamp={status.get('edited_at')} /></div>}
-
-            <div className='detailed-status__meta__line'>
-              {reblogLink}
-              {reblogLink && <>·</>}
-              {favouriteLink}
-            </div>
-          </div>
-        </div>
-      </div>
-    );
-  }
-
-}
-
-export default withRouter(DetailedStatus);
diff --git a/app/javascript/mastodon/features/status/components/detailed_status.tsx b/app/javascript/mastodon/features/status/components/detailed_status.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..fa843122fbce8ad0a95584423e7d018d860133a0
--- /dev/null
+++ b/app/javascript/mastodon/features/status/components/detailed_status.tsx
@@ -0,0 +1,390 @@
+/* eslint-disable @typescript-eslint/no-unsafe-member-access,
+                  @typescript-eslint/no-unsafe-call,
+                  @typescript-eslint/no-explicit-any,
+                  @typescript-eslint/no-unsafe-assignment */
+
+import type { CSSProperties } from 'react';
+import { useState, useRef, useCallback } from 'react';
+
+import { FormattedDate, FormattedMessage } from 'react-intl';
+
+import classNames from 'classnames';
+import { Link } from 'react-router-dom';
+
+import AlternateEmailIcon from '@/material-icons/400-24px/alternate_email.svg?react';
+import { AnimatedNumber } from 'mastodon/components/animated_number';
+import { ContentWarning } from 'mastodon/components/content_warning';
+import EditedTimestamp from 'mastodon/components/edited_timestamp';
+import type { StatusLike } from 'mastodon/components/hashtag_bar';
+import { getHashtagBarForStatus } from 'mastodon/components/hashtag_bar';
+import { Icon } from 'mastodon/components/icon';
+import { IconLogo } from 'mastodon/components/logo';
+import PictureInPicturePlaceholder from 'mastodon/components/picture_in_picture_placeholder';
+import { VisibilityIcon } from 'mastodon/components/visibility_icon';
+
+import { Avatar } from '../../../components/avatar';
+import { DisplayName } from '../../../components/display_name';
+import MediaGallery from '../../../components/media_gallery';
+import StatusContent from '../../../components/status_content';
+import Audio from '../../audio';
+import scheduleIdleTask from '../../ui/util/schedule_idle_task';
+import Video from '../../video';
+
+import Card from './card';
+
+interface VideoModalOptions {
+  startTime: number;
+  autoPlay?: boolean;
+  defaultVolume: number;
+  componentIndex: number;
+}
+
+export const DetailedStatus: React.FC<{
+  status: any;
+  onOpenMedia?: (status: any, index: number, lang: string) => void;
+  onOpenVideo?: (status: any, lang: string, options: VideoModalOptions) => void;
+  onTranslate?: (status: any) => void;
+  measureHeight?: boolean;
+  onHeightChange?: () => void;
+  domain: string;
+  showMedia?: boolean;
+  withLogo?: boolean;
+  pictureInPicture: any;
+  onToggleHidden?: (status: any) => void;
+  onToggleMediaVisibility?: () => void;
+}> = ({
+  status,
+  onOpenMedia,
+  onOpenVideo,
+  onTranslate,
+  measureHeight,
+  onHeightChange,
+  domain,
+  showMedia,
+  withLogo,
+  pictureInPicture,
+  onToggleMediaVisibility,
+  onToggleHidden,
+}) => {
+  const properStatus = status?.get('reblog') ?? status;
+  const [height, setHeight] = useState(0);
+  const nodeRef = useRef<HTMLDivElement>();
+
+  const handleOpenVideo = useCallback(
+    (options: VideoModalOptions) => {
+      const lang = (status.getIn(['translation', 'language']) ||
+        status.get('language')) as string;
+      if (onOpenVideo)
+        onOpenVideo(status.getIn(['media_attachments', 0]), lang, options);
+    },
+    [onOpenVideo, status],
+  );
+
+  const handleExpandedToggle = useCallback(() => {
+    if (onToggleHidden) onToggleHidden(status);
+  }, [onToggleHidden, status]);
+
+  const _measureHeight = useCallback(
+    (heightJustChanged?: boolean) => {
+      if (measureHeight && nodeRef.current) {
+        scheduleIdleTask(() => {
+          if (nodeRef.current)
+            setHeight(Math.ceil(nodeRef.current.scrollHeight) + 1);
+        });
+
+        if (onHeightChange && heightJustChanged) {
+          onHeightChange();
+        }
+      }
+    },
+    [onHeightChange, measureHeight, setHeight],
+  );
+
+  const handleRef = useCallback(
+    (c: HTMLDivElement) => {
+      nodeRef.current = c;
+      _measureHeight();
+    },
+    [_measureHeight],
+  );
+
+  const handleTranslate = useCallback(() => {
+    if (onTranslate) onTranslate(status);
+  }, [onTranslate, status]);
+
+  if (!properStatus) {
+    return null;
+  }
+
+  let media;
+  let applicationLink;
+  let reblogLink;
+  let attachmentAspectRatio;
+
+  if (properStatus.get('media_attachments').getIn([0, 'type']) === 'video') {
+    attachmentAspectRatio = `${properStatus.get('media_attachments').getIn([0, 'meta', 'original', 'width'])} / ${properStatus.get('media_attachments').getIn([0, 'meta', 'original', 'height'])}`;
+  } else if (
+    properStatus.get('media_attachments').getIn([0, 'type']) === 'audio'
+  ) {
+    attachmentAspectRatio = '16 / 9';
+  } else {
+    attachmentAspectRatio =
+      properStatus.get('media_attachments').size === 1 &&
+      properStatus
+        .get('media_attachments')
+        .getIn([0, 'meta', 'small', 'aspect'])
+        ? properStatus
+            .get('media_attachments')
+            .getIn([0, 'meta', 'small', 'aspect'])
+        : '3 / 2';
+  }
+
+  const outerStyle = { boxSizing: 'border-box' } as CSSProperties;
+
+  if (measureHeight) {
+    outerStyle.height = height;
+  }
+
+  const language =
+    status.getIn(['translation', 'language']) || status.get('language');
+
+  if (pictureInPicture.get('inUse')) {
+    media = <PictureInPicturePlaceholder aspectRatio={attachmentAspectRatio} />;
+  } else if (status.get('media_attachments').size > 0) {
+    if (status.getIn(['media_attachments', 0, 'type']) === 'audio') {
+      const attachment = status.getIn(['media_attachments', 0]);
+      const description =
+        attachment.getIn(['translation', 'description']) ||
+        attachment.get('description');
+
+      media = (
+        <Audio
+          src={attachment.get('url')}
+          alt={description}
+          lang={language}
+          duration={attachment.getIn(['meta', 'original', 'duration'], 0)}
+          poster={
+            attachment.get('preview_url') ||
+            status.getIn(['account', 'avatar_static'])
+          }
+          backgroundColor={attachment.getIn(['meta', 'colors', 'background'])}
+          foregroundColor={attachment.getIn(['meta', 'colors', 'foreground'])}
+          accentColor={attachment.getIn(['meta', 'colors', 'accent'])}
+          sensitive={status.get('sensitive')}
+          visible={showMedia}
+          blurhash={attachment.get('blurhash')}
+          height={150}
+          onToggleVisibility={onToggleMediaVisibility}
+        />
+      );
+    } else if (status.getIn(['media_attachments', 0, 'type']) === 'video') {
+      const attachment = status.getIn(['media_attachments', 0]);
+      const description =
+        attachment.getIn(['translation', 'description']) ||
+        attachment.get('description');
+
+      media = (
+        <Video
+          preview={attachment.get('preview_url')}
+          frameRate={attachment.getIn(['meta', 'original', 'frame_rate'])}
+          aspectRatio={`${attachment.getIn(['meta', 'original', 'width'])} / ${attachment.getIn(['meta', 'original', 'height'])}`}
+          blurhash={attachment.get('blurhash')}
+          src={attachment.get('url')}
+          alt={description}
+          lang={language}
+          width={300}
+          height={150}
+          onOpenVideo={handleOpenVideo}
+          sensitive={status.get('sensitive')}
+          visible={showMedia}
+          onToggleVisibility={onToggleMediaVisibility}
+        />
+      );
+    } else {
+      media = (
+        <MediaGallery
+          standalone
+          sensitive={status.get('sensitive')}
+          media={status.get('media_attachments')}
+          lang={language}
+          height={300}
+          onOpenMedia={onOpenMedia}
+          visible={showMedia}
+          onToggleVisibility={onToggleMediaVisibility}
+        />
+      );
+    }
+  } else if (status.get('spoiler_text').length === 0) {
+    media = (
+      <Card
+        sensitive={status.get('sensitive')}
+        onOpenMedia={onOpenMedia}
+        card={status.get('card', null)}
+      />
+    );
+  }
+
+  if (status.get('application')) {
+    applicationLink = (
+      <>
+        ·
+        <a
+          className='detailed-status__application'
+          href={status.getIn(['application', 'website'])}
+          target='_blank'
+          rel='noopener noreferrer'
+        >
+          {status.getIn(['application', 'name'])}
+        </a>
+      </>
+    );
+  }
+
+  const visibilityLink = (
+    <>
+      ·<VisibilityIcon visibility={status.get('visibility')} />
+    </>
+  );
+
+  if (['private', 'direct'].includes(status.get('visibility') as string)) {
+    reblogLink = '';
+  } else {
+    reblogLink = (
+      <Link
+        to={`/@${status.getIn(['account', 'acct'])}/${status.get('id')}/reblogs`}
+        className='detailed-status__link'
+      >
+        <span className='detailed-status__reblogs'>
+          <AnimatedNumber value={status.get('reblogs_count')} />
+        </span>
+        <FormattedMessage
+          id='status.reblogs'
+          defaultMessage='{count, plural, one {boost} other {boosts}}'
+          values={{ count: status.get('reblogs_count') }}
+        />
+      </Link>
+    );
+  }
+
+  const favouriteLink = (
+    <Link
+      to={`/@${status.getIn(['account', 'acct'])}/${status.get('id')}/favourites`}
+      className='detailed-status__link'
+    >
+      <span className='detailed-status__favorites'>
+        <AnimatedNumber value={status.get('favourites_count')} />
+      </span>
+      <FormattedMessage
+        id='status.favourites'
+        defaultMessage='{count, plural, one {favorite} other {favorites}}'
+        values={{ count: status.get('favourites_count') }}
+      />
+    </Link>
+  );
+
+  const { statusContentProps, hashtagBar } = getHashtagBarForStatus(
+    status as StatusLike,
+  );
+  const expanded =
+    !status.get('hidden') || status.get('spoiler_text').length === 0;
+
+  return (
+    <div style={outerStyle}>
+      <div ref={handleRef} className={classNames('detailed-status')}>
+        {status.get('visibility') === 'direct' && (
+          <div className='status__prepend'>
+            <div className='status__prepend-icon-wrapper'>
+              <Icon
+                id='at'
+                icon={AlternateEmailIcon}
+                className='status__prepend-icon'
+              />
+            </div>
+            <FormattedMessage
+              id='status.direct_indicator'
+              defaultMessage='Private mention'
+            />
+          </div>
+        )}
+        <Link
+          to={`/@${status.getIn(['account', 'acct'])}`}
+          data-hover-card-account={status.getIn(['account', 'id'])}
+          className='detailed-status__display-name'
+        >
+          <div className='detailed-status__display-avatar'>
+            <Avatar account={status.get('account')} size={46} />
+          </div>
+          <DisplayName account={status.get('account')} localDomain={domain} />
+          {withLogo && (
+            <>
+              <div className='spacer' />
+              <IconLogo />
+            </>
+          )}
+        </Link>
+
+        {status.get('spoiler_text').length > 0 && (
+          <ContentWarning
+            text={
+              status.getIn(['translation', 'spoilerHtml']) ||
+              status.get('spoilerHtml')
+            }
+            expanded={expanded}
+            onClick={handleExpandedToggle}
+          />
+        )}
+
+        {expanded && (
+          <>
+            <StatusContent
+              status={status}
+              onTranslate={handleTranslate}
+              {...(statusContentProps as any)}
+            />
+
+            {media}
+            {hashtagBar}
+          </>
+        )}
+
+        <div className='detailed-status__meta'>
+          <div className='detailed-status__meta__line'>
+            <a
+              className='detailed-status__datetime'
+              href={`/@${status.getIn(['account', 'acct'])}/${status.get('id')}`}
+              target='_blank'
+              rel='noopener noreferrer'
+            >
+              <FormattedDate
+                value={new Date(status.get('created_at') as string)}
+                year='numeric'
+                month='short'
+                day='2-digit'
+                hour='2-digit'
+                minute='2-digit'
+              />
+            </a>
+
+            {visibilityLink}
+            {applicationLink}
+          </div>
+
+          {status.get('edited_at') && (
+            <div className='detailed-status__meta__line'>
+              <EditedTimestamp
+                statusId={status.get('id')}
+                timestamp={status.get('edited_at')}
+              />
+            </div>
+          )}
+
+          <div className='detailed-status__meta__line'>
+            {reblogLink}
+            {reblogLink && <>·</>}
+            {favouriteLink}
+          </div>
+        </div>
+      </div>
+    </div>
+  );
+};
diff --git a/app/javascript/mastodon/features/status/containers/detailed_status_container.js b/app/javascript/mastodon/features/status/containers/detailed_status_container.js
deleted file mode 100644
index 0e73697fef70c59d62f4e400173391613927ea52..0000000000000000000000000000000000000000
--- a/app/javascript/mastodon/features/status/containers/detailed_status_container.js
+++ /dev/null
@@ -1,140 +0,0 @@
-import { injectIntl } from 'react-intl';
-
-import { connect } from 'react-redux';
-
-import { showAlertForError } from '../../../actions/alerts';
-import { initBlockModal } from '../../../actions/blocks';
-import {
-  replyCompose,
-  mentionCompose,
-  directCompose,
-} from '../../../actions/compose';
-import {
-  toggleReblog,
-  toggleFavourite,
-  pin,
-  unpin,
-} from '../../../actions/interactions';
-import { openModal } from '../../../actions/modal';
-import { initMuteModal } from '../../../actions/mutes';
-import { initReport } from '../../../actions/reports';
-import {
-  muteStatus,
-  unmuteStatus,
-  deleteStatus,
-  toggleStatusSpoilers,
-} from '../../../actions/statuses';
-import { deleteModal } from '../../../initial_state';
-import { makeGetStatus, makeGetPictureInPicture } from '../../../selectors';
-import DetailedStatus from '../components/detailed_status';
-
-const makeMapStateToProps = () => {
-  const getStatus = makeGetStatus();
-  const getPictureInPicture = makeGetPictureInPicture();
-
-  const mapStateToProps = (state, props) => ({
-    status: getStatus(state, props),
-    domain: state.getIn(['meta', 'domain']),
-    pictureInPicture: getPictureInPicture(state, props),
-  });
-
-  return mapStateToProps;
-};
-
-const mapDispatchToProps = (dispatch) => ({
-
-  onReply (status) {
-    dispatch((_, getState) => {
-      let state = getState();
-      if (state.getIn(['compose', 'text']).trim().length !== 0) {
-        dispatch(openModal({ modalType: 'CONFIRM_REPLY', modalProps: { status } }));
-      } else {
-        dispatch(replyCompose(status));
-      }
-    });
-  },
-
-  onReblog (status, e) {
-    dispatch(toggleReblog(status.get('id'), e.shiftKey));
-  },
-
-  onFavourite (status) {
-    dispatch(toggleFavourite(status.get('id')));
-  },
-
-  onPin (status) {
-    if (status.get('pinned')) {
-      dispatch(unpin(status));
-    } else {
-      dispatch(pin(status));
-    }
-  },
-
-  onEmbed (status) {
-    dispatch(openModal({
-      modalType: 'EMBED',
-      modalProps: {
-        id: status.get('id'),
-        onError: error => dispatch(showAlertForError(error)),
-      },
-    }));
-  },
-
-  onDelete (status, withRedraft = false) {
-    if (!deleteModal) {
-      dispatch(deleteStatus(status.get('id'), withRedraft));
-    } else {
-      dispatch(openModal({ modalType: 'CONFIRM_DELETE_STATUS', modalProps: { statusId: status.get('id'), withRedraft } }));
-    }
-  },
-
-  onDirect (account) {
-    dispatch(directCompose(account));
-  },
-
-  onMention (account) {
-    dispatch(mentionCompose(account));
-  },
-
-  onOpenMedia (media, index, lang) {
-    dispatch(openModal({
-      modalType: 'MEDIA',
-      modalProps: { media, index, lang },
-    }));
-  },
-
-  onOpenVideo (media, lang, options) {
-    dispatch(openModal({
-      modalType: 'VIDEO',
-      modalProps: { media, lang, options },
-    }));
-  },
-
-  onBlock (status) {
-    const account = status.get('account');
-    dispatch(initBlockModal(account));
-  },
-
-  onReport (status) {
-    dispatch(initReport(status.get('account'), status));
-  },
-
-  onMute (account) {
-    dispatch(initMuteModal(account));
-  },
-
-  onMuteConversation (status) {
-    if (status.get('muted')) {
-      dispatch(unmuteStatus(status.get('id')));
-    } else {
-      dispatch(muteStatus(status.get('id')));
-    }
-  },
-
-  onToggleHidden (status) {
-    dispatch(toggleStatusSpoilers(status.get('id')));
-  },
-
-});
-
-export default injectIntl(connect(makeMapStateToProps, mapDispatchToProps)(DetailedStatus));
diff --git a/app/javascript/mastodon/features/status/index.jsx b/app/javascript/mastodon/features/status/index.jsx
index 5f325fe7b87601290e2b31ed8ad99d0b0494665e..c115f777559b30760adc5849241448c00233aa44 100644
--- a/app/javascript/mastodon/features/status/index.jsx
+++ b/app/javascript/mastodon/features/status/index.jsx
@@ -69,7 +69,7 @@ import Column from '../ui/components/column';
 import { attachFullscreenListener, detachFullscreenListener, isFullscreen } from '../ui/util/fullscreen';
 
 import ActionBar from './components/action_bar';
-import DetailedStatus from './components/detailed_status';
+import { DetailedStatus } from './components/detailed_status';
 
 
 const messages = defineMessages({
diff --git a/app/javascript/styles/application.scss b/app/javascript/styles/application.scss
index 0dd573da9ba736d2b66b40aad27fb27f6b18f6e2..465b748078f2e61bd6f5d3651c4d12f941235e1d 100644
--- a/app/javascript/styles/application.scss
+++ b/app/javascript/styles/application.scss
@@ -11,7 +11,6 @@
 @import 'mastodon/widgets';
 @import 'mastodon/forms';
 @import 'mastodon/accounts';
-@import 'mastodon/statuses';
 @import 'mastodon/components';
 @import 'mastodon/polls';
 @import 'mastodon/modal';
diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss
index 5a8fa3e5c0a3ab341fed68786a63a2720d959cac..c6ce8f55abb05a5658d194caa1849abcec85d483 100644
--- a/app/javascript/styles/mastodon/components.scss
+++ b/app/javascript/styles/mastodon/components.scss
@@ -1677,18 +1677,6 @@ body > [data-popper-placement] {
   padding: 16px;
   border-top: 1px solid var(--background-border-color);
 
-  &--flex {
-    display: flex;
-    flex-wrap: wrap;
-    justify-content: space-between;
-    align-items: flex-start;
-
-    .status__content,
-    .detailed-status__meta {
-      flex: 100%;
-    }
-  }
-
   .status__content {
     font-size: 19px;
     line-height: 24px;
@@ -1723,6 +1711,25 @@ body > [data-popper-placement] {
       margin-bottom: 0;
     }
   }
+
+  .logo {
+    width: 40px;
+    height: 40px;
+    color: $dark-text-color;
+  }
+}
+
+.embed {
+  position: relative;
+
+  &__overlay {
+    display: block;
+    position: absolute;
+    top: 0;
+    left: 0;
+    width: 100%;
+    height: 100%;
+  }
 }
 
 .scrollable > div:first-child .detailed-status {
diff --git a/app/javascript/styles/mastodon/statuses.scss b/app/javascript/styles/mastodon/statuses.scss
deleted file mode 100644
index b6d4f98cce529fda9eece7700f418601c70da496..0000000000000000000000000000000000000000
--- a/app/javascript/styles/mastodon/statuses.scss
+++ /dev/null
@@ -1,152 +0,0 @@
-.activity-stream {
-  box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);
-  border-radius: 4px;
-  overflow: hidden;
-  margin-bottom: 10px;
-
-  &--under-tabs {
-    border-radius: 0 0 4px 4px;
-  }
-
-  @media screen and (max-width: $no-gap-breakpoint) {
-    margin-bottom: 0;
-    border-radius: 0;
-    box-shadow: none;
-  }
-
-  &--headless {
-    border-radius: 0;
-    margin: 0;
-    box-shadow: none;
-
-    .detailed-status,
-    .status {
-      border-radius: 0 !important;
-    }
-  }
-
-  div[data-component] {
-    width: 100%;
-  }
-
-  .entry {
-    background: $ui-base-color;
-
-    .detailed-status,
-    .status,
-    .load-more {
-      animation: none;
-    }
-
-    &:last-child {
-      .detailed-status,
-      .status,
-      .load-more {
-        border-bottom: 0;
-        border-radius: 0 0 4px 4px;
-      }
-    }
-
-    &:first-child {
-      .detailed-status,
-      .status,
-      .load-more {
-        border-radius: 4px 4px 0 0;
-      }
-
-      &:last-child {
-        .detailed-status,
-        .status,
-        .load-more {
-          border-radius: 4px;
-        }
-      }
-    }
-
-    @media screen and (width <= 740px) {
-      .detailed-status,
-      .status,
-      .load-more {
-        border-radius: 0 !important;
-      }
-    }
-  }
-
-  &--highlighted .entry {
-    background: lighten($ui-base-color, 8%);
-  }
-}
-
-.button.logo-button svg {
-  width: 20px;
-  height: auto;
-  vertical-align: middle;
-  margin-inline-end: 5px;
-  fill: $primary-text-color;
-
-  @media screen and (max-width: $no-gap-breakpoint) {
-    display: none;
-  }
-}
-
-.embed {
-  .status__content[data-spoiler='folded'] {
-    .e-content {
-      display: none;
-    }
-
-    p:first-child {
-      margin-bottom: 0;
-    }
-  }
-
-  .detailed-status {
-    padding: 15px;
-
-    .detailed-status__display-avatar .account__avatar {
-      width: 48px;
-      height: 48px;
-    }
-  }
-
-  .status {
-    padding: 15px 15px 15px (48px + 15px * 2);
-    min-height: 48px + 2px;
-
-    &__avatar {
-      inset-inline-start: 15px;
-      top: 17px;
-
-      .account__avatar {
-        width: 48px;
-        height: 48px;
-      }
-    }
-
-    &__content {
-      padding-top: 5px;
-    }
-
-    &__prepend {
-      margin-inline-start: 48px + 15px * 2;
-      padding-top: 15px;
-    }
-
-    &__prepend-icon-wrapper {
-      inset-inline-start: -32px;
-    }
-
-    .media-gallery,
-    &__action-bar,
-    .video-player {
-      margin-top: 10px;
-    }
-
-    &__action-bar-button {
-      font-size: 18px;
-      width: 23.1429px;
-      height: 23.1429px;
-      line-height: 23.15px;
-    }
-  }
-}
diff --git a/app/serializers/oembed_serializer.rb b/app/serializers/oembed_serializer.rb
index d6261d72422b5dc94c0a3a8c371f80cd918eb180..3882b0e305759cc91062fa1ca7ebbb30dc79888b 100644
--- a/app/serializers/oembed_serializer.rb
+++ b/app/serializers/oembed_serializer.rb
@@ -37,16 +37,16 @@ class OEmbedSerializer < ActiveModel::Serializer
   end
 
   def html
-    attributes = {
-      src: embed_short_account_status_url(object.account, object),
-      class: 'mastodon-embed',
-      style: 'max-width: 100%; border: 0',
-      width: width,
-      height: height,
-      allowfullscreen: true,
-    }
-
-    content_tag(:iframe, nil, attributes) + content_tag(:script, nil, src: full_asset_url('embed.js', skip_pipeline: true), async: true)
+    <<~HTML.squish
+      <blockquote class="mastodon-embed" data-embed-url="#{embed_short_account_status_url(object.account, object)}" style="max-width: 540px; min-width: 270px; background:#FCF8FF; border: 1px solid #C9C4DA; border-radius: 8px; overflow: hidden; margin: 0; padding: 0;">
+        <a href="#{short_account_status_url(object.account, object)}" target="_blank" style="color: #1C1A25; text-decoration: none; display: flex; align-items: center; justify-content: center; flex-direction: column; padding: 24px; font-size: 14px; line-height: 20px; letter-spacing: 0.25px; font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Oxygen, Ubuntu, Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', Roboto, sans-serif;">
+          <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="32" height="32" viewBox="0 0 79 75"><path d="M74.7135 16.6043C73.6199 8.54587 66.5351 2.19527 58.1366 0.964691C56.7196 0.756754 51.351 0 38.9148 0H38.822C26.3824 0 23.7135 0.756754 22.2966 0.964691C14.1319 2.16118 6.67571 7.86752 4.86669 16.0214C3.99657 20.0369 3.90371 24.4888 4.06535 28.5726C4.29578 34.4289 4.34049 40.275 4.877 46.1075C5.24791 49.9817 5.89495 53.8251 6.81328 57.6088C8.53288 64.5968 15.4938 70.4122 22.3138 72.7848C29.6155 75.259 37.468 75.6697 44.9919 73.971C45.8196 73.7801 46.6381 73.5586 47.4475 73.3063C49.2737 72.7302 51.4164 72.086 52.9915 70.9542C53.0131 70.9384 53.0308 70.9178 53.0433 70.8942C53.0558 70.8706 53.0628 70.8445 53.0637 70.8179V65.1661C53.0634 65.1412 53.0574 65.1167 53.0462 65.0944C53.035 65.0721 53.0189 65.0525 52.9992 65.0371C52.9794 65.0218 52.9564 65.011 52.9318 65.0056C52.9073 65.0002 52.8819 65.0003 52.8574 65.0059C48.0369 66.1472 43.0971 66.7193 38.141 66.7103C29.6118 66.7103 27.3178 62.6981 26.6609 61.0278C26.1329 59.5842 25.7976 58.0784 25.6636 56.5486C25.6622 56.5229 25.667 56.4973 25.6775 56.4738C25.688 56.4502 25.7039 56.4295 25.724 56.4132C25.7441 56.397 25.7678 56.3856 25.7931 56.3801C25.8185 56.3746 25.8448 56.3751 25.8699 56.3816C30.6101 57.5151 35.4693 58.0873 40.3455 58.086C41.5183 58.086 42.6876 58.086 43.8604 58.0553C48.7647 57.919 53.9339 57.6701 58.7591 56.7361C58.8794 56.7123 58.9998 56.6918 59.103 56.6611C66.7139 55.2124 73.9569 50.665 74.6929 39.1501C74.7204 38.6967 74.7892 34.4016 74.7892 33.9312C74.7926 32.3325 75.3085 22.5901 74.7135 16.6043ZM62.9996 45.3371H54.9966V25.9069C54.9966 21.8163 53.277 19.7302 49.7793 19.7302C45.9343 19.7302 44.0083 22.1981 44.0083 27.0727V37.7082H36.0534V27.0727C36.0534 22.1981 34.124 19.7302 30.279 19.7302C26.8019 19.7302 25.0651 21.8163 25.0617 25.9069V45.3371H17.0656V25.3172C17.0656 21.2266 18.1191 17.9769 20.2262 15.568C22.3998 13.1648 25.2509 11.9308 28.7898 11.9308C32.8859 11.9308 35.9812 13.492 38.0447 16.6111L40.036 19.9245L42.0308 16.6111C44.0943 13.492 47.1896 11.9308 51.2788 11.9308C54.8143 11.9308 57.6654 13.1648 59.8459 15.568C61.9529 17.9746 63.0065 21.2243 63.0065 25.3172L62.9996 45.3371Z" fill="currentColor"/></svg>
+          <div style="margin-top: 16px; color: #787588;">Post by @#{object.account.pretty_acct}@#{provider_name}</div>
+          <div style="font-weight: 500;">View on Mastodon</div>
+        </a>
+      </blockquote>
+      <script data-allowed-prefixes="#{root_url}" src="#{full_asset_url('embed.js', skip_pipeline: true)}" async="true"></script>
+    HTML
   end
 
   def width
diff --git a/app/views/layouts/embedded.html.haml b/app/views/layouts/embedded.html.haml
index 9258e80833a0e3296f705604fdc0565069be0be9..0237e045153267cac9c61d0aba3c4be632ba27ba 100644
--- a/app/views/layouts/embedded.html.haml
+++ b/app/views/layouts/embedded.html.haml
@@ -15,7 +15,7 @@
     = javascript_pack_tag 'common', integrity: true, crossorigin: 'anonymous'
     = preload_pack_asset "locale/#{I18n.locale}-json.js"
     = render_initial_state
-    = javascript_pack_tag 'public', integrity: true, crossorigin: 'anonymous'
+    = javascript_pack_tag 'embed', integrity: true, crossorigin: 'anonymous'
   %body.embed
     = yield
 
diff --git a/app/views/statuses/_detailed_status.html.haml b/app/views/statuses/_detailed_status.html.haml
deleted file mode 100644
index 6cd240bbbcd7d4f67c1c97024d6094bc12e1310b..0000000000000000000000000000000000000000
--- a/app/views/statuses/_detailed_status.html.haml
+++ /dev/null
@@ -1,80 +0,0 @@
-.detailed-status.detailed-status--flex{ class: "detailed-status-#{status.visibility}" }
-  .p-author.h-card
-    = link_to ActivityPub::TagManager.instance.url_for(status.account), class: 'detailed-status__display-name u-url', target: stream_link_target, rel: 'noopener' do
-      .detailed-status__display-avatar
-        - if prefers_autoplay?
-          = image_tag status.account.avatar_original_url, alt: '', class: 'account__avatar u-photo'
-        - else
-          = image_tag status.account.avatar_static_url, alt: '', class: 'account__avatar u-photo'
-      %span.display-name
-        %bdi
-          %strong.display-name__html.p-name.emojify= display_name(status.account, custom_emojify: true, autoplay: prefers_autoplay?)
-        %span.display-name__account
-          = acct(status.account)
-          = material_symbol('lock') if status.account.locked?
-
-  = account_action_button(status.account)
-
-  .status__content.emojify{ data: ({ spoiler: current_account&.user&.setting_expand_spoilers ? 'expanded' : 'folded' } if status.spoiler_text?) }<
-    - if status.spoiler_text?
-      %p<
-        %span.p-summary> #{prerender_custom_emojis(h(status.spoiler_text), status.emojis)}&nbsp;
-        %button.status__content__spoiler-link= t('statuses.show_more')
-    .e-content{ lang: status.language }
-      = prerender_custom_emojis(status_content_format(status), status.emojis)
-
-      - if status.preloadable_poll
-        = render_poll_component(status)
-
-  - if !status.ordered_media_attachments.empty?
-    - if status.ordered_media_attachments.first.video?
-      = render_video_component(status, width: 670, height: 380, detailed: true)
-    - elsif status.ordered_media_attachments.first.audio?
-      = render_audio_component(status, width: 670, height: 380)
-    - else
-      = render_media_gallery_component(status, height: 380, standalone: true)
-  - elsif status.preview_card
-    = render_card_component(status)
-
-  .detailed-status__meta
-    %data.dt-published{ value: status.created_at.to_time.iso8601 }
-    - if status.edited?
-      %data.dt-updated{ value: status.edited_at.to_time.iso8601 }
-
-    = link_to ActivityPub::TagManager.instance.url_for(status), class: 'detailed-status__datetime u-url u-uid', target: stream_link_target, rel: 'noopener noreferrer' do
-      %time.formatted{ datetime: status.created_at.iso8601, title: l(status.created_at) }= l(status.created_at)
-    ·
-    - if status.edited?
-      = t('statuses.edited_at_html', date: content_tag(:time, l(status.edited_at), datetime: status.edited_at.iso8601, title: l(status.edited_at), class: 'formatted'))
-      ·
-    %span.detailed-status__visibility-icon
-      = visibility_icon status
-    ·
-    - if status.application && status.account.user&.setting_show_application
-      - if status.application.website.blank?
-        %strong.detailed-status__application= status.application.name
-      - else
-        = link_to status.application.name, status.application.website, class: 'detailed-status__application', target: '_blank', rel: 'noopener noreferrer'
-      ·
-    %span.detailed-status__link
-      - if status.in_reply_to_id.nil?
-        = material_symbol('reply')
-      - else
-        = material_symbol('reply_all')
-      %span.detailed-status__reblogs>= friendly_number_to_human status.replies_count
-      &nbsp;
-    ·
-    - if status.public_visibility? || status.unlisted_visibility?
-      %span.detailed-status__link
-        = material_symbol('repeat')
-        %span.detailed-status__reblogs>= friendly_number_to_human status.reblogs_count
-        &nbsp;
-      ·
-    %span.detailed-status__link
-      = material_symbol('star')
-      %span.detailed-status__favorites>= friendly_number_to_human status.favourites_count
-      &nbsp;
-
-    - if user_signed_in?
-      ·
-      = link_to t('statuses.open_in_web'), web_url("@#{status.account.pretty_acct}/#{status.id}"), class: 'detailed-status__application', target: '_blank', rel: 'noopener noreferrer'
diff --git a/app/views/statuses/_poll.html.haml b/app/views/statuses/_poll.html.haml
deleted file mode 100644
index 62416a44da6dfd1c697e0d3230edbaa899ad2687..0000000000000000000000000000000000000000
--- a/app/views/statuses/_poll.html.haml
+++ /dev/null
@@ -1,36 +0,0 @@
-:ruby
-  show_results = (user_signed_in? && poll.voted?(current_account)) || poll.expired?
-  total_votes_count = poll.voters_count || poll.votes_count
-
-.poll
-  %ul
-    - poll.loaded_options.each do |option|
-      %li
-        - if show_results
-          - percent = total_votes_count.positive? ? 100 * option.votes_count / total_votes_count : 0
-          %label.poll__option><
-            %span.poll__number><
-              #{percent.round}%
-            %span.poll__option__text
-              = prerender_custom_emojis(h(option.title), status.emojis)
-
-          %progress{ max: 100, value: [percent, 1].max, 'aria-hidden': 'true' }
-            %span.poll__chart
-        - else
-          %label.poll__option><
-            %span.poll__input{ class: poll.multiple? ? 'checkbox' : nil }><
-            %span.poll__option__text
-              = prerender_custom_emojis(h(option.title), status.emojis)
-  .poll__footer
-    - unless show_results
-      %button.button.button-secondary{ disabled: true }
-        = t('statuses.poll.vote')
-
-    - if poll.voters_count.nil?
-      %span= t('statuses.poll.total_votes', count: poll.votes_count)
-    - else
-      %span= t('statuses.poll.total_people', count: poll.voters_count)
-
-    - unless poll.expires_at.nil?
-      ·
-      %span= l poll.expires_at
diff --git a/app/views/statuses/_simple_status.html.haml b/app/views/statuses/_simple_status.html.haml
deleted file mode 100644
index ee7900fbfafaa029cce1bea6cc3351b16fe374b8..0000000000000000000000000000000000000000
--- a/app/views/statuses/_simple_status.html.haml
+++ /dev/null
@@ -1,70 +0,0 @@
-:ruby
-  hide_show_thread ||= false
-
-.status{ class: "status-#{status.visibility}" }
-  .status__info
-    = link_to ActivityPub::TagManager.instance.url_for(status), class: 'status__relative-time u-url u-uid', target: stream_link_target, rel: 'noopener noreferrer' do
-      %span.status__visibility-icon><
-        = visibility_icon status
-      %time.time-ago{ datetime: status.created_at.iso8601, title: l(status.created_at) }= l(status.created_at)
-      - if status.edited?
-        %abbr{ title: t('statuses.edited_at_html', date: l(status.edited_at.to_date)) }
-          *
-    %data.dt-published{ value: status.created_at.to_time.iso8601 }
-
-    .p-author.h-card
-      = link_to ActivityPub::TagManager.instance.url_for(status.account), class: 'status__display-name u-url', target: stream_link_target, rel: 'noopener noreferrer' do
-        .status__avatar
-          %div
-            - if prefers_autoplay?
-              = image_tag status.account.avatar_original_url, alt: '', class: 'u-photo account__avatar'
-            - else
-              = image_tag status.account.avatar_static_url, alt: '', class: 'u-photo account__avatar'
-        %span.display-name
-          %bdi
-            %strong.display-name__html.p-name.emojify= display_name(status.account, custom_emojify: true, autoplay: prefers_autoplay?)
-          &nbsp;
-          %span.display-name__account
-            = acct(status.account)
-            = material_symbol('lock') if status.account.locked?
-  .status__content.emojify{ data: ({ spoiler: current_account&.user&.setting_expand_spoilers ? 'expanded' : 'folded' } if status.spoiler_text?) }<
-    - if status.spoiler_text?
-      %p<
-        %span.p-summary> #{prerender_custom_emojis(h(status.spoiler_text), status.emojis)}&nbsp;
-        %button.status__content__spoiler-link= t('statuses.show_more')
-    .e-content{ lang: status.language }
-      = prerender_custom_emojis(status_content_format(status), status.emojis)
-
-      - if status.preloadable_poll
-        = render_poll_component(status)
-
-  - if !status.ordered_media_attachments.empty?
-    - if status.ordered_media_attachments.first.video?
-      = render_video_component(status, width: 610, height: 343)
-    - elsif status.ordered_media_attachments.first.audio?
-      = render_audio_component(status, width: 610, height: 343)
-    - else
-      = render_media_gallery_component(status, height: 343)
-  - elsif status.preview_card
-    = render_card_component(status)
-
-  - if !status.in_reply_to_id.nil? && status.in_reply_to_account_id == status.account.id && !hide_show_thread
-    = link_to ActivityPub::TagManager.instance.url_for(status), class: 'status__content__read-more-button', target: stream_link_target, rel: 'noopener noreferrer' do
-      = t 'statuses.show_thread'
-
-  .status__action-bar
-    %span.status__action-bar-button.icon-button.icon-button--with-counter
-      - if status.in_reply_to_id.nil?
-        = material_symbol 'reply'
-      - else
-        = material_symbol 'reply_all'
-      %span.icon-button__counter= obscured_counter status.replies_count
-    %span.status__action-bar-button.icon-button
-      - if status.distributable?
-        = material_symbol 'repeat'
-      - elsif status.private_visibility? || status.limited_visibility?
-        = material_symbol 'lock'
-      - else
-        = material_symbol 'alternate_email'
-    %span.status__action-bar-button.icon-button
-      = material_symbol 'star'
diff --git a/app/views/statuses/_status.html.haml b/app/views/statuses/_status.html.haml
deleted file mode 100644
index bf51b5ff7da3d6ed9883c9dc0ae2fe93142b90f7..0000000000000000000000000000000000000000
--- a/app/views/statuses/_status.html.haml
+++ /dev/null
@@ -1,2 +0,0 @@
-.entry
-  = render (centered ? 'statuses/detailed_status' : 'statuses/simple_status'), status: status.proper, hide_show_thread: false
diff --git a/app/views/statuses/embed.html.haml b/app/views/statuses/embed.html.haml
index 18d62fd8e37a977e2761b0ca96bcdab6c6f622ef..09d0792ea2549e9b2294f7d6ebb61624d73a14be 100644
--- a/app/views/statuses/embed.html.haml
+++ b/app/views/statuses/embed.html.haml
@@ -1,2 +1 @@
-.activity-stream.activity-stream--headless
-  = render 'status', status: @status, centered: true
+#mastodon-status{ data: { props: Oj.dump(default_props.merge(id: @status.id.to_s)) } }
diff --git a/config/locales/af.yml b/config/locales/af.yml
index 648ec6091d495fc25bd7e7e074d930cd10a24a7e..89ede096e28daff2c2a850bdcf0c3244096eca02 100644
--- a/config/locales/af.yml
+++ b/config/locales/af.yml
@@ -6,7 +6,6 @@ af:
     hosted_on: Mastodon gehuisves op %{domain}
     title: Aangaande
   accounts:
-    follow: Volg
     followers:
       one: Volgeling
       other: Volgelinge
diff --git a/config/locales/an.yml b/config/locales/an.yml
index 41eeee461465eb92539ad4a5a6e0e70a61afd755..589bb39836c56752a688fef0e3a14bdf7bbe4a0f 100644
--- a/config/locales/an.yml
+++ b/config/locales/an.yml
@@ -7,7 +7,6 @@ an:
     hosted_on: Mastodon alochau en %{domain}
     title: Sobre
   accounts:
-    follow: Seguir
     followers:
       one: Seguidor
       other: Seguidores
@@ -1410,23 +1409,12 @@ an:
     edited_at_html: Editau %{date}
     errors:
       in_reply_not_found: Lo estau a lo qual intentas responder no existe.
-    open_in_web: Ubrir en web
     over_character_limit: Limite de caracters de %{max} superau
     pin_errors:
       direct: Las publicacions que son visibles solo pa los usuarios mencionaus no pueden fixar-se
       limit: Ya has fixau lo numero maximo de publicacions
       ownership: La publicación d'unatra persona no puede fixar-se
       reblog: Un boost no puede fixar-se
-    poll:
-      total_people:
-        one: "%{count} persona"
-        other: "%{count} chent"
-      total_votes:
-        one: "%{count} voto"
-        other: "%{count} votos"
-      vote: Vota
-    show_more: Amostrar mas
-    show_thread: Amostrar discusión
     title: "%{name}: «%{quote}»"
     visibilities:
       direct: Directa
diff --git a/config/locales/ar.yml b/config/locales/ar.yml
index 06cea7ecb3b48d4894c2fd7a37cd8abd6214d5f9..480feeba2d1ac5e8be539a3c7613e41d07e0500b 100644
--- a/config/locales/ar.yml
+++ b/config/locales/ar.yml
@@ -7,7 +7,6 @@ ar:
     hosted_on: ماستدون مُستضاف على %{domain}
     title: عن
   accounts:
-    follow: متابَعة
     followers:
       few: متابِعون
       many: متابِعون
@@ -1772,31 +1771,12 @@ ar:
     edited_at_html: عُدّل في %{date}
     errors:
       in_reply_not_found: إنّ المنشور الذي تحاول الرد عليه غير موجود على ما يبدو.
-    open_in_web: افتح في الويب
     over_character_limit: تم تجاوز حد الـ %{max} حرف المسموح بها
     pin_errors:
       direct: لا يمكن تثبيت المنشورات التي يراها فقط المتسخدمون المشار إليهم
       limit: لقد بلغت الحد الأقصى للمنشورات المثبتة
       ownership: لا يمكن تثبيت منشور نشره شخص آخر
       reblog: لا يمكن تثبيت إعادة نشر
-    poll:
-      total_people:
-        few: "%{count} أشخاص"
-        many: "%{count} أشخاص"
-        one: "%{count} شخص واحد"
-        other: "%{count} شخصا"
-        two: "%{count} شخصين"
-        zero: "%{count} شخص"
-      total_votes:
-        few: "%{count} أصوات"
-        many: "%{count} أصوات"
-        one: صوت واحد %{count}
-        other: "%{count} صوتا"
-        two: صوتين %{count}
-        zero: بدون صوت %{count}
-      vote: صوّت
-    show_more: أظهر المزيد
-    show_thread: اعرض خيط المحادثة
     title: '%{name}: "%{quote}"'
     visibilities:
       direct: مباشرة
diff --git a/config/locales/ast.yml b/config/locales/ast.yml
index 70a0ad3bddeee1d19342db707dc46ead03729f3b..be3441507eacfb195761c3b5772d6c29c0280f39 100644
--- a/config/locales/ast.yml
+++ b/config/locales/ast.yml
@@ -800,20 +800,11 @@ ast:
     default_language: La mesma que la de la interfaz
     errors:
       in_reply_not_found: L'artículu al que tentes de responder paez que nun esiste.
-    open_in_web: Abrir na web
     pin_errors:
       direct: Nun se puen fixar los artículos que son visibles namás pa los usuarios mentaos
       limit: Yá fixesti'l númberu máximu d'artículos
       ownership: Nun se pue fixar l'artículu d'otru perfil
       reblog: Nun se pue fixar un artículu compartíu
-    poll:
-      total_people:
-        one: "%{count} persona"
-        other: "%{count} persones"
-      total_votes:
-        one: "%{count} votu"
-        other: "%{count} votos"
-    show_more: Amosar más
     title: "%{name}: «%{quote}»"
     visibilities:
       direct: Mensaxe direutu
diff --git a/config/locales/be.yml b/config/locales/be.yml
index 31a31e9e61a520c598a1decf83c5efd1c6d34fc7..48ca5751cc806ddb7e1027cdb7ce64a8961c5ef3 100644
--- a/config/locales/be.yml
+++ b/config/locales/be.yml
@@ -7,7 +7,6 @@ be:
     hosted_on: Mastodon месціцца на %{domain}
     title: Пра нас
   accounts:
-    follow: Падпісацца
     followers:
       few: Падпісчыка
       many: Падпісчыкаў
@@ -1778,27 +1777,12 @@ be:
     edited_at_html: Адрэдагавана %{date}
     errors:
       in_reply_not_found: Здаецца, допіс, на які вы спрабуеце адказаць, не існуе.
-    open_in_web: Адчыніць у вэб-версіі
     over_character_limit: перавышаная колькасць сімвалаў у %{max}
     pin_errors:
       direct: Допісы, бачныя толькі згаданым карыстальнікам, не могуць быць замацаваныя
       limit: Вы ўжо замацавалі максімальную колькасць допісаў
       ownership: Немагчыма замацаваць чужы допіс
       reblog: Немагчыма замацаваць пашырэнне
-    poll:
-      total_people:
-        few: "%{count} чалавекі"
-        many: "%{count} чалавек"
-        one: "%{count} чалавек"
-        other: "%{count} чалавека"
-      total_votes:
-        few: "%{count} галасы"
-        many: "%{count} галасоў"
-        one: "%{count} голас"
-        other: "%{count} голасу"
-      vote: Прагаласаваць
-    show_more: Паказаць больш
-    show_thread: Паказаць ланцуг
     title: '%{name}: "%{quote}"'
     visibilities:
       direct: Асабіста
diff --git a/config/locales/bg.yml b/config/locales/bg.yml
index 42a626c695e3142e26472f109616033a16b663ee..604eeca4808ba92709f6af474af931a207f84c87 100644
--- a/config/locales/bg.yml
+++ b/config/locales/bg.yml
@@ -7,7 +7,6 @@ bg:
     hosted_on: Mastodon е разположен на хост %{domain}
     title: Относно
   accounts:
-    follow: Последване
     followers:
       one: Последовател
       other: Последователи
@@ -1664,23 +1663,12 @@ bg:
     edited_at_html: Редактирано на %{date}
     errors:
       in_reply_not_found: Изглежда, че публикацията, на която се опитвате да отговорите, не съществува.
-    open_in_web: Отвори в уеб
     over_character_limit: прехвърлен лимит от %{max} символа
     pin_errors:
       direct: Публикациите, които са видими само за потребители споменати в тях, не могат да бъдат закачани
       limit: Вече сте закачили максималния брой публикации
       ownership: Публикация на някого другиго не може да бъде закачена
       reblog: Раздуване не може да бъде закачано
-    poll:
-      total_people:
-        one: "%{count} човек"
-        other: "%{count} души"
-      total_votes:
-        one: "%{count} глас"
-        other: "%{count} гласа"
-      vote: Гласуване
-    show_more: Покажи повече
-    show_thread: Показване на нишката
     title: "%{name}: „%{quote}“"
     visibilities:
       direct: Директно
diff --git a/config/locales/bn.yml b/config/locales/bn.yml
index edbef73ae257e3fea738d5ed651b88daa664d560..74ff25d754d8b6a130026c31554744e0462b0dfc 100644
--- a/config/locales/bn.yml
+++ b/config/locales/bn.yml
@@ -7,7 +7,6 @@ bn:
     hosted_on: এই মাস্টাডনটি আছে %{domain} এ
     title: পরিচিতি
   accounts:
-    follow: যুক্ত
     followers:
       one: যুক্ত আছে
       other: যারা যুক্ত হয়েছে
diff --git a/config/locales/br.yml b/config/locales/br.yml
index 4ef8fa1a18cfdbdadc677226993f646350384f24..f9fbd34adb55cbee8139f3abdc21e0a63a39f011 100644
--- a/config/locales/br.yml
+++ b/config/locales/br.yml
@@ -6,7 +6,6 @@ br:
     hosted_on: Servijer Mastodon herberc'hiet war %{domain}
     title: Diwar-benn
   accounts:
-    follow: Heuliañ
     followers:
       few: Heulier·ez
       many: Heulier·ez
@@ -519,9 +518,6 @@ br:
         two: "%{count} skeudenn"
     pin_errors:
       ownership: N'hallit ket spilhennañ embannadurioù ar re all
-    poll:
-      vote: Mouezhiañ
-    show_more: Diskouez muioc'h
     visibilities:
       direct: War-eeun
       public: Publik
diff --git a/config/locales/ca.yml b/config/locales/ca.yml
index 63654ae708ffea0a2c0d74a6d0f25a849421963b..d985a2ac42f85841f45ab5205a0fd1c6c8abf986 100644
--- a/config/locales/ca.yml
+++ b/config/locales/ca.yml
@@ -7,7 +7,6 @@ ca:
     hosted_on: Mastodon allotjat a %{domain}
     title: Quant a
   accounts:
-    follow: Segueix
     followers:
       one: Seguidor
       other: Seguidors
@@ -1734,23 +1733,12 @@ ca:
     edited_at_html: Editat %{date}
     errors:
       in_reply_not_found: El tut al qual intentes respondre sembla que no existeix.
-    open_in_web: Obre en la web
     over_character_limit: Límit de caràcters de %{max} superat
     pin_errors:
       direct: Els tuts que només són visibles per als usuaris mencionats no poden ser fixats
       limit: Ja has fixat el màxim nombre de tuts
       ownership: No es pot fixar el tut d'algú altre
       reblog: No es pot fixar un impuls
-    poll:
-      total_people:
-        one: "%{count} persona"
-        other: "%{count} persones"
-      total_votes:
-        one: "%{count} vot"
-        other: "%{count} vots"
-      vote: Vota
-    show_more: Mostra'n més
-    show_thread: Mostra el fil
     title: '%{name}: "%{quote}"'
     visibilities:
       direct: Directe
diff --git a/config/locales/ckb.yml b/config/locales/ckb.yml
index 3ecef4bb4df7918ecd8cb8d672c65f0892292db9..8af3d8638831aa502d440314be34f6b5a2b32c8b 100644
--- a/config/locales/ckb.yml
+++ b/config/locales/ckb.yml
@@ -7,7 +7,6 @@ ckb:
     hosted_on: مەستودۆن میوانداری کراوە لە %{domain}
     title: دەربارە
   accounts:
-    follow: شوێن کەوە
     followers:
       one: شوێنکەوتوو
       other: شوێن‌کەوتووان
@@ -938,22 +937,11 @@ ckb:
       other: 'هاشتاگەکانی ڕێگەپێنەدراوەی تێدابوو: %{tags}'
     errors:
       in_reply_not_found: ئەو دۆخەی کە تۆ هەوڵی وەڵامدانەوەی دەدەیت وادەرناکەوێت کە هەبێت.
-    open_in_web: کردنەوە لە وێب
     over_character_limit: سنووری نووسەی %{max} تێپەڕێنرا
     pin_errors:
       limit: تۆ پێشتر زۆرترین ژمارەی توتتی چەسپیوەت هەیە
       ownership: نووسراوەکانی تر ناتوانرێ بسەلمێت
       reblog: بەهێزکردن ناتوانرێت بچەسپێ
-    poll:
-      total_people:
-        one: "%{count} کەس"
-        other: "%{count} خەڵک"
-      total_votes:
-        one: "%{count} دەنگ"
-        other: "%{count} دەنگەکان"
-      vote: دەنگ
-    show_more: زیاتر پیشان بدە
-    show_thread: نیشاندانی ڕشتە
     visibilities:
       private: شوێنکەوتوانی تەنها
       private_long: تەنها بۆ شوێنکەوتوانی پیشان بدە
diff --git a/config/locales/co.yml b/config/locales/co.yml
index 7c0695a7704d8ae751d799aa09dab25ae27e8e07..b072e5e4eff0f7c0a20cfe34cf9dcdd137f54eca 100644
--- a/config/locales/co.yml
+++ b/config/locales/co.yml
@@ -6,7 +6,6 @@ co:
     contact_unavailable: Micca dispunibule
     hosted_on: Mastodon allughjatu nant’à %{domain}
   accounts:
-    follow: Siguità
     followers:
       one: Abbunatu·a
       other: Abbunati
@@ -922,22 +921,11 @@ co:
       other: 'cuntene l’hashtag disattivati: %{tags}'
     errors:
       in_reply_not_found: U statutu à quellu avete pruvatu di risponde ùn sembra micca esiste.
-    open_in_web: Apre nant’à u web
     over_character_limit: site sopr’à a limita di %{max} caratteri
     pin_errors:
       limit: Avete digià puntarulatu u numeru massimale di statuti
       ownership: Pudete puntarulà solu unu di i vostri propii statuti
       reblog: Ùn pudete micca puntarulà una spartera
-    poll:
-      total_people:
-        one: "%{count} persona"
-        other: "%{count} persone"
-      total_votes:
-        one: "%{count} votu"
-        other: "%{count} voti"
-      vote: Vutà
-    show_more: Vede di più
-    show_thread: Vede u filu
     title: '%{name}: "%{quote}"'
     visibilities:
       direct: Direttu
diff --git a/config/locales/cs.yml b/config/locales/cs.yml
index 7d4d2296caf2afc865ef058b7b0c2661266189ec..1000442870cc35ac19ab26253e4fcd1c8f8e09a2 100644
--- a/config/locales/cs.yml
+++ b/config/locales/cs.yml
@@ -7,7 +7,6 @@ cs:
     hosted_on: Mastodon na doméně %{domain}
     title: O aplikaci
   accounts:
-    follow: Sledovat
     followers:
       few: Sledující
       many: Sledujících
@@ -1721,27 +1720,12 @@ cs:
     edited_at_html: Upraven %{date}
     errors:
       in_reply_not_found: Příspěvek, na který se pokoušíte odpovědět, neexistuje.
-    open_in_web: Otevřít na webu
     over_character_limit: byl překročen limit %{max} znaků
     pin_errors:
       direct: Příspěvky viditelné pouze zmíněným uživatelům nelze připnout
       limit: Už jste si připnuli maximální počet příspěvků
       ownership: Nelze připnout příspěvek někoho jiného
       reblog: Boosty nelze připnout
-    poll:
-      total_people:
-        few: "%{count} lidé"
-        many: "%{count} lidí"
-        one: "%{count} člověk"
-        other: "%{count} lidí"
-      total_votes:
-        few: "%{count} hlasy"
-        many: "%{count} hlasů"
-        one: "%{count} hlas"
-        other: "%{count} hlasů"
-      vote: Hlasovat
-    show_more: Zobrazit více
-    show_thread: Zobrazit vlákno
     title: "%{name}: „%{quote}“"
     visibilities:
       direct: Přímé
diff --git a/config/locales/cy.yml b/config/locales/cy.yml
index 2e425bb4979c75d05f77813efd410cd454556ec8..9d3c0c82f352d34c87f1d6b23d2bd8d9b5b7843e 100644
--- a/config/locales/cy.yml
+++ b/config/locales/cy.yml
@@ -7,7 +7,6 @@ cy:
     hosted_on: Mastodon wedi ei weinyddu ar %{domain}
     title: Ynghylch
   accounts:
-    follow: Dilyn
     followers:
       few: Dilynwyr
       many: Dilynwyr
@@ -1860,31 +1859,12 @@ cy:
     edited_at_html: Wedi'i olygu %{date}
     errors:
       in_reply_not_found: Nid yw'n ymddangos bod y postiad rydych chi'n ceisio ei ateb yn bodoli.
-    open_in_web: Agor yn y we
     over_character_limit: wedi mynd y tu hwnt i'r terfyn nodau o %{max}
     pin_errors:
       direct: Nid oes modd pinio postiadau sy'n weladwy i ddefnyddwyr a grybwyllwyd yn unig
       limit: Rydych chi eisoes wedi pinio uchafswm nifer y postiadau
       ownership: Nid oes modd pinio postiad rhywun arall
       reblog: Nid oes modd pinio hwb
-    poll:
-      total_people:
-        few: "%{count} person"
-        many: "%{count} person"
-        one: "%{count} berson"
-        other: "%{count} person"
-        two: "%{count} person"
-        zero: "%{count} o bersonau"
-      total_votes:
-        few: "%{count} pleidlais"
-        many: "%{count} pleidlais"
-        one: "%{count} bleidlais"
-        other: "%{count} pleidlais"
-        two: "%{count} pleidlais"
-        zero: "%{count} o bleidleisiau"
-      vote: Pleidlais
-    show_more: Dangos mwy
-    show_thread: Dangos edefyn
     title: '%{name}: "%{quote}"'
     visibilities:
       direct: Uniongyrchol
diff --git a/config/locales/da.yml b/config/locales/da.yml
index 731c1f0b404ef70a0050f5d506e894e6a3136e57..6f781742a85ecb958422b2c5fc5b16d91cf28a42 100644
--- a/config/locales/da.yml
+++ b/config/locales/da.yml
@@ -7,7 +7,6 @@ da:
     hosted_on: Mastodon hostet på %{domain}
     title: Om
   accounts:
-    follow: Følg
     followers:
       one: Følger
       other: tilhængere
@@ -1740,23 +1739,12 @@ da:
     edited_at_html: Redigeret %{date}
     errors:
       in_reply_not_found: Indlægget, der forsøges besvaret, ser ikke ud til at eksistere.
-    open_in_web: Ã…bn i webbrowser
     over_character_limit: grænsen på %{max} tegn overskredet
     pin_errors:
       direct: Indlæg, som kun kan ses af omtalte brugere, kan ikke fastgøres
       limit: Maksimalt antal indlæg allerede fastgjort
       ownership: Andres indlæg kan ikke fastgøres
       reblog: Et boost kan ikke fastgøres
-    poll:
-      total_people:
-        one: "%{count} person"
-        other: "%{count} personer"
-      total_votes:
-        one: "%{count} stemme"
-        other: "%{count} stemmer"
-      vote: Stem
-    show_more: Vis flere
-    show_thread: Vis tråd
     title: '%{name}: "%{quote}"'
     visibilities:
       direct: Direkte
diff --git a/config/locales/de.yml b/config/locales/de.yml
index cc049c59031e88308b9ba32b7bdfe098c202dd6a..040ddaaf6903bf2450cc6271af94090c8738715c 100644
--- a/config/locales/de.yml
+++ b/config/locales/de.yml
@@ -7,7 +7,6 @@ de:
     hosted_on: Mastodon, gehostet auf %{domain}
     title: Ãœber
   accounts:
-    follow: Folgen
     followers:
       one: Follower
       other: Follower
@@ -1740,23 +1739,12 @@ de:
     edited_at_html: 'Bearbeitet: %{date}'
     errors:
       in_reply_not_found: Der Beitrag, auf den du antworten möchtest, scheint nicht zu existieren.
-    open_in_web: Im Webinterface öffnen
     over_character_limit: Begrenzung von %{max} Zeichen überschritten
     pin_errors:
       direct: Beiträge, die nur für erwähnte Profile sichtbar sind, können nicht angeheftet werden
       limit: Du hast bereits die maximale Anzahl an Beiträgen angeheftet
       ownership: Du kannst nur eigene Beiträge anheften
       reblog: Du kannst keine geteilten Beiträge anheften
-    poll:
-      total_people:
-        one: "%{count} Stimme"
-        other: "%{count} Stimmen"
-      total_votes:
-        one: "%{count} Stimme"
-        other: "%{count} Stimmen"
-      vote: Abstimmen
-    show_more: Mehr anzeigen
-    show_thread: Thread anzeigen
     title: "%{name}: „%{quote}“"
     visibilities:
       direct: Direktnachricht
diff --git a/config/locales/el.yml b/config/locales/el.yml
index 3cb9075c386b170e656efc08b76d01a19fdae327..1f408e26ea96b703c46a36d233cead7ed65ed9d7 100644
--- a/config/locales/el.yml
+++ b/config/locales/el.yml
@@ -7,7 +7,6 @@ el:
     hosted_on: Το Mastodon φιλοξενείται στο %{domain}
     title: Σχετικά
   accounts:
-    follow: Ακολούθησε
     followers:
       one: Ακόλουθος
       other: Ακόλουθοι
@@ -1636,23 +1635,12 @@ el:
     edited_at_html: Επεξεργάστηκε στις %{date}
     errors:
       in_reply_not_found: Η ανάρτηση στην οποία προσπαθείς να απαντήσεις δεν φαίνεται να υπάρχει.
-    open_in_web: Άνοιγμα στο διαδίκτυο
     over_character_limit: υπέρβαση μέγιστου ορίου %{max} χαρακτήρων
     pin_errors:
       direct: Αναρτήσεις που είναι ορατές μόνο στους αναφερόμενους χρήστες δεν μπορούν να καρφιτσωθούν
       limit: Έχεις ήδη καρφιτσώσει το μέγιστο αριθμό επιτρεπτών αναρτήσεων
       ownership: Δεν μπορείς να καρφιτσώσεις ανάρτηση κάποιου άλλου
       reblog: Οι ενισχύσεις δεν καρφιτσώνονται
-    poll:
-      total_people:
-        one: "%{count} άτομο"
-        other: "%{count} άτομα"
-      total_votes:
-        one: "%{count} ψήφος"
-        other: "%{count} ψήφοι"
-      vote: Ψήφισε
-    show_more: Δείξε περισσότερα
-    show_thread: Εμφάνιση νήματος
     title: '%{name}: "%{quote}"'
     visibilities:
       direct: Άμεση
diff --git a/config/locales/en-GB.yml b/config/locales/en-GB.yml
index dc07dcff0bbe1c86f4459c62bb1e532c9082e200..56255f5d7ae9e181990250caba163e85ea70d999 100644
--- a/config/locales/en-GB.yml
+++ b/config/locales/en-GB.yml
@@ -7,7 +7,6 @@ en-GB:
     hosted_on: Mastodon hosted on %{domain}
     title: About
   accounts:
-    follow: Follow
     followers:
       one: Follower
       other: Followers
@@ -1740,23 +1739,12 @@ en-GB:
     edited_at_html: Edited %{date}
     errors:
       in_reply_not_found: The post you are trying to reply to does not appear to exist.
-    open_in_web: Open in web
     over_character_limit: character limit of %{max} exceeded
     pin_errors:
       direct: Posts that are only visible to mentioned users cannot be pinned
       limit: You have already pinned the maximum number of posts
       ownership: Someone else's post cannot be pinned
       reblog: A boost cannot be pinned
-    poll:
-      total_people:
-        one: "%{count} person"
-        other: "%{count} people"
-      total_votes:
-        one: "%{count} vote"
-        other: "%{count} votes"
-      vote: Vote
-    show_more: Show more
-    show_thread: Show thread
     title: '%{name}: "%{quote}"'
     visibilities:
       direct: Direct
diff --git a/config/locales/en.yml b/config/locales/en.yml
index 05300acea5afc88f4501d421c175477d29e4fd59..b1c100da0c6fda875d63983b400f2ee340664640 100644
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -7,7 +7,6 @@ en:
     hosted_on: Mastodon hosted on %{domain}
     title: About
   accounts:
-    follow: Follow
     followers:
       one: Follower
       other: Followers
@@ -1741,23 +1740,12 @@ en:
     edited_at_html: Edited %{date}
     errors:
       in_reply_not_found: The post you are trying to reply to does not appear to exist.
-    open_in_web: Open in web
     over_character_limit: character limit of %{max} exceeded
     pin_errors:
       direct: Posts that are only visible to mentioned users cannot be pinned
       limit: You have already pinned the maximum number of posts
       ownership: Someone else's post cannot be pinned
       reblog: A boost cannot be pinned
-    poll:
-      total_people:
-        one: "%{count} person"
-        other: "%{count} people"
-      total_votes:
-        one: "%{count} vote"
-        other: "%{count} votes"
-      vote: Vote
-    show_more: Show more
-    show_thread: Show thread
     title: '%{name}: "%{quote}"'
     visibilities:
       direct: Direct
diff --git a/config/locales/eo.yml b/config/locales/eo.yml
index c1873c2f24d0c8f600bb8f700076def84f8a81cd..46c6cbcf8669083e12dcbca2ca9b59ce6b73a165 100644
--- a/config/locales/eo.yml
+++ b/config/locales/eo.yml
@@ -7,7 +7,6 @@ eo:
     hosted_on: "%{domain} estas nodo de Mastodon"
     title: Pri
   accounts:
-    follow: Sekvi
     followers:
       one: Sekvanto
       other: Sekvantoj
@@ -1553,23 +1552,12 @@ eo:
     edited_at_html: Redaktis je %{date}
     errors:
       in_reply_not_found: Mesaĝo kiun vi provas respondi ŝajnas ne ekzisti.
-    open_in_web: Malfermi retumile
     over_character_limit: limo de %{max} signoj transpasita
     pin_errors:
       direct: Mesaĝoj kiu videbla nun al la uzantoj ne povas alpinglitis
       limit: Vi jam atingis la maksimuman nombron de alpinglitaj mesaĝoj
       ownership: Mesaĝo de iu alia ne povas esti alpinglita
       reblog: Diskonigo ne povas esti alpinglita
-    poll:
-      total_people:
-        one: "%{count} persono"
-        other: "%{count} personoj"
-      total_votes:
-        one: "%{count} voĉdono"
-        other: "%{count} voĉdonoj"
-      vote: Voĉdoni
-    show_more: Montri pli
-    show_thread: Montri la mesaĝaron
     title: "%{name}: “%{quote}”"
     visibilities:
       direct: Rekta
diff --git a/config/locales/es-AR.yml b/config/locales/es-AR.yml
index 63d2adc47c64fc6ef6910a34fd658ebe3448972e..4d60d080a2f3abac1e449d3b473c5732943dfea3 100644
--- a/config/locales/es-AR.yml
+++ b/config/locales/es-AR.yml
@@ -7,7 +7,6 @@ es-AR:
     hosted_on: Mastodon alojado en %{domain}
     title: Información
   accounts:
-    follow: Seguir
     followers:
       one: Seguidor
       other: Seguidores
@@ -1740,23 +1739,12 @@ es-AR:
     edited_at_html: Editado el %{date}
     errors:
       in_reply_not_found: El mensaje al que intentás responder no existe.
-    open_in_web: Abrir en la web
     over_character_limit: se excedió el límite de %{max} caracteres
     pin_errors:
       direct: Los mensajes que sólo son visibles para los usuarios mencionados no pueden ser fijados
       limit: Ya fijaste el número máximo de mensajes
       ownership: No se puede fijar el mensaje de otra cuenta
       reblog: No se puede fijar una adhesión
-    poll:
-      total_people:
-        one: "%{count} persona"
-        other: "%{count} personas"
-      total_votes:
-        one: "%{count} voto"
-        other: "%{count} votos"
-      vote: Votar
-    show_more: Mostrar más
-    show_thread: Mostrar hilo
     title: '%{name}: "%{quote}"'
     visibilities:
       direct: Directo
diff --git a/config/locales/es-MX.yml b/config/locales/es-MX.yml
index 84663aa8953944458246b0b2e3384a3dfa134df7..050388c180ae665539c4ce1e8d2e2bb1fce9acc6 100644
--- a/config/locales/es-MX.yml
+++ b/config/locales/es-MX.yml
@@ -7,7 +7,6 @@ es-MX:
     hosted_on: Mastodon alojado en %{domain}
     title: Acerca de
   accounts:
-    follow: Seguir
     followers:
       one: Seguidor
       other: Seguidores
@@ -1730,23 +1729,12 @@ es-MX:
     edited_at_html: Editado %{date}
     errors:
       in_reply_not_found: El estado al que intentas responder no existe.
-    open_in_web: Abrir en web
     over_character_limit: Límite de caracteres de %{max} superado
     pin_errors:
       direct: Las publicaciones que son visibles solo para los usuarios mencionados no pueden fijarse
       limit: Ya has fijado el número máximo de publicaciones
       ownership: El toot de alguien más no puede fijarse
       reblog: Un boost no puede fijarse
-    poll:
-      total_people:
-        one: persona %{count}
-        other: "%{count} gente"
-      total_votes:
-        one: "%{count} voto"
-        other: "%{count} votos"
-      vote: Vota
-    show_more: Mostrar más
-    show_thread: Mostrar discusión
     title: "%{name}: «%{quote}»"
     visibilities:
       direct: Directa
diff --git a/config/locales/es.yml b/config/locales/es.yml
index e245dde5d64f9046e2cd96a6acc76da2a3cf4106..81a547ad88fc47f7518f36ec7b5e70218ec4cebd 100644
--- a/config/locales/es.yml
+++ b/config/locales/es.yml
@@ -7,7 +7,6 @@ es:
     hosted_on: Mastodon alojado en %{domain}
     title: Acerca de
   accounts:
-    follow: Seguir
     followers:
       one: Seguidor
       other: Seguidores
@@ -1730,23 +1729,12 @@ es:
     edited_at_html: Editado %{date}
     errors:
       in_reply_not_found: La publicación a la que intentas responder no existe.
-    open_in_web: Abrir en web
     over_character_limit: Límite de caracteres de %{max} superado
     pin_errors:
       direct: Las publicaciones que son visibles solo para los usuarios mencionados no pueden fijarse
       limit: Ya has fijado el número máximo de publicaciones
       ownership: La publicación de otra persona no puede fijarse
       reblog: Un boost no puede fijarse
-    poll:
-      total_people:
-        one: "%{count} persona"
-        other: "%{count} personas"
-      total_votes:
-        one: "%{count} voto"
-        other: "%{count} votos"
-      vote: Vota
-    show_more: Mostrar más
-    show_thread: Mostrar discusión
     title: "%{name}: «%{quote}»"
     visibilities:
       direct: Directa
diff --git a/config/locales/et.yml b/config/locales/et.yml
index 88d48fefcb76e8e5e0809e971c6ffaea111d4f22..d8cdbf41431aed6a0789b37059dbebfd76a23c59 100644
--- a/config/locales/et.yml
+++ b/config/locales/et.yml
@@ -7,7 +7,6 @@ et:
     hosted_on: Mastodon majutatud %{domain}-is
     title: Teave
   accounts:
-    follow: Jälgi
     followers:
       one: Jälgija
       other: Jälgijaid
@@ -1701,23 +1700,12 @@ et:
     edited_at_html: Muudetud %{date}
     errors:
       in_reply_not_found: Postitus, millele üritad vastata, ei näi enam eksisteerivat.
-    open_in_web: Ava veebis
     over_character_limit: tähtmärkide limiit %{max} ületatud
     pin_errors:
       direct: Ei saa kinnitada postitusi, mis on nähtavad vaid mainitud kasutajatele
       limit: Kinnitatud on juba maksimaalne arv postitusi
       ownership: Kellegi teise postitust ei saa kinnitada
       reblog: Jagamist ei saa kinnitada
-    poll:
-      total_people:
-        one: "%{count} inimene"
-        other: "%{count} inimest"
-      total_votes:
-        one: "%{count} hääl"
-        other: "%{count} häält"
-      vote: Hääleta
-    show_more: Näita rohkem
-    show_thread: Kuva lõim
     title: '%{name}: "%{quote}"'
     visibilities:
       direct: Otsene
diff --git a/config/locales/eu.yml b/config/locales/eu.yml
index e5ae0ab79d3ed84acc84d300bc6ec3f841f3d9d6..6260033990d3090f5ae16571eebff313947870c0 100644
--- a/config/locales/eu.yml
+++ b/config/locales/eu.yml
@@ -7,7 +7,6 @@ eu:
     hosted_on: Mastodon %{domain} domeinuan ostatatua
     title: Honi buruz
   accounts:
-    follow: Jarraitu
     followers:
       one: Jarraitzaile
       other: jarraitzaile
@@ -1639,23 +1638,12 @@ eu:
     edited_at_html: Editatua %{date}
     errors:
       in_reply_not_found: Erantzuten saiatu zaren bidalketa antza ez da existitzen.
-    open_in_web: Ireki web-ean
     over_character_limit: "%{max}eko karaktere muga gaindituta"
     pin_errors:
       direct: Aipatutako erabiltzaileentzat soilik ikusgai dauden bidalketak ezin dira finkatu
       limit: Gehienez finkatu daitekeen bidalketa kopurua finkatu duzu jada
       ownership: Ezin duzu beste norbaiten bidalketa bat finkatu
       reblog: Bultzada bat ezin da finkatu
-    poll:
-      total_people:
-        one: pertsona %{count}
-        other: "%{count} pertsona"
-      total_votes:
-        one: Boto %{count}
-        other: "%{count} boto"
-      vote: Bozkatu
-    show_more: Erakutsi gehiago
-    show_thread: Erakutsi haria
     title: '%{name}: "%{quote}"'
     visibilities:
       direct: Zuzena
diff --git a/config/locales/fa.yml b/config/locales/fa.yml
index ce8a61e3f0e17546efb5b275eefd9a65a62968ca..f2fe134e325f231e1a1a1bbcb21a4d03e749d988 100644
--- a/config/locales/fa.yml
+++ b/config/locales/fa.yml
@@ -7,7 +7,6 @@ fa:
     hosted_on: ماستودون، میزبانی‌شده روی %{domain}
     title: درباره
   accounts:
-    follow: پیگیری
     followers:
       one: پیگیر
       other: پیگیر
@@ -1404,23 +1403,12 @@ fa:
     edited_at_html: ویراسته در %{date}
     errors:
       in_reply_not_found: به نظر نمی‌رسد وضعیتی که می‌خواهید به آن پاسخ دهید، وجود داشته باشد.
-    open_in_web: گشودن در وب
     over_character_limit: از حد مجاز %{max} حرف فراتر رفتید
     pin_errors:
       direct: فرسته‌هایی که فقط برای کاربران اشاره شده نمایانند نمی‌توانند سنجاق شوند
       limit: از این بیشتر نمی‌شود نوشته‌های ثابت داشت
       ownership: نوشته‌های دیگران را نمی‌توان ثابت کرد
       reblog: تقویت نمی‌تواند سنجاق شود
-    poll:
-      total_people:
-        one: "%{count} نفر"
-        other: "%{count} نفر"
-      total_votes:
-        one: "%{count} رأی"
-        other: "%{count} رأی"
-      vote: رأی
-    show_more: نمایش
-    show_thread: نمایش رشته
     title: "%{name}: «%{quote}»"
     visibilities:
       direct: مستقیم
diff --git a/config/locales/fi.yml b/config/locales/fi.yml
index 5c39346a9fe4e6902d175ab4898238bdff393137..30837b6003ca505a72ba95aa845f75670660038b 100644
--- a/config/locales/fi.yml
+++ b/config/locales/fi.yml
@@ -7,7 +7,6 @@ fi:
     hosted_on: Mastodon palvelimella %{domain}
     title: Tietoja
   accounts:
-    follow: Seuraa
     followers:
       one: seuraaja
       other: seuraajaa
@@ -1738,23 +1737,12 @@ fi:
     edited_at_html: Muokattu %{date}
     errors:
       in_reply_not_found: Julkaisua, johon yrität vastata, ei näytä olevan olemassa.
-    open_in_web: Avaa selaimessa
     over_character_limit: merkkimäärän rajoitus %{max} ylitetty
     pin_errors:
       direct: Vain mainituille käyttäjille näkyviä julkaisuja ei voi kiinnittää
       limit: Olet jo kiinnittänyt enimmäismäärän julkaisuja
       ownership: Muiden julkaisuja ei voi kiinnittää
       reblog: Tehostusta ei voi kiinnittää
-    poll:
-      total_people:
-        one: "%{count} käyttäjä"
-        other: "%{count} käyttäjää"
-      total_votes:
-        one: "%{count} ääni"
-        other: "%{count} ääntä"
-      vote: Äänestä
-    show_more: Näytä lisää
-    show_thread: Näytä ketju
     title: "%{name}: ”%{quote}”"
     visibilities:
       direct: Suoraan
diff --git a/config/locales/fo.yml b/config/locales/fo.yml
index 6d7b38e18afa6835163f23bcc45c0856fbf090a8..d5127b4ad3838fe2a82d2aed9c0863261e2a6aba 100644
--- a/config/locales/fo.yml
+++ b/config/locales/fo.yml
@@ -7,7 +7,6 @@ fo:
     hosted_on: Mastodon hýst á %{domain}
     title: Um
   accounts:
-    follow: Fylg
     followers:
       one: Fylgjari
       other: Fylgjarar
@@ -1740,23 +1739,12 @@ fo:
     edited_at_html: Rættað %{date}
     errors:
       in_reply_not_found: Posturin, sum tú roynir at svara, sýnist ikki at finnast.
-    open_in_web: Lat upp á vevinum
     over_character_limit: mesta tal av teknum, %{max}, rokkið
     pin_errors:
       direct: Postar, sum einans eru sjónligir hjá nevndum brúkarum, kunnu ikki festast
       limit: Tú hevur longu fest loyvda talið av postum
       ownership: Postar hjá øðrum kunnu ikki festast
       reblog: Ein stimbran kann ikki festast
-    poll:
-      total_people:
-        one: "%{count} fólk"
-        other: "%{count} fólk"
-      total_votes:
-        one: "%{count} atkvøða"
-        other: "%{count} atkvøður"
-      vote: Atkvøð
-    show_more: Vís meira
-    show_thread: Vís tráð
     title: '%{name}: "%{quote}"'
     visibilities:
       direct: Beinleiðis
diff --git a/config/locales/fr-CA.yml b/config/locales/fr-CA.yml
index 27e09d1f9cb9efc928056d7b05a90522b2318613..a47d7447a12b45757cf4a8ba64779e4c4400c5e9 100644
--- a/config/locales/fr-CA.yml
+++ b/config/locales/fr-CA.yml
@@ -7,7 +7,6 @@ fr-CA:
     hosted_on: Serveur Mastodon hébergé sur %{domain}
     title: À propos
   accounts:
-    follow: Suivre
     followers:
       one: Abonné·e
       other: Abonné·e·s
@@ -1711,23 +1710,12 @@ fr-CA:
     edited_at_html: Édité le %{date}
     errors:
       in_reply_not_found: Le message auquel vous essayez de répondre ne semble pas exister.
-    open_in_web: Ouvrir sur le web
     over_character_limit: limite de %{max} caractères dépassée
     pin_errors:
       direct: Les messages qui ne sont visibles que pour les utilisateur·rice·s mentionné·e·s ne peuvent pas être épinglés
       limit: Vous avez déjà épinglé le nombre maximum de messages
       ownership: Vous ne pouvez pas épingler un message ne vous appartenant pas
       reblog: Un partage ne peut pas être épinglé
-    poll:
-      total_people:
-        one: "%{count} personne"
-        other: "%{count} personnes"
-      total_votes:
-        one: "%{count} vote"
-        other: "%{count} votes"
-      vote: Voter
-    show_more: Déplier
-    show_thread: Afficher le fil de discussion
     title: "%{name} : « %{quote} »"
     visibilities:
       direct: Direct
diff --git a/config/locales/fr.yml b/config/locales/fr.yml
index 055b50900c3feb63a13c73bd76f027ee251ac0ad..b2c692ea6ffe873366ca9aeac0fa6bd698f56903 100644
--- a/config/locales/fr.yml
+++ b/config/locales/fr.yml
@@ -7,7 +7,6 @@ fr:
     hosted_on: Serveur Mastodon hébergé sur %{domain}
     title: À propos
   accounts:
-    follow: Suivre
     followers:
       one: Abonné·e
       other: Abonné·e·s
@@ -1711,23 +1710,12 @@ fr:
     edited_at_html: Modifié le %{date}
     errors:
       in_reply_not_found: Le message auquel vous essayez de répondre ne semble pas exister.
-    open_in_web: Ouvrir sur le web
     over_character_limit: limite de %{max} caractères dépassée
     pin_errors:
       direct: Les messages qui ne sont visibles que pour les utilisateur·rice·s mentionné·e·s ne peuvent pas être épinglés
       limit: Vous avez déjà épinglé le nombre maximum de messages
       ownership: Vous ne pouvez pas épingler un message ne vous appartenant pas
       reblog: Un partage ne peut pas être épinglé
-    poll:
-      total_people:
-        one: "%{count} personne"
-        other: "%{count} personnes"
-      total_votes:
-        one: "%{count} vote"
-        other: "%{count} votes"
-      vote: Voter
-    show_more: Déplier
-    show_thread: Afficher le fil de discussion
     title: "%{name} : « %{quote} »"
     visibilities:
       direct: Direct
diff --git a/config/locales/fy.yml b/config/locales/fy.yml
index 27fcaf3af75154d67099d6973484a09f15611a56..6afdecd556d40d686fba432221fc0de18cdb570f 100644
--- a/config/locales/fy.yml
+++ b/config/locales/fy.yml
@@ -7,7 +7,6 @@ fy:
     hosted_on: Mastodon op %{domain}
     title: Oer
   accounts:
-    follow: Folgje
     followers:
       one: Folger
       other: Folgers
@@ -1730,23 +1729,12 @@ fy:
     edited_at_html: Bewurke op %{date}
     errors:
       in_reply_not_found: It berjocht wêrop jo probearje te reagearjen liket net te bestean.
-    open_in_web: Yn de webapp iepenje
     over_character_limit: Oer de limyt fan %{max} tekens
     pin_errors:
       direct: Berjochten dy’t allinnich sichtber binne foar fermelde brûkers kinne net fêstset wurde
       limit: Jo hawwe it maksimaal tal berjochten al fêstmakke
       ownership: In berjocht fan in oar kin net fêstmakke wurde
       reblog: In boost kin net fêstset wurde
-    poll:
-      total_people:
-        one: "%{count} persoan"
-        other: "%{count} persoanen"
-      total_votes:
-        one: "%{count} stim"
-        other: "%{count} stimmen"
-      vote: Stimme
-    show_more: Mear toane
-    show_thread: Petear toane
     title: '%{name}: "%{quote}"'
     visibilities:
       direct: Direkt
diff --git a/config/locales/ga.yml b/config/locales/ga.yml
index 870f79cba99087bc4447bcec5db92203c0426321..09d5f7ae18c7f3fa0b7bacbbe00ccaa7f476e4b4 100644
--- a/config/locales/ga.yml
+++ b/config/locales/ga.yml
@@ -7,7 +7,6 @@ ga:
     hosted_on: Mastodon arna óstáil ar %{domain}
     title: Maidir le
   accounts:
-    follow: Lean
     followers:
       few: Leantóirí
       many: Leantóirí
@@ -1823,29 +1822,12 @@ ga:
     edited_at_html: "%{date} curtha in eagar"
     errors:
       in_reply_not_found: Is cosúil nach ann don phostáil a bhfuil tú ag iarraidh freagra a thabhairt air.
-    open_in_web: Oscail i ngréasán
     over_character_limit: teorainn carachtar %{max} sáraithe
     pin_errors:
       direct: Ní féidir postálacha nach bhfuil le feiceáil ach ag úsáideoirí luaite a phinnáil
       limit: Tá uaslíon na bpostálacha pinn agat cheana féin
       ownership: Ní féidir postáil duine éigin eile a phionnáil
       reblog: Ní féidir treisiú a phinnáil
-    poll:
-      total_people:
-        few: "%{count} daoine"
-        many: "%{count} daoine"
-        one: "%{count} duine"
-        other: "%{count} daoine"
-        two: "%{count} daoine"
-      total_votes:
-        few: "%{count} vótaí"
-        many: "%{count} vótaí"
-        one: "%{count} vóta"
-        other: "%{count} vótaí"
-        two: "%{count} vótaí"
-      vote: Vótáil
-    show_more: Taispeáin níos mó
-    show_thread: Taispeáin snáithe
     title: '%{name}: "%{quote}"'
     visibilities:
       direct: Díreach
diff --git a/config/locales/gd.yml b/config/locales/gd.yml
index dda918d15cd61a449198fa3ad4ae2b47f52aaa05..3f30d37823ecf971bde395fa4d945d74c28e9333 100644
--- a/config/locales/gd.yml
+++ b/config/locales/gd.yml
@@ -7,7 +7,6 @@ gd:
     hosted_on: Mastodon ’ga òstadh air %{domain}
     title: Mu dhèidhinn
   accounts:
-    follow: Lean
     followers:
       few: Luchd-leantainn
       one: Neach-leantainn
@@ -1793,27 +1792,12 @@ gd:
     edited_at_html: Air a dheasachadh %{date}
     errors:
       in_reply_not_found: Tha coltas nach eil am post dhan a tha thu airson freagairt ann.
-    open_in_web: Fosgail air an lìon
     over_character_limit: chaidh thu thar crìoch charactaran de %{max}
     pin_errors:
       direct: Chan urrainn dhut post a phrìneachadh nach fhaic ach na cleachdaichean le iomradh orra
       limit: Tha an àireamh as motha de phostaichean prìnichte agad a tha ceadaichte
       ownership: Chan urrainn dhut post càich a phrìneachadh
       reblog: Chan urrainn dhut brosnachadh a phrìneachadh
-    poll:
-      total_people:
-        few: "%{count} daoine"
-        one: "%{count} neach"
-        other: "%{count} duine"
-        two: "%{count} neach"
-      total_votes:
-        few: "%{count} bhòtaichean"
-        one: "%{count} bhòt"
-        other: "%{count} bhòt"
-        two: "%{count} bhòt"
-      vote: Bhòt
-    show_more: Seall barrachd dheth
-    show_thread: Seall an snàithlean
     title: "%{name}: “%{quote}”"
     visibilities:
       direct: Dìreach
diff --git a/config/locales/gl.yml b/config/locales/gl.yml
index d275b844fd3c0e49eb3843feaea54a3e63528a22..58fd2d9bab50c481c47c6ddbac5ccc87a3f715f4 100644
--- a/config/locales/gl.yml
+++ b/config/locales/gl.yml
@@ -7,7 +7,6 @@ gl:
     hosted_on: Mastodon aloxado en %{domain}
     title: Sobre
   accounts:
-    follow: Seguir
     followers:
       one: Seguidora
       other: Seguidoras
@@ -1740,23 +1739,12 @@ gl:
     edited_at_html: Editado %{date}
     errors:
       in_reply_not_found: A publicación á que tentas responder semella que non existe.
-    open_in_web: Abrir na web
     over_character_limit: Excedeu o límite de caracteres %{max}
     pin_errors:
       direct: As publicacións que só son visibles para as usuarias mencionadas non se poden fixar
       limit: Xa fixaches o número máximo permitido de publicacións
       ownership: Non podes fixar a publicación doutra usuaria
       reblog: Non se poden fixar as mensaxes promovidas
-    poll:
-      total_people:
-        one: "%{count} persoa"
-        other: "%{count} persoas"
-      total_votes:
-        one: "%{count} voto"
-        other: "%{count} votos"
-      vote: Votar
-    show_more: Mostrar máis
-    show_thread: Amosar fío
     title: '%{name}: "%{quote}"'
     visibilities:
       direct: Directa
diff --git a/config/locales/he.yml b/config/locales/he.yml
index 341e2bf0239c0dbf20c703a874c57c38c89eb353..7a2d0a1d9874595c91bf21368d8ce218675cb989 100644
--- a/config/locales/he.yml
+++ b/config/locales/he.yml
@@ -7,7 +7,6 @@ he:
     hosted_on: מסטודון שיושב בכתובת %{domain}
     title: אודות
   accounts:
-    follow: לעקוב
     followers:
       many: עוקבים
       one: עוקב
@@ -1800,27 +1799,12 @@ he:
     edited_at_html: נערך ב-%{date}
     errors:
       in_reply_not_found: נראה שההודעה שאת/ה מנסה להגיב לה לא קיימת.
-    open_in_web: פתח ברשת
     over_character_limit: חריגה מגבול התווים של %{max}
     pin_errors:
       direct: לא ניתן לקבע הודעות שנראותן מוגבלת למכותבים בלבד
       limit: הגעת למספר המירבי של ההודעות המוצמדות
       ownership: הודעות של אחרים לא יכולות להיות מוצמדות
       reblog: אין אפשרות להצמיד הדהודים
-    poll:
-      total_people:
-        many: "%{count} אנשים"
-        one: איש/ה %{count}
-        other: "%{count} אנשים"
-        two: "%{count} אנשים"
-      total_votes:
-        many: "%{count} קולות"
-        one: קול %{count}
-        other: "%{count} קולות"
-        two: "%{count} קולות"
-      vote: הצבעה
-    show_more: עוד
-    show_thread: הצג שרשור
     title: '%{name}: "%{quote}"'
     visibilities:
       direct: ישיר
diff --git a/config/locales/hi.yml b/config/locales/hi.yml
index 60b500c7ec318b653bcf1669ba0db75b6ff89809..37df2afe1a460204ab813dafd05723da1553bcc2 100644
--- a/config/locales/hi.yml
+++ b/config/locales/hi.yml
@@ -5,7 +5,6 @@ hi:
     contact_unavailable: लागू नहीं है
     title: के बारे में
   accounts:
-    follow: अनुसरे
     following: फ़ॉलो कर रहे हैं
     instance_actor_flash: यह खाता आभासी है जो सर्वर को दिखाने के लिये है और ये किसी व्यक्तिका प्रतिनिधित्व नहि करता। यह सिर्फ देखरेख के हेतु से कार्यरत है और इसको निलंबित करने कि आवश्यकता नहि है।
     last_active: आखिरि बार इस वक्त सक्रिय थे
diff --git a/config/locales/hr.yml b/config/locales/hr.yml
index 6a67ea0129f709d294bb6a84a10daef98c5f1ef8..7dacf2007790f1655e8d878b2b03db2f46e33304 100644
--- a/config/locales/hr.yml
+++ b/config/locales/hr.yml
@@ -5,7 +5,6 @@ hr:
     contact_missing: Nije postavljeno
     title: O aplikaciji
   accounts:
-    follow: Prati
     following: Praćenih
     last_active: posljednja aktivnost
     nothing_here: Ovdje nema ničeg!
@@ -215,20 +214,7 @@ hr:
     statuses_cleanup: Automatsko brisanje postova
     two_factor_authentication: Dvofaktorska autentifikacija
   statuses:
-    open_in_web: Otvori na webu
     over_character_limit: prijeđeno je ograničenje od %{max} znakova
-    poll:
-      total_people:
-        few: "%{count} osobe"
-        one: "%{count} osoba"
-        other: "%{count} ljudi"
-      total_votes:
-        few: "%{count} glasa"
-        one: "%{count} glas"
-        other: "%{count} glasova"
-      vote: Glasaj
-    show_more: Prikaži više
-    show_thread: Prikaži nit
     visibilities:
       private: Samo pratitelji
       public: Javno
diff --git a/config/locales/hu.yml b/config/locales/hu.yml
index e29472f8d83c0c07d113089e6f2d12298dd40183..10c7506b01159ad7d4e926c531f778b7cca43dc1 100644
--- a/config/locales/hu.yml
+++ b/config/locales/hu.yml
@@ -7,7 +7,6 @@ hu:
     hosted_on: "%{domain} Mastodon-kiszolgáló"
     title: Névjegy
   accounts:
-    follow: Követés
     followers:
       one: Követő
       other: Követő
@@ -1740,23 +1739,12 @@ hu:
     edited_at_html: 'Szerkesztve: %{date}'
     errors:
       in_reply_not_found: Már nem létezik az a bejegyzés, melyre válaszolni szeretnél.
-    open_in_web: Megnyitás a weben
     over_character_limit: túllépted a maximális %{max} karakteres keretet
     pin_errors:
       direct: A csak a megemlített felhasználók számára látható bejegyzések nem tűzhetők ki
       limit: Elérted a kitűzhető bejegyzések maximális számát
       ownership: Nem tűzheted ki valaki más bejegyzését
       reblog: Megtolt bejegyzést nem tudsz kitűzni
-    poll:
-      total_people:
-        one: "%{count} személy"
-        other: "%{count} személy"
-      total_votes:
-        one: "%{count} szavazat"
-        other: "%{count} szavazat"
-      vote: Szavazás
-    show_more: Több megjelenítése
-    show_thread: Szál mutatása
     title: "%{name}: „%{quote}”"
     visibilities:
       direct: Közvetlen
diff --git a/config/locales/hy.yml b/config/locales/hy.yml
index c7128a2a46a47b05115b7f99a28fd6a5e37bcffb..80dbc77991c24c2698c5c414d70f3d5ab3242ad3 100644
--- a/config/locales/hy.yml
+++ b/config/locales/hy.yml
@@ -7,7 +7,6 @@ hy:
     hosted_on: Õ„Õ¡Õ½Õ¿Õ¸Õ¤Õ¸Õ¶Õ¨ Õ¿Õ¥Õ²Õ¡Õ¯Õ¡ÕµÕ¸Ö‚Õ¡Õ® Õ§ %{domain}Õ¸Ö‚Õ´
     title: Õ„Õ¡Õ½Õ«Õ¶
   accounts:
-    follow: Õ€Õ¥Õ¿Ö‡Õ¥Õ¬
     followers:
       one: Õ€Õ¥Õ¿Õ¥Ö‚Õ¸Ö€Õ¤
       other: Õ€Õ¥Õ¿Ö‡Õ¸Ö€Õ¤Õ¶Õ¥Ö€
@@ -782,18 +781,7 @@ hy:
         other: "%{count} Õ¾Õ«Õ¤Õ¥Õ¸"
     content_warning: Նախազգուշացում։ %{warning}
     edited_at_html: Խմբագրուած՝ %{date}
-    open_in_web: Բացել վէբում
     over_character_limit: "%{max} նիշի սահմանը գերազանցուած է"
-    poll:
-      total_people:
-        one: "%{count} Õ´Õ¡Ö€Õ¤"
-        other: "%{count} Õ´Õ¡Ö€Õ¤Õ«Õ¯"
-      total_votes:
-        one: "%{count} Õ±Õ¡ÕµÕ¶"
-        other: "%{count} Õ±Õ¡ÕµÕ¶Õ¥Ö€"
-      vote: Õ”Õ¸Ö‚Õ§Õ¡Ö€Õ¯Õ¥Õ¬
-    show_more: Ô±Ö‚Õ¥Õ¬Õ«Õ¶
-    show_thread: Բացել շղթան
     title: '%{name}: "%{quote}"'
     visibilities:
       direct: Հասցէագրուած
diff --git a/config/locales/ia.yml b/config/locales/ia.yml
index 87789562fde7bd4374b16fd969d7dcc86c6cb957..957bae39915b7dac5dfab15cd7fadc1966e5bcb0 100644
--- a/config/locales/ia.yml
+++ b/config/locales/ia.yml
@@ -7,7 +7,6 @@ ia:
     hosted_on: Mastodon albergate sur %{domain}
     title: A proposito
   accounts:
-    follow: Sequer
     followers:
       one: Sequitor
       other: Sequitores
@@ -1723,23 +1722,12 @@ ia:
     edited_at_html: Modificate le %{date}
     errors:
       in_reply_not_found: Le message a que tu tenta responder non pare exister.
-    open_in_web: Aperir sur le web
     over_character_limit: limite de characteres de %{max} excedite
     pin_errors:
       direct: Messages que es solo visibile a usatores mentionate non pote esser appunctate
       limit: Tu ha jam appunctate le maxime numero de messages
       ownership: Le message de alcuno altere non pote esser appunctate
       reblog: Un impulso non pote esser affixate
-    poll:
-      total_people:
-        one: "%{count} persona"
-        other: "%{count} personas"
-      total_votes:
-        one: "%{count} voto"
-        other: "%{count} votos"
-      vote: Votar
-    show_more: Monstrar plus
-    show_thread: Monstrar discussion
     title: "%{name}: “%{quote}”"
     visibilities:
       direct: Directe
diff --git a/config/locales/id.yml b/config/locales/id.yml
index 575daddca65f0b06f091bec88989c91855f92a9d..222d2b56803f4f7da3484ced7c83fbff41adfe61 100644
--- a/config/locales/id.yml
+++ b/config/locales/id.yml
@@ -7,7 +7,6 @@ id:
     hosted_on: Mastodon dihosting di %{domain}
     title: Tentang
   accounts:
-    follow: Ikuti
     followers:
       other: Pengikut
     following: Mengikuti
@@ -1378,21 +1377,12 @@ id:
     edited_at_html: Diedit %{date}
     errors:
       in_reply_not_found: Status yang ingin Anda balas sudah tidak ada.
-    open_in_web: Buka di web
     over_character_limit: melebihi %{max} karakter
     pin_errors:
       direct: Kiriman yang hanya terlihat oleh pengguna yang disebutkan tidak dapat disematkan
       limit: Anda sudah mencapai jumlah maksimum kiriman yang dapat disematkan
       ownership: Kiriman orang lain tidak bisa disematkan
       reblog: Boost tidak bisa disematkan
-    poll:
-      total_people:
-        other: "%{count} orang"
-      total_votes:
-        other: "%{count} memilih"
-      vote: Pilih
-    show_more: Tampilkan selengkapnya
-    show_thread: Tampilkan utas
     title: '%{name}: "%{quote}"'
     visibilities:
       direct: Langsung
diff --git a/config/locales/ie.yml b/config/locales/ie.yml
index 1529ea04b878b29b1c5ec29cf193ee44276db134..6a79686f4849841f4aefc538696ab08064b48879 100644
--- a/config/locales/ie.yml
+++ b/config/locales/ie.yml
@@ -7,7 +7,6 @@ ie:
     hosted_on: Mastodon logiat che %{domain}
     title: Pri
   accounts:
-    follow: Sequer
     followers:
       one: Sequitor
       other: Sequitores
@@ -1637,23 +1636,12 @@ ie:
     edited_at_html: Modificat ye %{date}
     errors:
       in_reply_not_found: Li posta a quel tu prova responder ne sembla exister.
-    open_in_web: Aperter in web
     over_character_limit: límite de carácteres de %{max} transpassat
     pin_errors:
       direct: On ne posse pinglar postas queles es visibil solmen a mentionat usatores
       limit: Tu ja ha pinglat li maxim númere de postas
       ownership: On ne posse pinglar li posta de un altri person
       reblog: On ne posse pinglar un boost
-    poll:
-      total_people:
-        one: "%{count} person"
-        other: "%{count} persones"
-      total_votes:
-        one: "%{count} vote"
-        other: "%{count} votes"
-      vote: Votar
-    show_more: Monstrar plu
-    show_thread: Monstrar fil
     title: "%{name}: «%{quote}»"
     visibilities:
       direct: Direct
diff --git a/config/locales/io.yml b/config/locales/io.yml
index d1b9aef3e510931d79aed9f1487e340bc5b8d191..dbbe228e72c236731f7a6403d9a758ce9784f87b 100644
--- a/config/locales/io.yml
+++ b/config/locales/io.yml
@@ -7,7 +7,6 @@ io:
     hosted_on: Mastodon hostigesas che %{domain}
     title: Pri co
   accounts:
-    follow: Sequar
     followers:
       one: Sequanto
       other: Sequanti
@@ -1590,23 +1589,12 @@ io:
     edited_at_html: Modifikesis ye %{date}
     errors:
       in_reply_not_found: Posto quon vu probas respondar semblas ne existas.
-    open_in_web: Apertar retnavigile
     over_character_limit: limito de %{max} signi ecesita
     pin_errors:
       direct: Posti quo povas videsar nur mencionita uzanti ne povas pinglagesar
       limit: Vu ja pinglagis maxima posti
       ownership: Posto di altra persono ne povas pinglagesar
       reblog: Repeto ne povas pinglizesar
-    poll:
-      total_people:
-        one: "%{count} persono"
-        other: "%{count} personi"
-      total_votes:
-        one: "%{count} voto"
-        other: "%{count} voti"
-      vote: Votez
-    show_more: Montrar plue
-    show_thread: Montrez postaro
     title: '%{name}: "%{quote}"'
     visibilities:
       direct: Direta
diff --git a/config/locales/is.yml b/config/locales/is.yml
index 5fa147e8dbdf7813bb8f29aace61768c63abebf3..78dfd6048fe965b33b087a7fea3a343528124e11 100644
--- a/config/locales/is.yml
+++ b/config/locales/is.yml
@@ -7,7 +7,6 @@ is:
     hosted_on: Mastodon hýst á %{domain}
     title: Um hugbúnaðinn
   accounts:
-    follow: Fylgjast með
     followers:
       one: fylgjandi
       other: fylgjendur
@@ -1744,23 +1743,12 @@ is:
     edited_at_html: Breytt %{date}
     errors:
       in_reply_not_found: Færslan sem þú ert að reyna að svara að er líklega ekki til.
-    open_in_web: Opna í vafra
     over_character_limit: hámarksfjölda stafa (%{max}) náð
     pin_errors:
       direct: Ekki er hægt að festa færslur sem einungis eru sýnilegar þeim notendum sem minnst er á
       limit: Þú hefur þegar fest leyfilegan hámarksfjölda færslna
       ownership: Færslur frá einhverjum öðrum er ekki hægt að festa
       reblog: Ekki er hægt að festa endurbirtingu
-    poll:
-      total_people:
-        one: "%{count} aðili"
-        other: "%{count} aðilar"
-      total_votes:
-        one: "%{count} atkvæði"
-        other: "%{count} atkvæði"
-      vote: Greiða atkvæði
-    show_more: Sýna meira
-    show_thread: Birta þráð
     title: "%{name}: „%{quote}‟"
     visibilities:
       direct: Beint
diff --git a/config/locales/it.yml b/config/locales/it.yml
index 7de24fe2593be2022ef68b8148adc46f1f516fc5..792add14e35e2250386fa25cbfde58781b215766 100644
--- a/config/locales/it.yml
+++ b/config/locales/it.yml
@@ -7,7 +7,6 @@ it:
     hosted_on: Mastodon ospitato su %{domain}
     title: Info
   accounts:
-    follow: Segui
     followers:
       one: Seguace
       other: Seguaci
@@ -1742,23 +1741,12 @@ it:
     edited_at_html: Modificato il %{date}
     errors:
       in_reply_not_found: Il post a cui stai tentando di rispondere non sembra esistere.
-    open_in_web: Apri sul Web
     over_character_limit: Limite caratteri superato di %{max}
     pin_errors:
       direct: I messaggi visibili solo agli utenti citati non possono essere fissati in cima
       limit: Hai già fissato in cima il massimo numero di post
       ownership: Non puoi fissare in cima un post di qualcun altro
       reblog: Un toot condiviso non può essere fissato in cima
-    poll:
-      total_people:
-        one: "%{count} persona"
-        other: "%{count} persone"
-      total_votes:
-        one: "%{count} voto"
-        other: "%{count} voti"
-      vote: Vota
-    show_more: Mostra di più
-    show_thread: Mostra thread
     title: '%{name}: "%{quote}"'
     visibilities:
       direct: Diretto
diff --git a/config/locales/ja.yml b/config/locales/ja.yml
index 3f50b0d7a6b79b019ea35575c9972e661d596c41..13f59e981b00e7a51defc496e6d9734101a34bbb 100644
--- a/config/locales/ja.yml
+++ b/config/locales/ja.yml
@@ -7,7 +7,6 @@ ja:
     hosted_on: Mastodon hosted on %{domain}
     title: このサーバーについて
   accounts:
-    follow: フォロー
     followers:
       other: フォロワー
     following: フォロー中
@@ -1700,21 +1699,12 @@ ja:
     edited_at_html: "%{date} 編集済み"
     errors:
       in_reply_not_found: あなたが返信しようとしている投稿は存在しないようです。
-    open_in_web: Webで開く
     over_character_limit: 上限は%{max}文字です
     pin_errors:
       direct: 返信したユーザーのみに表示される投稿はピン留めできません
       limit: 固定できる投稿数の上限に達しました
       ownership: 他人の投稿を固定することはできません
       reblog: ブーストを固定することはできません
-    poll:
-      total_people:
-        other: "%{count}人"
-      total_votes:
-        other: "%{count}票"
-      vote: 投票
-    show_more: もっと見る
-    show_thread: スレッドを表示
     title: '%{name}: "%{quote}"'
     visibilities:
       direct: ダイレクト
diff --git a/config/locales/ka.yml b/config/locales/ka.yml
index 97b56ea35cd5aae2a9a088ee41daa07503dd5f39..576937507886d2844b477177fec97d558fcdfdd1 100644
--- a/config/locales/ka.yml
+++ b/config/locales/ka.yml
@@ -6,7 +6,6 @@ ka:
     contact_unavailable: მიუწ.
     hosted_on: მასტოდონს მასპინძლობს %{domain}
   accounts:
-    follow: გაყევი
     following: მიჰყვება
     nothing_here: აქ არაფერია!
     pin_errors:
@@ -430,13 +429,11 @@ ka:
     disallowed_hashtags:
       one: 'მოიცავდა აკრძალულ ჰეშტეგს: %{tags}'
       other: 'მოიცავს აკრძალულ ჰეშტეგს: %{tags}'
-    open_in_web: ვებში გახნსა
     over_character_limit: ნიშნების ლიმიტი გადასცდა %{max}-ს
     pin_errors:
       limit: ტუტების მაქსიმალური რაოდენობა უკვე აპინეთ
       ownership: სხვისი ტუტი ვერ აიპინება
       reblog: ბუსტი ვერ აიპინება
-    show_more: მეტის ჩვენება
     visibilities:
       private: მხოლოდ-მიმდევრები
       private_long: აჩვენე მხოლოდ მიმდევრებს
diff --git a/config/locales/kab.yml b/config/locales/kab.yml
index 3aed6c55e799b5f08a41e9ef21f823568a237aad..7c3d526702665e27101b2cfbe63ded928c571c1a 100644
--- a/config/locales/kab.yml
+++ b/config/locales/kab.yml
@@ -7,7 +7,6 @@ kab:
     hosted_on: Maṣṭudun yersen deg %{domain}
     title: Ɣef
   accounts:
-    follow: Ḍfeṛ
     followers:
       one: Umeḍfaṛ
       other: Imeḍfaṛen
@@ -798,17 +797,6 @@ kab:
         one: "%{count} n tbidyutt"
         other: "%{count} n tbidyutin"
     edited_at_html: Tettwaẓreg ass n %{date}
-    open_in_web: Ldi deg Web
-    poll:
-      total_people:
-        one: "%{count} n wemdan"
-        other: "%{count} n yemdanen"
-      total_votes:
-        one: "%{count} n wedɣar"
-        other: "%{count} n yedɣaren"
-      vote: DÉ£eá¹›
-    show_more: Ssken-d ugar
-    show_thread: Ssken-d lxiḍ
     title: '%{name} : "%{quote}"'
     visibilities:
       direct: Usrid
diff --git a/config/locales/kk.yml b/config/locales/kk.yml
index f89bdee6228f4a3e96b1c610126e8d125b9677d4..67969d4d69eadf6d96a45aaee797975257b53288 100644
--- a/config/locales/kk.yml
+++ b/config/locales/kk.yml
@@ -6,7 +6,6 @@ kk:
     contact_unavailable: Белгісіз
     hosted_on: Mastodon орнатылған %{domain} доменінде
   accounts:
-    follow: Жазылу
     followers:
       one: Оқырман
       other: Оқырман
@@ -647,22 +646,11 @@ kk:
     disallowed_hashtags:
       one: 'рұқсат етілмеген хэштег: %{tags}'
       other: 'рұқсат етілмеген хэштегтер: %{tags}'
-    open_in_web: Вебте ашу
     over_character_limit: "%{max} максимум таңбадан асып кетті"
     pin_errors:
       limit: Жабыстырылатын жазба саны максимумынан асты
       ownership: Біреудің жазбасы жабыстырылмайды
       reblog: Бөлісілген жазба жабыстырылмайды
-    poll:
-      total_people:
-        one: "%{count} адам"
-        other: "%{count} адам"
-      total_votes:
-        one: "%{count} дауыс"
-        other: "%{count} дауыс"
-      vote: Дауыс беру
-    show_more: Тағы әкел
-    show_thread: Тақырыпты көрсет
     visibilities:
       private: Тек оқырмандарға
       private_long: Тек оқырмандарға ғана көрінеді
diff --git a/config/locales/ko.yml b/config/locales/ko.yml
index ab377df304bee7429d0885d4dcd06dcec3916a03..cbcc09a4dab1e3d22507391e9546af698512c537 100644
--- a/config/locales/ko.yml
+++ b/config/locales/ko.yml
@@ -7,7 +7,6 @@ ko:
     hosted_on: "%{domain}에서 호스팅 되는 마스토돈"
     title: ì •ë³´
   accounts:
-    follow: 팔로우
     followers:
       other: 팔로워
     following: 팔로잉
@@ -1705,21 +1704,12 @@ ko:
     edited_at_html: "%{date}에 편집됨"
     errors:
       in_reply_not_found: 답장하려는 게시물이 존재하지 않습니다.
-    open_in_web: Web으로 열기
     over_character_limit: 최대 %{max}자까지 입력할 수 있습니다
     pin_errors:
       direct: 멘션된 사용자들에게만 보이는 게시물은 고정될 수 없습니다
       limit: 이미 너무 많은 게시물을 고정했습니다
       ownership: 다른 사람의 게시물은 고정될 수 없습니다
       reblog: 부스트는 고정될 수 없습니다
-    poll:
-      total_people:
-        other: "%{count}명"
-      total_votes:
-        other: "%{count} 명 투표함"
-      vote: 투표
-    show_more: 더 보기
-    show_thread: 글타래 보기
     title: '%{name}: "%{quote}"'
     visibilities:
       direct: 다이렉트
diff --git a/config/locales/ku.yml b/config/locales/ku.yml
index 20fe6cf6deef721dc1d2e554a66984a72f07a35a..6b80e32ba809c33e6e4a0cc480916a6d5b7bfd18 100644
--- a/config/locales/ku.yml
+++ b/config/locales/ku.yml
@@ -7,7 +7,6 @@ ku:
     hosted_on: Mastodon li ser %{domain} tê pêşkêşkirin
     title: Derbar
   accounts:
-    follow: Bişopîne
     followers:
       one: Şopîner
       other: Şopîner
@@ -1404,23 +1403,12 @@ ku:
     edited_at_html: Di %{date} de hate serrastkirin
     errors:
       in_reply_not_found: Ew şandiya ku tu dikî nakî bersivê bide xuya nake an jî hatiye jêbirin.
-    open_in_web: Di tevnê de veke
     over_character_limit: sînorê karakterê %{max} derbas kir
     pin_errors:
       direct: Şandiyên ku tenê ji bikarhênerên qalkirî re têne xuyangkirin, nayê derzîkirin
       limit: Jixwe te mezintirîn hejmara şandîyên xwe derzî kir
       ownership: Şandiya kesekî din nay derzî kirin
       reblog: Ev şandî nayê derzî kirin
-    poll:
-      total_people:
-        one: "%{count} kes"
-        other: "%{count} kes"
-      total_votes:
-        one: "%{count} deng"
-        other: "%{count} deng"
-      vote: Deng bide
-    show_more: Bêtir nîşan bide
-    show_thread: Mijarê nîşan bide
     title: "%{name}%{quote}"
     visibilities:
       direct: Rasterast
diff --git a/config/locales/la.yml b/config/locales/la.yml
index d3733df934d083d6d85ab6479ef21d589e49b9e4..cc92bf6d28667b6eac7b485c5f9765e721629997 100644
--- a/config/locales/la.yml
+++ b/config/locales/la.yml
@@ -7,7 +7,6 @@ la:
     hosted_on: Mastodon in %{domain} hospitātum
     title: De
   accounts:
-    follow: Sequere
     followers:
       one: Sectātor
       other: Sectātōrēs
diff --git a/config/locales/lad.yml b/config/locales/lad.yml
index 164967159b601403fa8bd1635294ac2c1c11b0f6..2f5eb1553e417e98095088f34062232f436ed840 100644
--- a/config/locales/lad.yml
+++ b/config/locales/lad.yml
@@ -7,7 +7,6 @@ lad:
     hosted_on: Mastodon balabayado en %{domain}
     title: Sovre mozotros
   accounts:
-    follow: Sige
     followers:
       one: Suivante
       other: Suivantes
@@ -1677,23 +1676,12 @@ lad:
     edited_at_html: Editado %{date}
     errors:
       in_reply_not_found: La publikasion a la ke aprovas arispondir no egziste.
-    open_in_web: Avre en web
     over_character_limit: limito de karakteres de %{max} superado
     pin_errors:
       direct: Las publikasyones ke son vizivles solo para los utilizadores enmentados no pueden fiksarse
       limit: Ya tienes fiksado el numero maksimo de publikasyones
       ownership: La publikasyon de otra persona no puede fiksarse
       reblog: No se puede fixar una repartajasyon
-    poll:
-      total_people:
-        one: "%{count} persona"
-        other: "%{count} personas"
-      total_votes:
-        one: "%{count} voto"
-        other: "%{count} votos"
-      vote: Vota
-    show_more: Amostra mas
-    show_thread: Amostra diskusyon
     title: '%{name}: "%{quote}"'
     visibilities:
       direct: Direkto
diff --git a/config/locales/lt.yml b/config/locales/lt.yml
index 07e8ba75a21ec4eaf46850e048d9417fed5d0570..42495053e9ae0330a97ec2ce1726597087b25fe4 100644
--- a/config/locales/lt.yml
+++ b/config/locales/lt.yml
@@ -7,7 +7,6 @@ lt:
     hosted_on: Mastodon talpinamas %{domain}
     title: Apie
   accounts:
-    follow: Sekti
     followers:
       few: SekÄ—jai
       many: SekÄ—jo
@@ -1107,16 +1106,11 @@ lt:
         other: "%{count} vaizdų"
     boosted_from_html: Pakelta iš %{acct_link}
     content_warning: 'Turinio įspėjimas: %{warning}'
-    open_in_web: Atidaryti naudojan Web
     over_character_limit: pasiektas %{max} simbolių limitas
     pin_errors:
       limit: Jūs jau prisegėte maksimalų toot'ų skaičų
       ownership: Kitų vartotojų toot'ai negali būti prisegti
       reblog: Pakeltos žinutės negali būti prisegtos
-    poll:
-      vote: Balsuoti
-    show_more: Rodyti daugiau
-    show_thread: Rodyti gijÄ…
     visibilities:
       private: Tik sekÄ—jams
       private_long: rodyti tik sekÄ—jams
diff --git a/config/locales/lv.yml b/config/locales/lv.yml
index 5dd6ff9e1e55a178cbfcba42508d8cdb57956615..09e6b9ba0e1a5f5f831e2ab513e4f416837f1cbb 100644
--- a/config/locales/lv.yml
+++ b/config/locales/lv.yml
@@ -7,7 +7,6 @@ lv:
     hosted_on: Mastodon mitināts %{domain}
     title: Par
   accounts:
-    follow: Sekot
     followers:
       one: Sekotājs
       other: Sekotāji
@@ -1645,25 +1644,12 @@ lv:
     edited_at_html: Labots %{date}
     errors:
       in_reply_not_found: Šķiet, ka ziņa, uz kuru tu mēģini atbildēt, nepastāv.
-    open_in_web: Atvērt webā
     over_character_limit: pārsniegts %{max} rakstzīmju ierobežojums
     pin_errors:
       direct: Ziņojumus, kas ir redzami tikai minētajiem lietotājiem, nevar piespraust
       limit: Tu jau esi piespraudis maksimālo ziņu skaitu
       ownership: Kāda cita ierakstu nevar piespraust
       reblog: Izceltu ierakstu nevar piespraust
-    poll:
-      total_people:
-        one: "%{count} cilvēks"
-        other: "%{count} cilvēki"
-        zero: "%{count} cilvēku"
-      total_votes:
-        one: "%{count} balss"
-        other: "%{count} balsis"
-        zero: "%{count} balsu"
-      vote: Balsu skaits
-    show_more: Rādīt vairāk
-    show_thread: Rādīt tematu
     title: "%{name}: “%{quote}”"
     visibilities:
       direct: Tiešs
diff --git a/config/locales/ml.yml b/config/locales/ml.yml
index a4b9391c0068a7b338e1a2d204b6ac253b9d77af..bdc0475a6f9086f30dede3086cf83718b8c99eb5 100644
--- a/config/locales/ml.yml
+++ b/config/locales/ml.yml
@@ -4,7 +4,6 @@ ml:
     contact_missing: സജ്ജമാക്കിയിട്ടില്ല
     contact_unavailable: ലഭ്യമല്ല
   accounts:
-    follow: പിന്തുടരുക
     following: പിന്തുടരുന്നു
     last_active: അവസാനം സജീവമായിരുന്നത്
     link_verified_on: സന്ധിയുടെ ഉടമസ്ഥാവസ്‌കാശം %{date} ൽ പരിശോധിക്കപ്പെട്ടു
diff --git a/config/locales/ms.yml b/config/locales/ms.yml
index c91a624230e7d95c2680e9f7896a66f086bd13f9..39c695a5398adf6874547982f433d454bbae9c6e 100644
--- a/config/locales/ms.yml
+++ b/config/locales/ms.yml
@@ -7,7 +7,6 @@ ms:
     hosted_on: Mastodon dihoskan di %{domain}
     title: Perihal
   accounts:
-    follow: Ikut
     followers:
       other: Pengikut
     following: Mengikuti
@@ -1560,21 +1559,12 @@ ms:
     edited_at_html: Disunting %{date}
     errors:
       in_reply_not_found: Pos yang anda cuba balas nampaknya tidak wujud.
-    open_in_web: Buka dalam web
     over_character_limit: had aksara %{max} melebihi
     pin_errors:
       direct: Pos yang hanya boleh dilihat oleh pengguna yang disebut tidak boleh disematkan
       limit: Anda telah menyematkan bilangan maksimum pos
       ownership: Siaran orang lain tidak boleh disematkan
       reblog: Rangsangan tidak boleh disematkan
-    poll:
-      total_people:
-        other: "%{count} orang"
-      total_votes:
-        other: "%{count} undi"
-      vote: Undi
-    show_more: Tunjuk lebih banyak
-    show_thread: Tunjuk bebenang
     title: '%{name}: "%{quote}"'
     visibilities:
       direct: Terus
diff --git a/config/locales/my.yml b/config/locales/my.yml
index 771fbba5791841c9d6ef3b5bbe27bbe3bfd9acd5..92464523a0604906f6758e8ab73f859b3c56dc7c 100644
--- a/config/locales/my.yml
+++ b/config/locales/my.yml
@@ -7,7 +7,6 @@ my:
     hosted_on: "%{domain} မှ လက်ခံဆောင်ရွက်ထားသော Mastodon"
     title: အကြောင်း
   accounts:
-    follow: စောင့်ကြည့်မယ်
     followers:
       other: စောင့်ကြည့်သူ
     following: စောင့်ကြည့်နေသည်
@@ -1560,21 +1559,12 @@ my:
     edited_at_html: "%{date} ကို ပြင်ဆင်ပြီးပါပြီ"
     errors:
       in_reply_not_found: သင် စာပြန်နေသည့်ပို့စ်မှာ မရှိတော့ပါ။
-    open_in_web: ဝဘ်တွင် ဖွင့်ပါ
     over_character_limit: စာလုံးကန့်သတ်ချက် %{max} ကို ကျော်လွန်သွားပါပြီ
     pin_errors:
       direct: အမည်ဖော်ပြထားသည့် ပို့စ်များကို ပင်တွဲ၍မရပါ
       limit: သင်သည် ပို့စ်အရေအတွက်အများဆုံးကို ပင်တွဲထားပြီးဖြစ်သည်
       ownership: အခြားသူ၏ပို့စ်ကို ပင်တွဲ၍မရပါ
       reblog: Boost လုပ်ထားသောပို့စ်ကို ပင်ထား၍မရပါ
-    poll:
-      total_people:
-        other: "%{count} ယောက်"
-      total_votes:
-        other: မဲအရေအတွက် %{count} မဲ
-      vote: မဲပေးမည်
-    show_more: ပိုမိုပြရန်
-    show_thread: Thread ကို ပြပါ
     title: '%{name}: "%{quote}"'
     visibilities:
       direct: တိုက်ရိုက်
diff --git a/config/locales/nl.yml b/config/locales/nl.yml
index 63fcf1c857da2b30d6670236f976b0487a980efc..63656991a843a6cf823d8d30ec2b0b4fbc7627ae 100644
--- a/config/locales/nl.yml
+++ b/config/locales/nl.yml
@@ -7,7 +7,6 @@ nl:
     hosted_on: Mastodon op %{domain}
     title: Over
   accounts:
-    follow: Volgen
     followers:
       one: Volger
       other: Volgers
@@ -1740,23 +1739,12 @@ nl:
     edited_at_html: Bewerkt op %{date}
     errors:
       in_reply_not_found: Het bericht waarop je probeert te reageren lijkt niet te bestaan.
-    open_in_web: In de webapp openen
     over_character_limit: Limiet van %{max} tekens overschreden
     pin_errors:
       direct: Berichten die alleen zichtbaar zijn voor vermelde gebruikers, kunnen niet worden vastgezet
       limit: Je hebt het maximaal aantal bericht al vastgemaakt
       ownership: Een bericht van iemand anders kan niet worden vastgemaakt
       reblog: Een boost kan niet worden vastgezet
-    poll:
-      total_people:
-        one: "%{count} persoon"
-        other: "%{count} personen"
-      total_votes:
-        one: "%{count} stem"
-        other: "%{count} stemmen"
-      vote: Stemmen
-    show_more: Meer tonen
-    show_thread: Gesprek tonen
     title: '%{name}: "%{quote}"'
     visibilities:
       direct: Privébericht
diff --git a/config/locales/nn.yml b/config/locales/nn.yml
index 47dcc1ac8ece86c9cbdedc5d1bd4fc2098d62cbe..b7beeb4263ed533e9daa22fe9ffb29f4851d33f4 100644
--- a/config/locales/nn.yml
+++ b/config/locales/nn.yml
@@ -7,7 +7,6 @@ nn:
     hosted_on: "%{domain} er vert for Mastodon"
     title: Om
   accounts:
-    follow: Fylg
     followers:
       one: Fylgjar
       other: Fylgjarar
@@ -1740,23 +1739,12 @@ nn:
     edited_at_html: Redigert %{date}
     errors:
       in_reply_not_found: Det ser ut til at tutet du freistar å svara ikkje finst.
-    open_in_web: Opn på nett
     over_character_limit: øvregrensa for teikn, %{max}, er nådd
     pin_errors:
       direct: Innlegg som bare er synlige for nevnte brukere kan ikke festes
       limit: Du har allereie festa så mange tut som det går an å festa
       ownership: Du kan ikkje festa andre sine tut
       reblog: Ei framheving kan ikkje festast
-    poll:
-      total_people:
-        one: "%{count} person"
-        other: "%{count} folk"
-      total_votes:
-        one: "%{count} røyst"
-        other: "%{count} røyster"
-      vote: Røyst
-    show_more: Vis meir
-    show_thread: Vis tråden
     title: "%{name}: «%{quote}»"
     visibilities:
       direct: Direkte
diff --git a/config/locales/no.yml b/config/locales/no.yml
index b3eebd8ecccdb07c871a5866f4e4b17b9f4c27ab..635ceedde4c4d3d9ced3f5cd78becd26a8625915 100644
--- a/config/locales/no.yml
+++ b/config/locales/no.yml
@@ -7,7 +7,6 @@
     hosted_on: Mastodon driftet på %{domain}
     title: Om
   accounts:
-    follow: Følg
     followers:
       one: Følger
       other: Følgere
@@ -1619,23 +1618,12 @@
     edited_at_html: Redigert %{date}
     errors:
       in_reply_not_found: Posten du prøver å svare ser ikke ut til eksisterer.
-    open_in_web: Ã…pne i nettleser
     over_character_limit: grensen på %{max} tegn overskredet
     pin_errors:
       direct: Innlegg som bare er synlige for nevnte brukere kan ikke festes
       limit: Du har allerede festet det maksimale antall innlegg
       ownership: Kun egne innlegg kan festes
       reblog: En fremheving kan ikke festes
-    poll:
-      total_people:
-        one: "%{count} person"
-        other: "%{count} personer"
-      total_votes:
-        one: "%{count} stemme"
-        other: "%{count} stemmer"
-      vote: Stem
-    show_more: Vis mer
-    show_thread: Vis tråden
     title: "%{name}: «%{quote}»"
     visibilities:
       direct: Direkte
diff --git a/config/locales/oc.yml b/config/locales/oc.yml
index e88f8a3f69f702d238f3eb1297f1887f2b954875..5cdd9240b01d97ce630eb8687b983c688eb586b7 100644
--- a/config/locales/oc.yml
+++ b/config/locales/oc.yml
@@ -7,7 +7,6 @@ oc:
     hosted_on: Mastodon albergat sus %{domain}
     title: A prepaus
   accounts:
-    follow: Sègre
     followers:
       one: Seguidor
       other: Seguidors
@@ -846,22 +845,11 @@ oc:
     edited_at_html: Modificat %{date}
     errors:
       in_reply_not_found: La publicacion que respondètz sembla pas mai exisitir.
-    open_in_web: Dobrir sul web
     over_character_limit: limit de %{max} caractèrs passat
     pin_errors:
       limit: Avètz ja lo maximum de tuts penjats
       ownership: Se pòt pas penjar lo tut de qualqu’un mai
       reblog: Se pòt pas penjar un tut partejat
-    poll:
-      total_people:
-        one: "%{count} persona"
-        other: "%{count} personas"
-      total_votes:
-        one: "%{count} vòte"
-        other: "%{count} vòtes"
-      vote: Votar
-    show_more: Ne veire mai
-    show_thread: Mostrar lo fil
     title: '%{name} : "%{quote}"'
     visibilities:
       direct: Dirècte
diff --git a/config/locales/pa.yml b/config/locales/pa.yml
index 7a34358ddb8ff6be79fb24d53dca1678fdd5082f..1899d71008a52379ac3202591d8793c75e7b0212 100644
--- a/config/locales/pa.yml
+++ b/config/locales/pa.yml
@@ -7,7 +7,6 @@ pa:
     hosted_on: "%{domain} ਉੱਤੇ ਹੋਸਟ ਕੀਤਾ ਮਸਟਾਡੋਨ"
     title: ਇਸ ਬਾਰੇ
   accounts:
-    follow: ਫ਼ਾਲੋ
     following: ਫ਼ਾਲੋ ਕੀਤੇ ਜਾ ਰਹੇ
     posts_tab_heading: ਪੋਸਟਾਂ
   admin:
diff --git a/config/locales/pl.yml b/config/locales/pl.yml
index b710df2e78fe18d360ea0c6641a1e76acd7091b3..f0d09cb2d3017854570a794daf2781a7874f00b0 100644
--- a/config/locales/pl.yml
+++ b/config/locales/pl.yml
@@ -7,7 +7,6 @@ pl:
     hosted_on: Mastodon prowadzony na %{domain}
     title: O nas
   accounts:
-    follow: Obserwuj
     followers:
       few: śledzących
       many: śledzących
@@ -1800,27 +1799,12 @@ pl:
     edited_at_html: Edytowane %{date}
     errors:
       in_reply_not_found: Post, na który próbujesz odpowiedzieć, nie istnieje.
-    open_in_web: Otwórz w przeglądarce
     over_character_limit: limit %{max} znaków przekroczony
     pin_errors:
       direct: Nie możesz przypiąć wpisu, który jest widoczny tylko dla wspomnianych użytkowników
       limit: Przekroczyłeś maksymalną liczbę przypiętych wpisów
       ownership: Nie możesz przypiąć cudzego wpisu
       reblog: Nie możesz przypiąć podbicia wpisu
-    poll:
-      total_people:
-        few: "%{count} osoby"
-        many: "%{count} osób"
-        one: "%{count} osoba"
-        other: "%{count} osoby"
-      total_votes:
-        few: "%{count} głosy"
-        many: "%{count} głosy"
-        one: "%{count} głos"
-        other: "%{count} głosy"
-      vote: GÅ‚osuj
-    show_more: Pokaż więcej
-    show_thread: Pokaż wątek
     title: '%{name}: "%{quote}"'
     visibilities:
       direct: Bezpośredni
diff --git a/config/locales/pt-BR.yml b/config/locales/pt-BR.yml
index 864a8b4d9188b8f2d8b9a381eddc1e655450a037..d1140f364544588668932b1d040ecdf90886538b 100644
--- a/config/locales/pt-BR.yml
+++ b/config/locales/pt-BR.yml
@@ -7,7 +7,6 @@ pt-BR:
     hosted_on: Mastodon hospedado em %{domain}
     title: Sobre
   accounts:
-    follow: Seguir
     followers:
       one: Seguidor
       other: Seguidores
@@ -1740,23 +1739,12 @@ pt-BR:
     edited_at_html: Editado em %{date}
     errors:
       in_reply_not_found: A publicação que você quer responder parece não existir.
-    open_in_web: Abrir no navegador
     over_character_limit: limite de caracteres de %{max} excedido
     pin_errors:
       direct: Publicações visíveis apenas para usuários mencionados não podem ser fixadas
       limit: Você alcançou o número limite de publicações fixadas
       ownership: As publicações dos outros não podem ser fixadas
       reblog: Um impulso não pode ser fixado
-    poll:
-      total_people:
-        one: "%{count} pessoa"
-        other: "%{count} pessoas"
-      total_votes:
-        one: "%{count} voto"
-        other: "%{count} votos"
-      vote: Votar
-    show_more: Mostrar mais
-    show_thread: Mostrar conversa
     title: '%{name}: "%{quote}"'
     visibilities:
       direct: Direto
diff --git a/config/locales/pt-PT.yml b/config/locales/pt-PT.yml
index 0f0d6f36ee7242c5ba8a51f37639498d6767321e..489fb2b89b0f585919cf5eea09788a49918fce5d 100644
--- a/config/locales/pt-PT.yml
+++ b/config/locales/pt-PT.yml
@@ -7,7 +7,6 @@ pt-PT:
     hosted_on: Mastodon alojado em %{domain}
     title: Sobre
   accounts:
-    follow: Seguir
     followers:
       one: Seguidor
       other: Seguidores
@@ -1683,23 +1682,12 @@ pt-PT:
     edited_at_html: Editado em %{date}
     errors:
       in_reply_not_found: A publicação a que está a tentar responder parece não existir.
-    open_in_web: Abrir na web
     over_character_limit: limite de caracter excedeu %{max}
     pin_errors:
       direct: Publicações visíveis apenas para utilizadores mencionados não podem ser afixadas
       limit: Já afixaste a quantidade máxima de publicações
       ownership: Não podem ser afixadas publicações doutras pessoas
       reblog: Não pode afixar um reforço
-    poll:
-      total_people:
-        one: "%{count} pessoa"
-        other: "%{count} pessoas"
-      total_votes:
-        one: "%{count} voto"
-        other: "%{count} votos"
-      vote: Votar
-    show_more: Mostrar mais
-    show_thread: Mostrar conversa
     title: '%{name}: "%{quote}"'
     visibilities:
       direct: Direto
diff --git a/config/locales/ro.yml b/config/locales/ro.yml
index 52982ead2d8c229a470b3c7c98d756495cf1f166..d4f202637b3b9d590eb13389840391bfc55ca726 100644
--- a/config/locales/ro.yml
+++ b/config/locales/ro.yml
@@ -7,7 +7,6 @@ ro:
     hosted_on: Mastodon găzduit de %{domain}
     title: Despre
   accounts:
-    follow: Urmărește
     followers:
       few: Urmăritori
       one: Urmăritor
@@ -681,24 +680,11 @@ ro:
       other: 'conținea aceste hashtag-uri nepermise: %{tags}'
     errors:
       in_reply_not_found: Postarea la care încercați să răspundeți nu pare să existe.
-    open_in_web: Deschide pe web
     over_character_limit: s-a depășit limita de caracter %{max}
     pin_errors:
       limit: Deja ai fixat numărul maxim de postări
       ownership: Postarea altcuiva nu poate fi fixată
       reblog: Un impuls nu poate fi fixat
-    poll:
-      total_people:
-        few: "%{count} persoane"
-        one: "%{count} persoană"
-        other: "%{count} de persoane"
-      total_votes:
-        few: "%{count} voturi"
-        one: "%{count} vot"
-        other: "%{count} de voturi"
-      vote: Votează
-    show_more: Arată mai mult
-    show_thread: Arată discuția
     visibilities:
       private: Doar urmăritorii
       private_long: Arată doar urmăritorilor
diff --git a/config/locales/ru.yml b/config/locales/ru.yml
index 9d6b2946acb7299e962188619c100eaa83bfe786..d66dded89be07ddae18c11cba3cf9bfbdcaea751 100644
--- a/config/locales/ru.yml
+++ b/config/locales/ru.yml
@@ -7,7 +7,6 @@ ru:
     hosted_on: Вы получили это сообщение, так как зарегистрированы на %{domain}
     title: О проекте
   accounts:
-    follow: Подписаться
     followers:
       few: подписчика
       many: подписчиков
@@ -1692,27 +1691,12 @@ ru:
     edited_at_html: Редактировано %{date}
     errors:
       in_reply_not_found: Пост, на который вы пытаетесь ответить, не существует или удалён.
-    open_in_web: Открыть в веб-версии
     over_character_limit: превышен лимит символов (%{max})
     pin_errors:
       direct: Сообщения, видимые только упомянутым пользователям, не могут быть закреплены
       limit: Вы закрепили максимально возможное число постов
       ownership: Нельзя закрепить чужой пост
       reblog: Нельзя закрепить продвинутый пост
-    poll:
-      total_people:
-        few: "%{count} человека"
-        many: "%{count} человек"
-        one: "%{count} человек"
-        other: "%{count} человек"
-      total_votes:
-        few: "%{count} голоса"
-        many: "%{count} голосов"
-        one: "%{count} голос"
-        other: "%{count} голосов"
-      vote: Голосовать
-    show_more: Развернуть
-    show_thread: Открыть обсуждение
     title: '%{name}: "%{quote}"'
     visibilities:
       direct: Адресованный
diff --git a/config/locales/ry.yml b/config/locales/ry.yml
index e384b7f1b7481008e4bea8ae0f168de32c3dff73..dd1b78600ca1bbadf39bfba673b7722fc32f077a 100644
--- a/config/locales/ry.yml
+++ b/config/locales/ry.yml
@@ -1,7 +1,6 @@
 ---
 ry:
   accounts:
-    follow: Пудписати ся
     following: Пудпискы
     posts:
       few: Публикації
diff --git a/config/locales/sc.yml b/config/locales/sc.yml
index fee79a132562a7234fc650f88d3bcb955cee803b..435749f47063854b64f14a3f3f7b4df0faf1d832 100644
--- a/config/locales/sc.yml
+++ b/config/locales/sc.yml
@@ -7,7 +7,6 @@ sc:
     hosted_on: Mastodon allogiadu in %{domain}
     title: Informatziones
   accounts:
-    follow: Sighi
     followers:
       one: Sighidura
       other: Sighiduras
@@ -1111,22 +1110,11 @@ sc:
       other: 'cuntenet is etichetas non permìtidas: %{tags}'
     errors:
       in_reply_not_found: Ses chirchende de rispòndere a unu tut chi no esistit prus.
-    open_in_web: Aberi in sa web
     over_character_limit: lìmite de caràteres de %{max} superadu
     pin_errors:
       limit: As giai apicadu su nùmeru màssimu de tuts
       ownership: Is tuts de àtere non podent èssere apicados
       reblog: Is cumpartziduras non podent èssere apicadas
-    poll:
-      total_people:
-        one: "%{count} persone"
-        other: "%{count} persones"
-      total_votes:
-        one: "%{count} votu"
-        other: "%{count} votos"
-      vote: Vota
-    show_more: Ammustra·nde prus
-    show_thread: Ammustra su tema
     title: '%{name}: "%{quote}"'
     visibilities:
       direct: Deretu
diff --git a/config/locales/sco.yml b/config/locales/sco.yml
index 967706f03a7741a4a3ba66cdabd87bb8746930b6..70143a968e84cbe707496347e7c27675ba68dad0 100644
--- a/config/locales/sco.yml
+++ b/config/locales/sco.yml
@@ -7,7 +7,6 @@ sco:
     hosted_on: Mastodon hostit on %{domain}
     title: Aboot
   accounts:
-    follow: Follae
     followers:
       one: Follaer
       other: Follaers
@@ -1394,23 +1393,12 @@ sco:
     edited_at_html: Editit %{date}
     errors:
       in_reply_not_found: The post thit ye'r trying tae reply tae disnae appear tae exist.
-    open_in_web: Open in wab
     over_character_limit: chairacter limit o %{max} exceedit
     pin_errors:
       direct: Posts thit's ainly visible tae menshied uisers cannae be preent
       limit: Ye awriddy preent the maximum nummer o posts
       ownership: Somebody else's post cannae be preent
       reblog: A heeze cannae be preent
-    poll:
-      total_people:
-        one: "%{count} person"
-        other: "%{count} fowk"
-      total_votes:
-        one: "%{count} vote"
-        other: "%{count} votes"
-      vote: Vote
-    show_more: Shaw mair
-    show_thread: Shaw threid
     title: '%{name}: "%{quote}"'
     visibilities:
       direct: Direck
diff --git a/config/locales/si.yml b/config/locales/si.yml
index c7968e247931d93346ee03e4e6175a5388e1f4ea..135a99ceb217031ee2fd1f58bd245ccf49db7bfe 100644
--- a/config/locales/si.yml
+++ b/config/locales/si.yml
@@ -7,7 +7,6 @@ si:
     hosted_on: "%{domain} හරහා සත්කාරකත්‍වය ලබයි"
     title: පිළිබඳව
   accounts:
-    follow: අනුගමනය
     followers:
       one: අනුගාමිකයා
       other: අනුගාමිකයින්
@@ -1267,22 +1266,11 @@ si:
     edited_at_html: සංස්කරණය %{date}
     errors:
       in_reply_not_found: ඔබ පිළිතුරු දීමට තැත් කරන ලිපිය නොපවතින බව පෙනෙයි.
-    open_in_web: වෙබයේ විවෘත කරන්න
     over_character_limit: අක්ෂර සීමාව %{max} ඉක්මවා ඇත
     pin_errors:
       direct: සඳහන් කළ අයට පමණක් පෙනෙන ලිපි ඇමිණීමට නොහැකිය
       limit: දැනටමත් මුදුනට ඇමිණිමට හැකි ලිපි සීමාවට ළඟා වී ඇත
       ownership: වෙනත් අයගේ ලිපි ඇමිණීමට නොහැකිය
-    poll:
-      total_people:
-        one: පුද්ගලයින් %{count}
-        other: පුද්ගලයින් %{count}
-      total_votes:
-        one: ඡන්ද %{count} යි
-        other: ඡන්ද %{count} යි
-      vote: ඡන්දය
-    show_more: තව පෙන්වන්න
-    show_thread: නූල් පෙන්වන්න
     title: '%{name}: "%{quote}"'
     visibilities:
       direct: සෘජු
diff --git a/config/locales/sk.yml b/config/locales/sk.yml
index c49da0fc38293f09dea92dd6ced60ab9fe21028a..d7eacb685097967d88e75c4b9ac9db242ed008b4 100644
--- a/config/locales/sk.yml
+++ b/config/locales/sk.yml
@@ -7,7 +7,6 @@ sk:
     hosted_on: Mastodon hostovaný na %{domain}
     title: Ohľadom
   accounts:
-    follow: Nasleduj
     followers:
       few: Sledovateľov
       many: Sledovateľov
@@ -1259,26 +1258,11 @@ sk:
     edited_at_html: Upravené %{date}
     errors:
       in_reply_not_found: Príspevok, na ktorý sa snažíš odpovedať, pravdepodobne neexistuje.
-    open_in_web: Otvor v okne na webe
     over_character_limit: limit %{max} znakov bol presiahnutý
     pin_errors:
       limit: Už si si pripol ten najvyšší možný počet hlášok
       ownership: Nieje možné pripnúť hlášku od niekoho iného
       reblog: Vyzdvihnutie sa nedá pripnúť
-    poll:
-      total_people:
-        few: "%{count} ľudí"
-        many: "%{count} ľudia"
-        one: "%{count} človek"
-        other: "%{count} ľudí"
-      total_votes:
-        few: "%{count} hlasov"
-        many: "%{count} hlasov"
-        one: "%{count} hlas"
-        other: "%{count} hlasy"
-      vote: Hlasuj
-    show_more: Ukáž viac
-    show_thread: Ukáž diskusné vlákno
     title: '%{name}: „%{quote}"'
     visibilities:
       direct: Súkromne
diff --git a/config/locales/sl.yml b/config/locales/sl.yml
index d0440abb0010f2c3206369c18a09c1cd2516dddf..ef6d00b8d31a680030b13c54a9e1d35825e02c79 100644
--- a/config/locales/sl.yml
+++ b/config/locales/sl.yml
@@ -7,7 +7,6 @@ sl:
     hosted_on: Mastodon gostuje na %{domain}
     title: O programu
   accounts:
-    follow: Sledi
     followers:
       few: Sledilci
       one: Sledilec
@@ -1785,27 +1784,12 @@ sl:
     edited_at_html: Urejeno %{date}
     errors:
       in_reply_not_found: Objava, na katero želite odgovoriti, ne obstaja.
-    open_in_web: Odpri na spletu
     over_character_limit: omejitev %{max} znakov je presežena
     pin_errors:
       direct: Objav, ki so vidne samo omenjenum uporabnikom, ni mogoče pripenjati
       limit: Pripeli ste največje število objav
       ownership: Objava nekoga drugega ne more biti pripeta
       reblog: Izpostavitev ne more biti pripeta
-    poll:
-      total_people:
-        few: "%{count} osebe"
-        one: "%{count} Oseba"
-        other: "%{count} oseb"
-        two: "%{count} osebi"
-      total_votes:
-        few: "%{count} glasovi"
-        one: "%{count} glas"
-        other: "%{count} glasov"
-        two: "%{count} glasova"
-      vote: Glasuj
-    show_more: Pokaži več
-    show_thread: Pokaži nit
     title: "%{name}: »%{quote}«"
     visibilities:
       direct: Neposredno
diff --git a/config/locales/sq.yml b/config/locales/sq.yml
index 241dc08b224cfb7dfd1f99bbdfd4c5f203ef1681..70d20592a5283d2e5fc26111156046ef034e60c7 100644
--- a/config/locales/sq.yml
+++ b/config/locales/sq.yml
@@ -7,7 +7,6 @@ sq:
     hosted_on: Server Mastodon i strehuar në %{domain}
     title: Mbi
   accounts:
-    follow: Ndiqeni
     followers:
       one: Ndjekës
       other: Ndjekës
@@ -1732,23 +1731,12 @@ sq:
     edited_at_html: Përpunuar më %{date}
     errors:
       in_reply_not_found: Gjendja të cilës po provoni t’i përgjigjeni s’duket se ekziston.
-    open_in_web: Hape në internet
     over_character_limit: u tejkalua kufi shenjash prej %{max}
     pin_errors:
       direct: Postimet që janë të dukshme vetëm për përdoruesit e përmendur s’mund të fiksohen
       limit: Keni fiksuar tashmë numrin maksimum të mesazheve
       ownership: S’mund të fiksohen mesazhet e të tjerëve
       reblog: S’mund të fiksohet një përforcim
-    poll:
-      total_people:
-        one: "%{count} person"
-        other: "%{count} vetë"
-      total_votes:
-        one: "%{count} votë"
-        other: "%{count} vota"
-      vote: Votë
-    show_more: Shfaq më tepër
-    show_thread: Shfaq rrjedhën
     title: '%{name}: "%{quote}"'
     visibilities:
       direct: I drejtpërdrejtë
diff --git a/config/locales/sr-Latn.yml b/config/locales/sr-Latn.yml
index 428b9cb084efec465f0b0dbe01073fbc88bdc89e..91f0933398d5b85e0789a672ead114f10f7c6b6c 100644
--- a/config/locales/sr-Latn.yml
+++ b/config/locales/sr-Latn.yml
@@ -7,7 +7,6 @@ sr-Latn:
     hosted_on: Mastodon hostovan na %{domain}
     title: O instanci
   accounts:
-    follow: Zaprati
     followers:
       few: Pratioca
       one: Pratilac
@@ -1670,25 +1669,12 @@ sr-Latn:
     edited_at_html: Izmenjeno %{date}
     errors:
       in_reply_not_found: Objava na koju pokušavate da odgovorite naizgled ne postoji.
-    open_in_web: Otvori u vebu
     over_character_limit: ograničenje od %{max} karaktera prekoračeno
     pin_errors:
       direct: Objave koje su vidljive samo pomenutim korisnicima ne mogu biti prikačene
       limit: Već ste zakačili maksimalan broj objava
       ownership: Tuđa objava se ne može zakačiti
       reblog: Podrška ne može da se prikači
-    poll:
-      total_people:
-        few: "%{count} osobe"
-        one: "%{count} osoba"
-        other: "%{count} ljudi"
-      total_votes:
-        few: "%{count} glasa"
-        one: "%{count} glas"
-        other: "%{count} glasova"
-      vote: Glasajte
-    show_more: Prikaži još
-    show_thread: Prikaži niz
     title: "%{name}: „%{quote}”"
     visibilities:
       direct: Direktno
diff --git a/config/locales/sr.yml b/config/locales/sr.yml
index 08fbf39fb8edcb3d7f7a1bb085c355dc80353940..67aee931be8922d618c8be4fda93d64b874210e9 100644
--- a/config/locales/sr.yml
+++ b/config/locales/sr.yml
@@ -7,7 +7,6 @@ sr:
     hosted_on: Mastodon хостован на %{domain}
     title: О инстанци
   accounts:
-    follow: Запрати
     followers:
       few: Пратиоца
       one: Пратилац
@@ -1700,25 +1699,12 @@ sr:
     edited_at_html: Уређено %{date}
     errors:
       in_reply_not_found: Објава на коју покушавате да одговорите наизглед не постоји.
-    open_in_web: Отвори у вебу
     over_character_limit: ограничење од %{max} карактера прекорачено
     pin_errors:
       direct: Објаве које су видљиве само поменутим корисницима не могу бити прикачене
       limit: Већ сте закачили максималан број објава
       ownership: Туђа објава се не може закачити
       reblog: Подршка не може да се прикачи
-    poll:
-      total_people:
-        few: "%{count} особе"
-        one: "%{count} особа"
-        other: "%{count} људи"
-      total_votes:
-        few: "%{count} гласа"
-        one: "%{count} глас"
-        other: "%{count} гласова"
-      vote: Гласајте
-    show_more: Прикажи још
-    show_thread: Прикажи низ
     title: "%{name}: „%{quote}”"
     visibilities:
       direct: Директно
diff --git a/config/locales/sv.yml b/config/locales/sv.yml
index c8ddc346a5faf5d0ecf40bca98cc789d4d2350e0..99b7ec9b3a1c5265c752fe01d0b8768e6170a098 100644
--- a/config/locales/sv.yml
+++ b/config/locales/sv.yml
@@ -7,7 +7,6 @@ sv:
     hosted_on: Mastodon-värd på %{domain}
     title: Om
   accounts:
-    follow: Följa
     followers:
       one: Följare
       other: Följare
@@ -1693,23 +1692,12 @@ sv:
     edited_at_html: 'Ändrad: %{date}'
     errors:
       in_reply_not_found: Inlägget du försöker svara på verkar inte existera.
-    open_in_web: Öppna på webben
     over_character_limit: teckengräns på %{max} har överskridits
     pin_errors:
       direct: Inlägg som endast är synliga för nämnda användare kan inte fästas
       limit: Du har redan fäst det maximala antalet inlägg
       ownership: Någon annans inlägg kan inte fästas
       reblog: En boost kan inte fästas
-    poll:
-      total_people:
-        one: "%{count} person"
-        other: "%{count} personer"
-      total_votes:
-        one: "%{count} röst"
-        other: "%{count} röster"
-      vote: Rösta
-    show_more: Visa mer
-    show_thread: Visa tråd
     title: '%{name}: "%{quote}"'
     visibilities:
       direct: Direkt
diff --git a/config/locales/ta.yml b/config/locales/ta.yml
index c73148eacac66b8528bc4a3abfdfd2ec959da145..3a98b6a25d44e3b32cb737c9c35667ed4950c7d4 100644
--- a/config/locales/ta.yml
+++ b/config/locales/ta.yml
@@ -6,7 +6,6 @@ ta:
     contact_unavailable: பொ/இ
     hosted_on: மாஸ்டோடாண் %{domain} இனையத்தில் இயங்குகிறது
   accounts:
-    follow: பின்தொடர்
     followers:
       one: பின்தொடர்பவர்
       other: பின்தொடர்பவர்கள்
@@ -220,4 +219,3 @@ ta:
         other: "%{count} ஒலிகள்"
     errors:
       in_reply_not_found: நீங்கள் மறுமொழி அளிக்க முயலும் பதிவு இருப்பதுபோல் தெரியவில்லை.
-    show_thread: தொடரைக் காட்டு
diff --git a/config/locales/te.yml b/config/locales/te.yml
index a5eb8d77947b81daab079790f14b337c9bc4e985..84697a4aef1235686ab17d7319c718739c020d74 100644
--- a/config/locales/te.yml
+++ b/config/locales/te.yml
@@ -6,7 +6,6 @@ te:
     contact_unavailable: వర్తించదు
     hosted_on: మాస్టొడాన్ %{domain} లో హోస్టు చేయబడింది
   accounts:
-    follow: అనుసరించు
     followers:
       one: అనుచరి
       other: అనుచరులు
diff --git a/config/locales/th.yml b/config/locales/th.yml
index d1de9fd8186f517c660f96dad476e1c26d869c7d..cbacdfac48d42b4fbc9eee5ebb65e8cbb62ccb9b 100644
--- a/config/locales/th.yml
+++ b/config/locales/th.yml
@@ -7,7 +7,6 @@ th:
     hosted_on: Mastodon ที่โฮสต์ที่ %{domain}
     title: เกี่ยวกับ
   accounts:
-    follow: ติดตาม
     followers:
       other: ผู้ติดตาม
     following: กำลังติดตาม
@@ -1703,21 +1702,12 @@ th:
     edited_at_html: แก้ไขเมื่อ %{date}
     errors:
       in_reply_not_found: ดูเหมือนว่าจะไม่มีโพสต์ที่คุณกำลังพยายามตอบกลับอยู่
-    open_in_web: เปิดในเว็บ
     over_character_limit: เกินขีดจำกัดตัวอักษรที่ %{max} แล้ว
     pin_errors:
       direct: ไม่สามารถปักหมุดโพสต์ที่ปรากฏแก่ผู้ใช้ที่กล่าวถึงเท่านั้น
       limit: คุณได้ปักหมุดโพสต์ถึงจำนวนสูงสุดไปแล้ว
       ownership: ไม่สามารถปักหมุดโพสต์ของคนอื่น
       reblog: ไม่สามารถปักหมุดการดัน
-    poll:
-      total_people:
-        other: "%{count} คน"
-      total_votes:
-        other: "%{count} การลงคะแนน"
-      vote: ลงคะแนน
-    show_more: แสดงเพิ่มเติม
-    show_thread: แสดงกระทู้
     title: '%{name}: "%{quote}"'
     visibilities:
       direct: โดยตรง
diff --git a/config/locales/tr.yml b/config/locales/tr.yml
index 785be3caf46fd493b575d6a6711835be37d21004..d6ca6b4276c9b7051539af4ceb32f9d57abe6dc4 100644
--- a/config/locales/tr.yml
+++ b/config/locales/tr.yml
@@ -7,7 +7,6 @@ tr:
     hosted_on: Mastodon %{domain} üzerinde barındırılıyor
     title: Hakkında
   accounts:
-    follow: Takip et
     followers:
       one: Takipçi
       other: Takipçiler
@@ -1740,23 +1739,12 @@ tr:
     edited_at_html: "%{date} tarihinde düzenlendi"
     errors:
       in_reply_not_found: Yanıtlamaya çalıştığınız durum yok gibi görünüyor.
-    open_in_web: Web sayfasında aç
     over_character_limit: "%{max} karakter limiti aşıldı"
     pin_errors:
       direct: Sadece değinilen kullanıcıların görebileceği gönderiler üstte tutulamaz
       limit: Halihazırda maksimum sayıda gönderi sabitlediniz
       ownership: Başkasının gönderisi sabitlenemez
       reblog: Bir gönderi sabitlenemez
-    poll:
-      total_people:
-        one: "%{count} kiÅŸi"
-        other: "%{count} kiÅŸiler"
-      total_votes:
-        one: "%{count} oy"
-        other: "%{count} oylar"
-      vote: Oy Ver
-    show_more: Daha fazlasını göster
-    show_thread: Konuyu göster
     title: '%{name}: "%{quote}"'
     visibilities:
       direct: DoÄŸrudan
diff --git a/config/locales/tt.yml b/config/locales/tt.yml
index 3a0d9d9ce862553adf9e0c56ce7812a27ad18111..7847d636eb5b5c65bbc5868a93d656f1c86cb011 100644
--- a/config/locales/tt.yml
+++ b/config/locales/tt.yml
@@ -4,7 +4,6 @@ tt:
     contact_unavailable: Юк
     title: Проект турында
   accounts:
-    follow: Языл
     followers:
       other: язылучы
     following: Язылгансыз
@@ -519,12 +518,6 @@ tt:
       video:
         other: "%{count} видео"
     edited_at_html: "%{date} көнне төзәтте"
-    open_in_web: Веб-та ачу
-    poll:
-      total_people:
-        other: "%{count} кеше"
-      vote: Тавыш бирү
-    show_more: Күбрәк күрсәтү
     title: '%{name}: "%{quote}"'
     visibilities:
       private: Ияртүчеләр генә
diff --git a/config/locales/uk.yml b/config/locales/uk.yml
index f5cd40bad7977f5f42f1532c26c430e424ae6298..e8c4e689981712a12a0e15a20e3f1a07be3cf974 100644
--- a/config/locales/uk.yml
+++ b/config/locales/uk.yml
@@ -7,7 +7,6 @@ uk:
     hosted_on: Mastodon розміщено на %{domain}
     title: Про програму
   accounts:
-    follow: Підписатися
     followers:
       few: Підписники
       many: Підписників
@@ -1800,27 +1799,12 @@ uk:
     edited_at_html: Відредаговано %{date}
     errors:
       in_reply_not_found: Допису, на який ви намагаєтеся відповісти, не існує.
-    open_in_web: Відкрити у вебі
     over_character_limit: перевищено ліміт символів %{max}
     pin_errors:
       direct: Не можливо прикріпити дописи, які видимі лише згаданим користувачам
       limit: Ви вже закріпили максимальну кількість дописів
       ownership: Не можна закріпити чужий допис
       reblog: Не можна закріпити просунутий допис
-    poll:
-      total_people:
-        few: "%{count} людей"
-        many: "%{count} людей"
-        one: "%{count} людина"
-        other: "%{count} людей"
-      total_votes:
-        few: "%{count} голоса"
-        many: "%{count} голосів"
-        one: "%{count} голос"
-        other: "%{count} голоси"
-      vote: Проголосувати
-    show_more: Розгорнути
-    show_thread: Відкрити обговорення
     title: '%{name}: "%{quote}"'
     visibilities:
       direct: Особисто
diff --git a/config/locales/uz.yml b/config/locales/uz.yml
index 403ffd33cfe3b4e7a842dfc621be84def3167d7e..9215a0f0e8674d9232d697781492912ecf680fb6 100644
--- a/config/locales/uz.yml
+++ b/config/locales/uz.yml
@@ -2,8 +2,6 @@
 uz:
   about:
     title: Haqida
-  accounts:
-    follow: Obuna bo‘lish
   admin:
     accounts:
       display_name: Ko'rsatiladigan nom
diff --git a/config/locales/vi.yml b/config/locales/vi.yml
index dfb36c02daed14eeeea1afcaa1e0f38e4203599b..a03b46c9116ea51be3c757cddd258aab234f7325 100644
--- a/config/locales/vi.yml
+++ b/config/locales/vi.yml
@@ -7,7 +7,6 @@ vi:
     hosted_on: "%{domain} vận hành nhờ Mastodon"
     title: Giới thiệu
   accounts:
-    follow: Theo dõi
     followers:
       other: Người theo dõi
     following: Theo dõi
@@ -1703,21 +1702,12 @@ vi:
     edited_at_html: Sá»­a %{date}
     errors:
       in_reply_not_found: Bạn đang trả lời một tút không còn tồn tại.
-    open_in_web: Xem trong web
     over_character_limit: vượt quá giới hạn %{max} ký tự
     pin_errors:
       direct: Không thể ghim những tút nhắn riêng
       limit: Bạn đã ghim quá số lượng tút cho phép
       ownership: Không thể ghim tút của người khác
       reblog: Không thể ghim tút đăng lại
-    poll:
-      total_people:
-        other: "%{count} người bình chọn"
-      total_votes:
-        other: "%{count} người bình chọn"
-      vote: Bình chọn
-    show_more: Đọc thêm
-    show_thread: Nội dung gốc
     title: '%{name}: "%{quote}"'
     visibilities:
       direct: Nhắn riêng
diff --git a/config/locales/zgh.yml b/config/locales/zgh.yml
index 180fcf2f1673f43f37bb899e03f00a62b2ab5535..cbd0bc961b154fd6880a25766df6ad38b411cfa7 100644
--- a/config/locales/zgh.yml
+++ b/config/locales/zgh.yml
@@ -1,7 +1,6 @@
 ---
 zgh:
   accounts:
-    follow: ⴹⴼⵕ
     followers:
       one: ⴰⵎⴹⴼⴰⵕ
       other: ⵉⵎⴹⴼⴰⵕⵏ
diff --git a/config/locales/zh-CN.yml b/config/locales/zh-CN.yml
index 747dcf37385598d9951b288ab29aa4ed0f7d0bfd..277785f683aa97dff68040056c20bb96cde573bd 100644
--- a/config/locales/zh-CN.yml
+++ b/config/locales/zh-CN.yml
@@ -7,7 +7,6 @@ zh-CN:
     hosted_on: 运行在 %{domain} 上的 Mastodon 实例
     title: 关于本站
   accounts:
-    follow: 关注
     followers:
       other: 关注者
     following: 正在关注
@@ -1710,21 +1709,12 @@ zh-CN:
     edited_at_html: 编辑于 %{date}
     errors:
       in_reply_not_found: 你回复的嘟文似乎不存在
-    open_in_web: 在站内打开
     over_character_limit: 超过了 %{max} 字的限制
     pin_errors:
       direct: 仅对被提及的用户可见的帖子不能被置顶
       limit: 你所固定的嘟文数量已达到上限
       ownership: 不能置顶别人的嘟文
       reblog: 不能置顶转嘟
-    poll:
-      total_people:
-        other: "%{count} 人"
-      total_votes:
-        other: "%{count} 票"
-      vote: 投票
-    show_more: 显示更多
-    show_thread: 显示全部对话
     title: "%{name}:“%{quote}”"
     visibilities:
       direct: 私信
diff --git a/config/locales/zh-HK.yml b/config/locales/zh-HK.yml
index 90227b911d8fc4ef9f17401b62bbaae4c7182074..7682712759c24039546f762f42e602fcdefaacf2 100644
--- a/config/locales/zh-HK.yml
+++ b/config/locales/zh-HK.yml
@@ -7,7 +7,6 @@ zh-HK:
     hosted_on: 在 %{domain} 運作的 Mastodon 伺服器
     title: 關於
   accounts:
-    follow: 關注
     followers:
       other: 關注者
     following: 正在關注
@@ -1607,21 +1606,12 @@ zh-HK:
     edited_at_html: 編輯於 %{date}
     errors:
       in_reply_not_found: 你所回覆的嘟文並不存在。
-    open_in_web: 開啟網頁
     over_character_limit: 超過了 %{max} 字的限制
     pin_errors:
       direct: 無法將只有被提及使用者可見的帖文置頂
       limit: 你所置頂的文章數量已經達到上限
       ownership: 不能置頂他人的文章
       reblog: 不能置頂轉推
-    poll:
-      total_people:
-        other: "%{count} 人"
-      total_votes:
-        other: "%{count} 票"
-      vote: 投票
-    show_more: 顯示更多
-    show_thread: 顯示討論串
     title: "%{name}:「%{quote}」"
     visibilities:
       direct: 私人訊息
diff --git a/config/locales/zh-TW.yml b/config/locales/zh-TW.yml
index 8eab176d7d7363829e90c2747237187d8126ee4a..35f000b6016edba47883d9077c70eb1e52bb90a2 100644
--- a/config/locales/zh-TW.yml
+++ b/config/locales/zh-TW.yml
@@ -7,7 +7,6 @@ zh-TW:
     hosted_on: 於 %{domain} 託管之 Mastodon 站點
     title: 關於本站
   accounts:
-    follow: 跟隨
     followers:
       other: 跟隨者
     following: 正在跟隨
@@ -1712,21 +1711,12 @@ zh-TW:
     edited_at_html: 編輯於 %{date}
     errors:
       in_reply_not_found: 您嘗試回覆的嘟文看起來不存在。
-    open_in_web: 以網頁開啟
     over_character_limit: 已超過 %{max} 字的限制
     pin_errors:
       direct: 無法釘選只有僅提及使用者可見之嘟文
       limit: 釘選嘟文的數量已達上限
       ownership: 不能釘選他人的嘟文
       reblog: 不能釘選轉嘟
-    poll:
-      total_people:
-        other: "%{count} 個人"
-      total_votes:
-        other: "%{count} 票"
-      vote: 投票
-    show_more: 顯示更多
-    show_thread: 顯示討論串
     title: "%{name}:「%{quote}」"
     visibilities:
       direct: 私訊
diff --git a/public/embed.js b/public/embed.js
index f8e6a22db441140cc4ec2ba4526f6b28c5289a23..3fb57469a96523cfb0ad43613f9c223a909ef6d4 100644
--- a/public/embed.js
+++ b/public/embed.js
@@ -1,5 +1,7 @@
 // @ts-check
 
+const allowedPrefixes = (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT' && document.currentScript.dataset.allowedPrefixes) ? document.currentScript.dataset.allowedPrefixes.split(' ') : [];
+
 (function () {
   'use strict';
 
@@ -18,45 +20,102 @@
     }
   };
 
+  /**
+   * @param {Map} map
+   */
+  var generateId = function (map) {
+    var id = 0, failCount = 0, idBuffer = new Uint32Array(1);
+
+    while (id === 0 || map.has(id)) {
+      id = crypto.getRandomValues(idBuffer)[0];
+      failCount++;
+
+      if (failCount > 100) {
+        // give up and assign (easily guessable) unique number if getRandomValues is broken or no luck
+        id = -(map.size + 1);
+        break;
+      }
+    }
+
+    return id;
+  };
+
   ready(function () {
-    /** @type {Map<number, HTMLIFrameElement>} */
-    var iframes = new Map();
+    /** @type {Map<number, HTMLQuoteElement | HTMLIFrameElement>} */
+    var embeds = new Map();
 
     window.addEventListener('message', function (e) {
       var data = e.data || {};
 
-      if (typeof data !== 'object' || data.type !== 'setHeight' || !iframes.has(data.id)) {
+      if (typeof data !== 'object' || data.type !== 'setHeight' || !embeds.has(data.id)) {
         return;
       }
 
-      var iframe = iframes.get(data.id);
-
-      if(!iframe) return;
+      var embed = embeds.get(data.id);
 
-      if ('source' in e && iframe.contentWindow !== e.source) {
-        return;
+      if (embed instanceof HTMLIFrameElement) {
+        embed.height = data.height;
       }
 
-      iframe.height = data.height;
-    });
+      if (embed instanceof HTMLQuoteElement) {
+        var iframe = embed.querySelector('iframe');
 
-    document.querySelectorAll('iframe.mastodon-embed').forEach(iframe => {
-      // select unique id for each iframe
-      var id = 0, failCount = 0, idBuffer = new Uint32Array(1);
-      while (id === 0 || iframes.has(id)) {
-        id = crypto.getRandomValues(idBuffer)[0];
-        failCount++;
-        if (failCount > 100) {
-          // give up and assign (easily guessable) unique number if getRandomValues is broken or no luck
-          id = -(iframes.size + 1);
-          break;
+        if (!iframe || ('source' in e && iframe.contentWindow !== e.source)) {
+          return;
         }
+
+        iframe.height = data.height;
+
+        var placeholder = embed.querySelector('a');
+
+        if (!placeholder) return;
+
+        embed.removeChild(placeholder);
       }
+    });
+
+    // Legacy embeds
+    document.querySelectorAll('iframe.mastodon-embed').forEach(iframe => {
+      var id = generateId(embeds);
+
+      embeds.set(id, iframe);
+
+      iframe.allow = 'fullscreen';
+      iframe.sandbox = 'allow-scripts allow-same-origin';
+      iframe.style.border = 0;
+      iframe.style.overflow = 'hidden';
+      iframe.style.display = 'block';
+
+      iframe.onload = function () {
+        iframe.contentWindow.postMessage({
+          type: 'setHeight',
+          id: id,
+        }, '*');
+      };
+
+      iframe.onload(); // In case the script is executing after the iframe has already loaded
+    });
+
+    // New generation of embeds
+    document.querySelectorAll('blockquote.mastodon-embed').forEach(container => {
+      var id = generateId(embeds);
+
+      embeds.set(id, container);
+
+      var iframe = document.createElement('iframe');
+      var embedUrl = new URL(container.getAttribute('data-embed-url'));
 
-      iframes.set(id, iframe);
+      if (embedUrl.protocol !== 'https:' && embedUrl.protocol !== 'http:') return;
+      if (allowedPrefixes.every((allowedPrefix) => !embedUrl.toString().startsWith(allowedPrefix))) return;
 
-      iframe.scrolling = 'no';
+      iframe.src = embedUrl.toString();
+      iframe.width = container.clientWidth;
+      iframe.height = 0;
+      iframe.allow = 'fullscreen';
+      iframe.sandbox = 'allow-scripts allow-same-origin';
+      iframe.style.border = 0;
       iframe.style.overflow = 'hidden';
+      iframe.style.display = 'block';
 
       iframe.onload = function () {
         iframe.contentWindow.postMessage({
@@ -65,7 +124,7 @@
         }, '*');
       };
 
-      iframe.onload();
+      container.appendChild(iframe);
     });
   });
 })();
diff --git a/spec/controllers/statuses_controller_spec.rb b/spec/controllers/statuses_controller_spec.rb
index 2d5ff0135bb233d2e97afec87655d954b37199cc..5042523df8286446910cc7f2a771f65bbe5d8827 100644
--- a/spec/controllers/statuses_controller_spec.rb
+++ b/spec/controllers/statuses_controller_spec.rb
@@ -781,7 +781,6 @@ RSpec.describe StatusesController do
           'Cache-Control' => include('public'),
           'Link' => satisfy { |header| header.to_s.include?('activity+json') }
         )
-        expect(response.body).to include status.text
       end
     end
 
diff --git a/spec/helpers/media_component_helper_spec.rb b/spec/helpers/media_component_helper_spec.rb
index ec87a707cb6e8e8ac34992a6d0d8d21f30d6992a..a44b9b841509b961af85b126ffacaa8c81377f82 100644
--- a/spec/helpers/media_component_helper_spec.rb
+++ b/spec/helpers/media_component_helper_spec.rb
@@ -32,28 +32,6 @@ RSpec.describe MediaComponentHelper do
     end
   end
 
-  describe 'render_card_component' do
-    let(:status) { Fabricate(:status) }
-    let(:result) { helper.render_card_component(status) }
-
-    before do
-      PreviewCardsStatus.create(status: status, preview_card: Fabricate(:preview_card))
-    end
-
-    it 'returns the correct react component markup' do
-      expect(parsed_html.div['data-component']).to eq('Card')
-    end
-  end
-
-  describe 'render_poll_component' do
-    let(:status) { Fabricate(:status, poll: Fabricate(:poll)) }
-    let(:result) { helper.render_poll_component(status) }
-
-    it 'returns the correct react component markup' do
-      expect(parsed_html.div['data-component']).to eq('Poll')
-    end
-  end
-
   private
 
   def parsed_html