gitextract_7gdsh6yf/ ├── .coveragerc ├── .devcontainer/ │ └── devcontainer.json ├── .dockerignore ├── .gitattributes ├── .github/ │ └── workflows/ │ ├── build-test.yaml │ ├── build.yaml │ └── main.yaml ├── .gitignore ├── CHANGELOG.md ├── LICENSE.txt ├── Makefile ├── README.md ├── SECURITY.md ├── assets/ │ ├── header.afdesign │ ├── logo-inset.afdesign │ ├── logo.afdesign │ └── social-preview.afdesign ├── bookmarks/ │ ├── __init__.py │ ├── admin.py │ ├── api/ │ │ ├── __init__.py │ │ ├── auth.py │ │ ├── routes.py │ │ └── serializers.py │ ├── apps.py │ ├── context_processors.py │ ├── feeds.py │ ├── forms.py │ ├── frontend/ │ │ ├── api.js │ │ ├── components/ │ │ │ ├── bookmark-page.js │ │ │ ├── clear-button.js │ │ │ ├── confirm-dropdown.js │ │ │ ├── details-modal.js │ │ │ ├── dev-tool.js │ │ │ ├── dropdown.js │ │ │ ├── filter-drawer.js │ │ │ ├── form.js │ │ │ ├── modal.js │ │ │ ├── search-autocomplete.js │ │ │ ├── tag-autocomplete.js │ │ │ └── upload-button.js │ │ ├── index.js │ │ ├── shortcuts.js │ │ └── utils/ │ │ ├── element.js │ │ ├── focus.js │ │ ├── input.js │ │ ├── position-controller.js │ │ ├── search-history.js │ │ └── tag-cache.js │ ├── management/ │ │ └── commands/ │ │ ├── backup.py │ │ ├── create_initial_superuser.py │ │ ├── enable_wal.py │ │ ├── ensure_superuser.py │ │ ├── full_backup.py │ │ ├── generate_secret_key.py │ │ ├── import_netscape.py │ │ └── migrate_tasks.py │ ├── middlewares.py │ ├── migrations/ │ │ ├── 0001_initial.py │ │ ├── 0002_auto_20190629_2303.py │ │ ├── 0003_auto_20200913_0656.py │ │ ├── 0004_auto_20200926_1028.py │ │ ├── 0005_auto_20210103_1212.py │ │ ├── 0006_bookmark_is_archived.py │ │ ├── 0007_userprofile.py │ │ ├── 0008_userprofile_bookmark_date_display.py │ │ ├── 0009_bookmark_web_archive_snapshot_url.py │ │ ├── 0010_userprofile_bookmark_link_target.py │ │ ├── 0011_userprofile_web_archive_integration.py │ │ ├── 0012_toast.py │ │ ├── 0013_web_archive_optin_toast.py │ │ ├── 0014_alter_bookmark_unread.py │ │ ├── 0015_feedtoken.py │ │ ├── 0016_bookmark_shared.py │ │ ├── 0017_userprofile_enable_sharing.py │ │ ├── 0018_bookmark_favicon_file.py │ │ ├── 0019_userprofile_enable_favicons.py │ │ ├── 0020_userprofile_tag_search.py │ │ ├── 0021_userprofile_display_url.py │ │ ├── 0022_bookmark_notes.py │ │ ├── 0023_userprofile_permanent_notes.py │ │ ├── 0024_userprofile_enable_public_sharing.py │ │ ├── 0025_userprofile_search_preferences.py │ │ ├── 0026_userprofile_custom_css.py │ │ ├── 0027_userprofile_bookmark_description_display_and_more.py │ │ ├── 0028_userprofile_display_archive_bookmark_action_and_more.py │ │ ├── 0029_bookmark_list_actions_toast.py │ │ ├── 0030_bookmarkasset.py │ │ ├── 0031_userprofile_enable_automatic_html_snapshots.py │ │ ├── 0032_html_snapshots_hint_toast.py │ │ ├── 0033_userprofile_default_mark_unread.py │ │ ├── 0034_bookmark_preview_image_file_and_more.py │ │ ├── 0035_userprofile_tag_grouping.py │ │ ├── 0036_userprofile_auto_tagging_rules.py │ │ ├── 0037_globalsettings.py │ │ ├── 0038_globalsettings_guest_profile_user.py │ │ ├── 0039_globalsettings_enable_link_prefetch.py │ │ ├── 0040_userprofile_items_per_page_and_more.py │ │ ├── 0041_merge_metadata.py │ │ ├── 0042_userprofile_custom_css_hash.py │ │ ├── 0043_userprofile_collapse_side_panel.py │ │ ├── 0044_bookmark_latest_snapshot.py │ │ ├── 0045_userprofile_hide_bundles_bookmarkbundle.py │ │ ├── 0046_add_url_normalized_field.py │ │ ├── 0047_populate_url_normalized_field.py │ │ ├── 0048_userprofile_default_mark_shared.py │ │ ├── 0049_userprofile_legacy_search.py │ │ ├── 0050_new_search_toast.py │ │ ├── 0051_fix_normalized_url.py │ │ ├── 0052_apitoken.py │ │ ├── 0053_migrate_api_tokens.py │ │ ├── 0054_bookmarkbundle_filter_shared_and_more.py │ │ └── __init__.py │ ├── models.py │ ├── queries.py │ ├── services/ │ │ ├── __init__.py │ │ ├── assets.py │ │ ├── auto_tagging.py │ │ ├── bookmarks.py │ │ ├── bundles.py │ │ ├── exporter.py │ │ ├── favicon_loader.py │ │ ├── importer.py │ │ ├── monolith.py │ │ ├── parser.py │ │ ├── preview_image_loader.py │ │ ├── search_query_parser.py │ │ ├── singlefile.py │ │ ├── tags.py │ │ ├── tasks.py │ │ ├── wayback.py │ │ └── website_loader.py │ ├── settings/ │ │ ├── __init__.py │ │ ├── base.py │ │ ├── custom.py │ │ ├── dev.py │ │ └── prod.py │ ├── signals.py │ ├── static/ │ │ ├── live-reload.js │ │ ├── robots.txt │ │ └── vendor/ │ │ └── Readability.js │ ├── styles/ │ │ ├── auth.css │ │ ├── bookmark-details.css │ │ ├── bookmark-form.css │ │ ├── bookmark-page.css │ │ ├── bundles.css │ │ ├── components.css │ │ ├── crud.css │ │ ├── layout.css │ │ ├── markdown.css │ │ ├── reader-mode.css │ │ ├── responsive.css │ │ ├── settings.css │ │ ├── tags.css │ │ ├── theme/ │ │ │ ├── LICENSE │ │ │ ├── _normalize.css │ │ │ ├── animations.css │ │ │ ├── asian.css │ │ │ ├── autocomplete.css │ │ │ ├── badges.css │ │ │ ├── base.css │ │ │ ├── buttons.css │ │ │ ├── code.css │ │ │ ├── dropdowns.css │ │ │ ├── empty.css │ │ │ ├── forms.css │ │ │ ├── menus.css │ │ │ ├── modals.css │ │ │ ├── pagination.css │ │ │ ├── tables.css │ │ │ ├── tabs.css │ │ │ ├── toasts.css │ │ │ ├── typography.css │ │ │ ├── utilities.css │ │ │ └── variables.css │ │ ├── theme-dark.css │ │ └── theme-light.css │ ├── tasks.py │ ├── templates/ │ │ ├── admin/ │ │ │ └── background_tasks.html │ │ ├── bookmarks/ │ │ │ ├── bookmark_list.html │ │ │ ├── bookmark_page.html │ │ │ ├── bulk_edit_bar.html │ │ │ ├── bundle_section.html │ │ │ ├── close.html │ │ │ ├── details/ │ │ │ │ ├── asset_icon.html │ │ │ │ ├── assets.html │ │ │ │ ├── form.html │ │ │ │ └── modal.html │ │ │ ├── edit.html │ │ │ ├── empty_bookmarks.html │ │ │ ├── form.html │ │ │ ├── new.html │ │ │ ├── read.html │ │ │ ├── search.html │ │ │ ├── tag_cloud.html │ │ │ ├── tag_section.html │ │ │ └── user_section.html │ │ ├── bundles/ │ │ │ ├── edit.html │ │ │ ├── form.html │ │ │ ├── index.html │ │ │ ├── new.html │ │ │ └── preview.html │ │ ├── opensearch.xml │ │ ├── registration/ │ │ │ ├── login.html │ │ │ ├── password_change_done.html │ │ │ └── password_change_form.html │ │ ├── settings/ │ │ │ ├── bookmarklet.js │ │ │ ├── bookmarklet_clientside.js │ │ │ ├── create_api_token_modal.html │ │ │ ├── general.html │ │ │ └── integrations.html │ │ ├── shared/ │ │ │ ├── dev_tool.html │ │ │ ├── error_list.html │ │ │ ├── head.html │ │ │ ├── layout.html │ │ │ ├── messages.html │ │ │ ├── modal_header.html │ │ │ ├── nav_menu.html │ │ │ ├── pagination.html │ │ │ └── top_frame.html │ │ └── tags/ │ │ ├── edit.html │ │ ├── form.html │ │ ├── index.html │ │ ├── merge.html │ │ └── new.html │ ├── templatetags/ │ │ ├── __init__.py │ │ ├── bookmarks.py │ │ ├── pagination.py │ │ └── shared.py │ ├── tests/ │ │ ├── __init__.py │ │ ├── helpers.py │ │ ├── resources/ │ │ │ ├── simple_valid_import_file.html │ │ │ └── simple_valid_import_file_with_one_invalid_bookmark.html │ │ ├── test_app_options.py │ │ ├── test_assets_service.py │ │ ├── test_auth_api.py │ │ ├── test_auth_proxy_support.py │ │ ├── test_auto_tagging.py │ │ ├── test_bookmark_action_view.py │ │ ├── test_bookmark_archived_view.py │ │ ├── test_bookmark_archived_view_performance.py │ │ ├── test_bookmark_asset_view.py │ │ ├── test_bookmark_assets.py │ │ ├── test_bookmark_assets_api.py │ │ ├── test_bookmark_details_modal.py │ │ ├── test_bookmark_edit_view.py │ │ ├── test_bookmark_index_view.py │ │ ├── test_bookmark_index_view_performance.py │ │ ├── test_bookmark_new_view.py │ │ ├── test_bookmark_previews.py │ │ ├── test_bookmark_search_form.py │ │ ├── test_bookmark_search_model.py │ │ ├── test_bookmark_search_tag.py │ │ ├── test_bookmark_shared_view.py │ │ ├── test_bookmark_shared_view_performance.py │ │ ├── test_bookmark_validation.py │ │ ├── test_bookmarks_api.py │ │ ├── test_bookmarks_api_performance.py │ │ ├── test_bookmarks_api_permissions.py │ │ ├── test_bookmarks_list_template.py │ │ ├── test_bookmarks_model.py │ │ ├── test_bookmarks_service.py │ │ ├── test_bookmarks_tasks.py │ │ ├── test_bundles_api.py │ │ ├── test_bundles_edit_view.py │ │ ├── test_bundles_index_view.py │ │ ├── test_bundles_new_view.py │ │ ├── test_bundles_preview_view.py │ │ ├── test_context_path.py │ │ ├── test_create_initial_superuser_command.py │ │ ├── test_custom_css_view.py │ │ ├── test_exporter.py │ │ ├── test_exporter_performance.py │ │ ├── test_favicon_loader.py │ │ ├── test_feeds.py │ │ ├── test_feeds_performance.py │ │ ├── test_health_view.py │ │ ├── test_importer.py │ │ ├── test_layout.py │ │ ├── test_linkding_middleware.py │ │ ├── test_login_view.py │ │ ├── test_metadata_view.py │ │ ├── test_monolith_service.py │ │ ├── test_oidc_support.py │ │ ├── test_opensearch_view.py │ │ ├── test_pagination_tag.py │ │ ├── test_parser.py │ │ ├── test_password_change_view.py │ │ ├── test_preview_image_loader.py │ │ ├── test_queries.py │ │ ├── test_root_view.py │ │ ├── test_search_query_parser.py │ │ ├── test_settings_export_view.py │ │ ├── test_settings_general_view.py │ │ ├── test_settings_import_view.py │ │ ├── test_settings_integrations_view.py │ │ ├── test_singlefile_service.py │ │ ├── test_tag_cloud_template.py │ │ ├── test_tags_edit_view.py │ │ ├── test_tags_index_view.py │ │ ├── test_tags_merge_view.py │ │ ├── test_tags_model.py │ │ ├── test_tags_new_view.py │ │ ├── test_tags_service.py │ │ ├── test_toasts_view.py │ │ ├── test_user_profile_model.py │ │ ├── test_user_select_tag.py │ │ ├── test_utils.py │ │ └── test_website_loader.py │ ├── tests_e2e/ │ │ ├── __init__.py │ │ ├── e2e_test_a11y_navigation_focus.py │ │ ├── e2e_test_bookmark_details_modal.py │ │ ├── e2e_test_bookmark_item.py │ │ ├── e2e_test_bookmark_page_bulk_edit.py │ │ ├── e2e_test_bookmark_page_partial_updates.py │ │ ├── e2e_test_bundle_preview.py │ │ ├── e2e_test_collapse_side_panel.py │ │ ├── e2e_test_dropdown.py │ │ ├── e2e_test_edit_bookmark_form.py │ │ ├── e2e_test_filter_drawer.py │ │ ├── e2e_test_global_shortcuts.py │ │ ├── e2e_test_new_bookmark_form.py │ │ ├── e2e_test_settings_general.py │ │ ├── e2e_test_settings_integrations.py │ │ ├── e2e_test_tag_management.py │ │ └── helpers.py │ ├── type_defs.py │ ├── urls.py │ ├── utils.py │ ├── validators.py │ ├── views/ │ │ ├── __init__.py │ │ ├── access.py │ │ ├── assets.py │ │ ├── auth.py │ │ ├── bookmarks.py │ │ ├── bundles.py │ │ ├── contexts.py │ │ ├── custom_css.py │ │ ├── health.py │ │ ├── manifest.py │ │ ├── opensearch.py │ │ ├── reload.py │ │ ├── root.py │ │ ├── settings.py │ │ ├── tags.py │ │ ├── toasts.py │ │ └── turbo.py │ ├── widgets.py │ └── wsgi.py ├── bootstrap.sh ├── docker/ │ ├── alpine.Dockerfile │ └── default.Dockerfile ├── docker-compose.yml ├── docs/ │ ├── .gitignore │ ├── README.md │ ├── astro.config.mjs │ ├── package.json │ ├── src/ │ │ ├── assets/ │ │ │ ├── Add To Linkding.shortcut │ │ │ └── linkding_shortcut.json │ │ ├── components/ │ │ │ ├── Card.astro │ │ │ └── icons.ts │ │ ├── content/ │ │ │ ├── config.ts │ │ │ └── docs/ │ │ │ ├── acknowledgements.md │ │ │ ├── admin.md │ │ │ ├── api.md │ │ │ ├── archiving.md │ │ │ ├── auto-tagging.md │ │ │ ├── backups.md │ │ │ ├── browser-extension.md │ │ │ ├── community.md │ │ │ ├── how-to.md │ │ │ ├── index.mdx │ │ │ ├── installation.md │ │ │ ├── managed-hosting.md │ │ │ ├── options.md │ │ │ ├── search.md │ │ │ ├── shortcuts.md │ │ │ └── troubleshooting.md │ │ ├── env.d.ts │ │ └── styles/ │ │ └── custom.css │ └── tsconfig.json ├── install-linkding.sh ├── manage.py ├── package.json ├── postcss.config.js ├── pyproject.toml ├── pytest.ini ├── rollup.config.mjs ├── scripts/ │ ├── build-docker.sh │ ├── coverage.sh │ ├── generate-changelog.py │ ├── release.sh │ ├── run-docker.sh │ ├── run-postgres.sh │ ├── setup-ublock.sh │ ├── test-environments/ │ │ ├── authelia-oidc/ │ │ │ ├── authelia/ │ │ │ │ ├── configuration.yml │ │ │ │ └── users_database.yml │ │ │ ├── compose.yml │ │ │ ├── setup.sh │ │ │ └── traefik/ │ │ │ └── certificates.yml │ │ └── postgres/ │ │ └── compose.yml │ └── test-postgres.sh ├── supervisord-all.conf ├── supervisord-tasks.conf ├── uwsgi.ini └── version.txt