diff --git a/app/soapbox/actions/dropdown_menu.ts b/app/soapbox/actions/dropdown_menu.ts
index 2c19735a1..0c6fc8536 100644
--- a/app/soapbox/actions/dropdown_menu.ts
+++ b/app/soapbox/actions/dropdown_menu.ts
@@ -1,4 +1,4 @@
-import type { DropdownPlacement } from 'soapbox/components/dropdown_menu';
+import type { DropdownPlacement } from 'soapbox/components/dropdown-menu';
const DROPDOWN_MENU_OPEN = 'DROPDOWN_MENU_OPEN';
const DROPDOWN_MENU_CLOSE = 'DROPDOWN_MENU_CLOSE';
diff --git a/app/soapbox/components/__tests__/avatar_overlay.test.tsx b/app/soapbox/components/__tests__/avatar_overlay.test.tsx
index 105828556..4e83dd071 100644
--- a/app/soapbox/components/__tests__/avatar_overlay.test.tsx
+++ b/app/soapbox/components/__tests__/avatar_overlay.test.tsx
@@ -3,7 +3,7 @@ import React from 'react';
import { normalizeAccount } from 'soapbox/normalizers';
import { render, screen } from '../../jest/test-helpers';
-import AvatarOverlay from '../avatar_overlay';
+import AvatarOverlay from '../avatar-overlay';
import type { ReducerAccount } from 'soapbox/reducers/accounts';
diff --git a/app/soapbox/components/__tests__/emoji_selector.test.tsx b/app/soapbox/components/__tests__/emoji_selector.test.tsx
index c680d156e..b382a4b94 100644
--- a/app/soapbox/components/__tests__/emoji_selector.test.tsx
+++ b/app/soapbox/components/__tests__/emoji_selector.test.tsx
@@ -1,7 +1,7 @@
import React from 'react';
import { render, screen } from '../../jest/test-helpers';
-import EmojiSelector from '../emoji_selector';
+import EmojiSelector from '../emoji-selector';
describe('', () => {
it('renders correctly', () => {
diff --git a/app/soapbox/components/account_search.tsx b/app/soapbox/components/account-search.tsx
similarity index 99%
rename from app/soapbox/components/account_search.tsx
rename to app/soapbox/components/account-search.tsx
index bf9652b66..883278bcf 100644
--- a/app/soapbox/components/account_search.tsx
+++ b/app/soapbox/components/account-search.tsx
@@ -2,7 +2,7 @@ import classNames from 'clsx';
import React, { useState } from 'react';
import { defineMessages, useIntl } from 'react-intl';
-import AutosuggestAccountInput from 'soapbox/components/autosuggest_account_input';
+import AutosuggestAccountInput from 'soapbox/components/autosuggest-account-input';
import Icon from 'soapbox/components/icon';
const messages = defineMessages({
diff --git a/app/soapbox/components/attachment_list.tsx b/app/soapbox/components/attachment_list.tsx
deleted file mode 100644
index 94c496819..000000000
--- a/app/soapbox/components/attachment_list.tsx
+++ /dev/null
@@ -1,54 +0,0 @@
-import React from 'react';
-
-import Icon from 'soapbox/components/icon';
-
-import type { Attachment as AttachmentEntity } from 'soapbox/types/entities';
-
-const filename = (url: string) => url.split('/').pop()!.split('#')[0].split('?')[0];
-
-interface IAttachmentList {
- media: AttachmentEntity[],
- compact?: boolean,
-}
-
-const AttachmentList: React.FC = ({ media, compact }) => {
- if (compact) {
- return (
-
-
- {media.map(attachment => {
- const displayUrl = attachment.get('remote_url') || attachment.get('url');
-
- return (
- -
- {filename(displayUrl)}
-
- );
- })}
-
-
- );
- }
-
- return (
-
-
-
-
-
-
- {media.map(attachment => {
- const displayUrl = attachment.get('remote_url') || attachment.get('url');
-
- return (
- -
- {filename(displayUrl)}
-
- );
- })}
-
-
- );
-};
-
-export default AttachmentList;
diff --git a/app/soapbox/components/autosuggest_account_input.tsx b/app/soapbox/components/autosuggest-account-input.tsx
similarity index 96%
rename from app/soapbox/components/autosuggest_account_input.tsx
rename to app/soapbox/components/autosuggest-account-input.tsx
index e8cd63830..17c5f41cb 100644
--- a/app/soapbox/components/autosuggest_account_input.tsx
+++ b/app/soapbox/components/autosuggest-account-input.tsx
@@ -6,10 +6,10 @@ import { accountSearch } from 'soapbox/actions/accounts';
import AutosuggestInput, { AutoSuggestion } from 'soapbox/components/autosuggest_input';
import { useAppDispatch } from 'soapbox/hooks';
-import type { Menu } from 'soapbox/components/dropdown_menu';
+import type { Menu } from 'soapbox/components/dropdown-menu';
import type { InputThemes } from 'soapbox/components/ui/input/input';
-const noOp = () => {};
+const noOp = () => { };
interface IAutosuggestAccountInput {
onChange: React.ChangeEventHandler,
diff --git a/app/soapbox/components/autosuggest_input.tsx b/app/soapbox/components/autosuggest_input.tsx
index eb51ae41f..9313e092f 100644
--- a/app/soapbox/components/autosuggest_input.tsx
+++ b/app/soapbox/components/autosuggest_input.tsx
@@ -10,7 +10,7 @@ import { Input } from 'soapbox/components/ui';
import AutosuggestAccount from 'soapbox/features/compose/components/autosuggest_account';
import { isRtl } from 'soapbox/rtl';
-import type { Menu, MenuItem } from 'soapbox/components/dropdown_menu';
+import type { Menu, MenuItem } from 'soapbox/components/dropdown-menu';
import type { InputThemes } from 'soapbox/components/ui/input/input';
type CursorMatch = [
diff --git a/app/soapbox/components/avatar_overlay.tsx b/app/soapbox/components/avatar-overlay.tsx
similarity index 100%
rename from app/soapbox/components/avatar_overlay.tsx
rename to app/soapbox/components/avatar-overlay.tsx
diff --git a/app/soapbox/components/birthday_input.tsx b/app/soapbox/components/birthday-input.tsx
similarity index 100%
rename from app/soapbox/components/birthday_input.tsx
rename to app/soapbox/components/birthday-input.tsx
diff --git a/app/soapbox/components/column_header.js b/app/soapbox/components/column-header.js
similarity index 100%
rename from app/soapbox/components/column_header.js
rename to app/soapbox/components/column-header.js
diff --git a/app/soapbox/components/dropdown_menu.tsx b/app/soapbox/components/dropdown-menu.tsx
similarity index 100%
rename from app/soapbox/components/dropdown_menu.tsx
rename to app/soapbox/components/dropdown-menu.tsx
diff --git a/app/soapbox/components/emoji_selector.tsx b/app/soapbox/components/emoji-selector.tsx
similarity index 100%
rename from app/soapbox/components/emoji_selector.tsx
rename to app/soapbox/components/emoji-selector.tsx
diff --git a/app/soapbox/components/error_boundary.tsx b/app/soapbox/components/error-boundary.tsx
similarity index 100%
rename from app/soapbox/components/error_boundary.tsx
rename to app/soapbox/components/error-boundary.tsx
diff --git a/app/soapbox/components/extended_video_player.tsx b/app/soapbox/components/extended-video-player.tsx
similarity index 100%
rename from app/soapbox/components/extended_video_player.tsx
rename to app/soapbox/components/extended-video-player.tsx
diff --git a/app/soapbox/components/fork_awesome_icon.tsx b/app/soapbox/components/fork-awesome-icon.tsx
similarity index 100%
rename from app/soapbox/components/fork_awesome_icon.tsx
rename to app/soapbox/components/fork-awesome-icon.tsx
diff --git a/app/soapbox/components/icon.tsx b/app/soapbox/components/icon.tsx
index cba7b5805..93985d55a 100644
--- a/app/soapbox/components/icon.tsx
+++ b/app/soapbox/components/icon.tsx
@@ -7,7 +7,7 @@
import React from 'react';
-import ForkAwesomeIcon, { IForkAwesomeIcon } from './fork_awesome_icon';
+import ForkAwesomeIcon, { IForkAwesomeIcon } from './fork-awesome-icon';
import SvgIcon, { ISvgIcon } from './svg_icon';
export type IIcon = IForkAwesomeIcon | ISvgIcon;
diff --git a/app/soapbox/components/sidebar-navigation.tsx b/app/soapbox/components/sidebar-navigation.tsx
index 4dd47efff..9ff0ad0f8 100644
--- a/app/soapbox/components/sidebar-navigation.tsx
+++ b/app/soapbox/components/sidebar-navigation.tsx
@@ -9,7 +9,7 @@ import { getFeatures } from 'soapbox/utils/features';
import SidebarNavigationLink from './sidebar-navigation-link';
-import type { Menu } from 'soapbox/components/dropdown_menu';
+import type { Menu } from 'soapbox/components/dropdown-menu';
const messages = defineMessages({
follow_requests: { id: 'navigation_bar.follow_requests', defaultMessage: 'Follow requests' },
diff --git a/app/soapbox/components/status-action-bar.tsx b/app/soapbox/components/status-action-bar.tsx
index 9153cb256..6429050d9 100644
--- a/app/soapbox/components/status-action-bar.tsx
+++ b/app/soapbox/components/status-action-bar.tsx
@@ -21,7 +21,7 @@ import { useAppDispatch, useAppSelector, useFeatures, useOwnAccount, useSettings
import { isLocal } from 'soapbox/utils/accounts';
import { getReactForStatus, reduceEmoji } from 'soapbox/utils/emoji_reacts';
-import type { Menu } from 'soapbox/components/dropdown_menu';
+import type { Menu } from 'soapbox/components/dropdown-menu';
import type { Account, Status } from 'soapbox/types/entities';
const messages = defineMessages({
diff --git a/app/soapbox/containers/dropdown_menu_container.ts b/app/soapbox/containers/dropdown_menu_container.ts
index b047edfff..c5e0dc8cb 100644
--- a/app/soapbox/containers/dropdown_menu_container.ts
+++ b/app/soapbox/containers/dropdown_menu_container.ts
@@ -2,11 +2,11 @@ import { connect } from 'react-redux';
import { openDropdownMenu, closeDropdownMenu } from '../actions/dropdown_menu';
import { openModal, closeModal } from '../actions/modals';
-import DropdownMenu from '../components/dropdown_menu';
+import DropdownMenu from '../components/dropdown-menu';
import { isUserTouching } from '../is_mobile';
import type { Dispatch } from 'redux';
-import type { DropdownPlacement, IDropdown } from 'soapbox/components/dropdown_menu';
+import type { DropdownPlacement, IDropdown } from 'soapbox/components/dropdown-menu';
import type { RootState } from 'soapbox/store';
const mapStateToProps = (state: RootState) => ({
diff --git a/app/soapbox/containers/soapbox.tsx b/app/soapbox/containers/soapbox.tsx
index 2841ec3ca..6249fe44a 100644
--- a/app/soapbox/containers/soapbox.tsx
+++ b/app/soapbox/containers/soapbox.tsx
@@ -45,7 +45,7 @@ import { generateThemeCss } from 'soapbox/utils/theme';
import { checkOnboardingStatus } from '../actions/onboarding';
import { preload } from '../actions/preload';
-import ErrorBoundary from '../components/error_boundary';
+import ErrorBoundary from '../components/error-boundary';
import UI from '../features/ui';
import { store } from '../store';
diff --git a/app/soapbox/features/account/components/header.tsx b/app/soapbox/features/account/components/header.tsx
index 21e44f33b..fdb12611f 100644
--- a/app/soapbox/features/account/components/header.tsx
+++ b/app/soapbox/features/account/components/header.tsx
@@ -27,7 +27,7 @@ import { normalizeAttachment } from 'soapbox/normalizers';
import { Account } from 'soapbox/types/entities';
import { isRemote } from 'soapbox/utils/accounts';
-import type { Menu as MenuType } from 'soapbox/components/dropdown_menu';
+import type { Menu as MenuType } from 'soapbox/components/dropdown-menu';
const messages = defineMessages({
edit_profile: { id: 'account.edit_profile', defaultMessage: 'Edit profile' },
diff --git a/app/soapbox/features/account_timeline/components/moved_note.tsx b/app/soapbox/features/account_timeline/components/moved_note.tsx
index 0ba6d8da5..19a9249f1 100644
--- a/app/soapbox/features/account_timeline/components/moved_note.tsx
+++ b/app/soapbox/features/account_timeline/components/moved_note.tsx
@@ -2,7 +2,7 @@ import React from 'react';
import { FormattedMessage } from 'react-intl';
import { NavLink } from 'react-router-dom';
-import AvatarOverlay from 'soapbox/components/avatar_overlay';
+import AvatarOverlay from 'soapbox/components/avatar-overlay';
import DisplayName from 'soapbox/components/display-name';
import Icon from 'soapbox/components/icon';
diff --git a/app/soapbox/features/auth_login/components/registration_form.tsx b/app/soapbox/features/auth_login/components/registration_form.tsx
index bdf4bc05d..fa5ad524c 100644
--- a/app/soapbox/features/auth_login/components/registration_form.tsx
+++ b/app/soapbox/features/auth_login/components/registration_form.tsx
@@ -9,7 +9,7 @@ import { v4 as uuidv4 } from 'uuid';
import { accountLookup } from 'soapbox/actions/accounts';
import { register, verifyCredentials } from 'soapbox/actions/auth';
import { openModal } from 'soapbox/actions/modals';
-import BirthdayInput from 'soapbox/components/birthday_input';
+import BirthdayInput from 'soapbox/components/birthday-input';
import { Checkbox, Form, FormGroup, FormActions, Button, Input, Textarea } from 'soapbox/components/ui';
import CaptchaField from 'soapbox/features/auth_login/components/captcha';
import { useAppSelector, useAppDispatch, useSettings, useFeatures } from 'soapbox/hooks';
diff --git a/app/soapbox/features/chats/components/chat-message-list.tsx b/app/soapbox/features/chats/components/chat-message-list.tsx
index 9303f2b33..c1d6362ed 100644
--- a/app/soapbox/features/chats/components/chat-message-list.tsx
+++ b/app/soapbox/features/chats/components/chat-message-list.tsx
@@ -21,7 +21,7 @@ import { MediaGallery } from 'soapbox/features/ui/util/async-components';
import { useAppSelector, useAppDispatch, useRefEventHandler } from 'soapbox/hooks';
import { onlyEmoji } from 'soapbox/utils/rich_content';
-import type { Menu } from 'soapbox/components/dropdown_menu';
+import type { Menu } from 'soapbox/components/dropdown-menu';
import type { ChatMessage as ChatMessageEntity } from 'soapbox/types/entities';
const BIG_EMOJI_LIMIT = 1;
diff --git a/app/soapbox/features/chats/components/chat-panes.tsx b/app/soapbox/features/chats/components/chat-panes.tsx
index 6ed873139..0aab9734f 100644
--- a/app/soapbox/features/chats/components/chat-panes.tsx
+++ b/app/soapbox/features/chats/components/chat-panes.tsx
@@ -6,7 +6,7 @@ import { createSelector } from 'reselect';
import { openChat, launchChat, toggleMainWindow } from 'soapbox/actions/chats';
import { getSettings } from 'soapbox/actions/settings';
-import AccountSearch from 'soapbox/components/account_search';
+import AccountSearch from 'soapbox/components/account-search';
import { Counter } from 'soapbox/components/ui';
import AudioToggle from 'soapbox/features/chats/components/audio-toggle';
import { useAppDispatch, useAppSelector, useSettings } from 'soapbox/hooks';
diff --git a/app/soapbox/features/chats/index.tsx b/app/soapbox/features/chats/index.tsx
index 5635cbdc8..b3d0a2cff 100644
--- a/app/soapbox/features/chats/index.tsx
+++ b/app/soapbox/features/chats/index.tsx
@@ -4,7 +4,7 @@ import { useDispatch } from 'react-redux';
import { useHistory } from 'react-router-dom';
import { launchChat } from 'soapbox/actions/chats';
-import AccountSearch from 'soapbox/components/account_search';
+import AccountSearch from 'soapbox/components/account-search';
import AudioToggle from 'soapbox/features/chats/components/audio-toggle';
import { Column } from '../../components/ui';
diff --git a/app/soapbox/features/compose/components/search.tsx b/app/soapbox/features/compose/components/search.tsx
index 818080f2f..a5f310655 100644
--- a/app/soapbox/features/compose/components/search.tsx
+++ b/app/soapbox/features/compose/components/search.tsx
@@ -14,7 +14,7 @@ import {
showSearch,
submitSearch,
} from 'soapbox/actions/search';
-import AutosuggestAccountInput from 'soapbox/components/autosuggest_account_input';
+import AutosuggestAccountInput from 'soapbox/components/autosuggest-account-input';
import { Input } from 'soapbox/components/ui';
import SvgIcon from 'soapbox/components/ui/icon/svg-icon';
import { useAppSelector } from 'soapbox/hooks';
diff --git a/app/soapbox/features/conversations/index.tsx b/app/soapbox/features/conversations/index.tsx
index 8e81ac1c5..0faf2237f 100644
--- a/app/soapbox/features/conversations/index.tsx
+++ b/app/soapbox/features/conversations/index.tsx
@@ -4,7 +4,7 @@ import { defineMessages, useIntl } from 'react-intl';
import { directComposeById } from 'soapbox/actions/compose';
import { mountConversations, unmountConversations, expandConversations } from 'soapbox/actions/conversations';
import { connectDirectStream } from 'soapbox/actions/streaming';
-import AccountSearch from 'soapbox/components/account_search';
+import AccountSearch from 'soapbox/components/account-search';
import { Column } from 'soapbox/components/ui';
import { useAppDispatch } from 'soapbox/hooks';
diff --git a/app/soapbox/features/direct_timeline/index.tsx b/app/soapbox/features/direct_timeline/index.tsx
index 9da60dd9f..885c617db 100644
--- a/app/soapbox/features/direct_timeline/index.tsx
+++ b/app/soapbox/features/direct_timeline/index.tsx
@@ -4,8 +4,8 @@ import { defineMessages, FormattedMessage, useIntl } from 'react-intl';
import { directComposeById } from 'soapbox/actions/compose';
import { connectDirectStream } from 'soapbox/actions/streaming';
import { expandDirectTimeline } from 'soapbox/actions/timelines';
-import AccountSearch from 'soapbox/components/account_search';
-import ColumnHeader from 'soapbox/components/column_header';
+import AccountSearch from 'soapbox/components/account-search';
+import ColumnHeader from 'soapbox/components/column-header';
import { Column } from 'soapbox/components/ui';
import { useAppDispatch, useAppSelector } from 'soapbox/hooks';
diff --git a/app/soapbox/features/edit_profile/index.tsx b/app/soapbox/features/edit_profile/index.tsx
index c60298a7b..de7d6ee2d 100644
--- a/app/soapbox/features/edit_profile/index.tsx
+++ b/app/soapbox/features/edit_profile/index.tsx
@@ -4,7 +4,7 @@ import { defineMessages, useIntl, FormattedMessage } from 'react-intl';
import { updateNotificationSettings } from 'soapbox/actions/accounts';
import { patchMe } from 'soapbox/actions/me';
import snackbar from 'soapbox/actions/snackbar';
-import BirthdayInput from 'soapbox/components/birthday_input';
+import BirthdayInput from 'soapbox/components/birthday-input';
import List, { ListItem } from 'soapbox/components/list';
import {
Button,
diff --git a/app/soapbox/features/ui/components/accordion.tsx b/app/soapbox/features/ui/components/accordion.tsx
index f425e5321..6c07aa25b 100644
--- a/app/soapbox/features/ui/components/accordion.tsx
+++ b/app/soapbox/features/ui/components/accordion.tsx
@@ -5,7 +5,7 @@ import { defineMessages, useIntl } from 'react-intl';
import { Text } from 'soapbox/components/ui';
import DropdownMenu from 'soapbox/containers/dropdown_menu_container';
-import type { Menu } from 'soapbox/components/dropdown_menu';
+import type { Menu } from 'soapbox/components/dropdown-menu';
const messages = defineMessages({
collapse: { id: 'accordion.collapse', defaultMessage: 'Collapse' },
diff --git a/app/soapbox/features/ui/components/actions_modal.tsx b/app/soapbox/features/ui/components/actions_modal.tsx
index cc00126f6..67e29933f 100644
--- a/app/soapbox/features/ui/components/actions_modal.tsx
+++ b/app/soapbox/features/ui/components/actions_modal.tsx
@@ -10,7 +10,7 @@ import AccountContainer from 'soapbox/containers/account_container';
import Motion from '../util/optional_motion';
-import type { Menu, MenuItem } from 'soapbox/components/dropdown_menu';
+import type { Menu, MenuItem } from 'soapbox/components/dropdown-menu';
import type { Status as StatusEntity } from 'soapbox/types/entities';
interface IActionsModal {
diff --git a/app/soapbox/features/ui/components/media-modal.tsx b/app/soapbox/features/ui/components/media-modal.tsx
index 1a432de3b..c5530ec47 100644
--- a/app/soapbox/features/ui/components/media-modal.tsx
+++ b/app/soapbox/features/ui/components/media-modal.tsx
@@ -4,7 +4,7 @@ import { defineMessages, useIntl, FormattedMessage } from 'react-intl';
import { useHistory } from 'react-router-dom';
import ReactSwipeableViews from 'react-swipeable-views';
-import ExtendedVideoPlayer from 'soapbox/components/extended_video_player';
+import ExtendedVideoPlayer from 'soapbox/components/extended-video-player';
import Icon from 'soapbox/components/icon';
import IconButton from 'soapbox/components/icon_button';
import Audio from 'soapbox/features/audio';
diff --git a/app/soapbox/reducers/dropdown_menu.ts b/app/soapbox/reducers/dropdown_menu.ts
index 2b5c50252..64bc316b9 100644
--- a/app/soapbox/reducers/dropdown_menu.ts
+++ b/app/soapbox/reducers/dropdown_menu.ts
@@ -6,7 +6,7 @@ import {
} from '../actions/dropdown_menu';
import type { AnyAction } from 'redux';
-import type { DropdownPlacement } from 'soapbox/components/dropdown_menu';
+import type { DropdownPlacement } from 'soapbox/components/dropdown-menu';
const ReducerRecord = ImmutableRecord({
openId: null as number | null,