├── .github └── workflows │ ├── build-projects.yml │ ├── nightly_dockerhub.yaml │ ├── release_dockerhub.yaml │ └── test-backend.yaml ├── .gitignore ├── .idea ├── .gitignore ├── codeStyles │ ├── Project.xml │ └── codeStyleConfig.xml ├── inspectionProfiles │ ├── ESLint_only.xml │ ├── Project_Default.xml │ └── profiles_settings.xml ├── misc.xml ├── prettier.xml ├── runConfigurations │ ├── backend.xml │ ├── build_frontend.xml │ └── frontend.xml └── vcs.xml ├── .vscode ├── extensions.json ├── launch.json └── settings.json ├── CHANGELOG.md ├── CONTRIBUTING.md ├── LICENSE ├── LinkStash.code-workspace ├── README.md ├── api ├── bulkarchive.http ├── bulktag.http ├── http-client.env.json └── login.http ├── apps ├── linkstash-backend │ ├── .dockerignore │ ├── .env.example │ ├── .eslintignore │ ├── .eslintrc.js │ ├── .gitignore │ ├── .mocharc.json │ ├── .nvmrc │ ├── .prettierignore │ ├── .prettierrc │ ├── .vscode │ │ ├── extensions.json │ │ ├── launch.json │ │ ├── settings.json │ │ └── tasks.json │ ├── .yo-rc.json │ ├── DEVELOPING.md │ ├── Dockerfile │ ├── README.md │ ├── config │ │ └── .keep │ ├── docker-compose.yaml │ ├── docker-entrypoint.sh │ ├── package.json │ ├── public │ │ └── index.html │ ├── src │ │ ├── __tests__ │ │ │ ├── README.md │ │ │ ├── acceptance │ │ │ │ ├── home-page.acceptance.ts │ │ │ │ ├── ping.controller.acceptance.ts │ │ │ │ └── test-helper.ts │ │ │ ├── fixtures │ │ │ │ └── datasources │ │ │ │ │ └── testing.datasource.ts │ │ │ ├── helpers │ │ │ │ ├── database.helpers.ts │ │ │ │ └── request.helpers.ts │ │ │ └── unit │ │ │ │ └── users │ │ │ │ ├── permissions.service.unit.ts │ │ │ │ └── users.unit.ts │ │ ├── application.ts │ │ ├── bindings │ │ │ └── UserService.binding.ts │ │ ├── constants │ │ │ └── index.ts │ │ ├── controllers │ │ │ ├── README.md │ │ │ ├── archive.controller.ts │ │ │ ├── bookmark.controller.ts │ │ │ ├── bulk.controller.ts │ │ │ ├── import.controller.ts │ │ │ ├── index.ts │ │ │ ├── permissions.controller.ts │ │ │ ├── ping.controller.ts │ │ │ ├── responses.ts │ │ │ ├── user-tag.controller.ts │ │ │ └── user.controller.ts │ │ ├── datasources │ │ │ ├── README.md │ │ │ ├── bookmark.datasource.ts │ │ │ └── index.ts │ │ ├── index.ts │ │ ├── interceptors │ │ │ ├── add-count-to-result.interceptor.ts │ │ │ └── index.ts │ │ ├── migrate.ts │ │ ├── models │ │ │ ├── README.md │ │ │ ├── archive.model.ts │ │ │ ├── asset.model.ts │ │ │ ├── bookmark.model.ts │ │ │ ├── index.ts │ │ │ ├── linkstash-user.model.ts │ │ │ ├── refresh-token.model.ts │ │ │ ├── tag.model.ts │ │ │ ├── user-credentials.model.ts │ │ │ └── user-permissions.model.ts │ │ ├── openapi-spec.ts │ │ ├── repositories │ │ │ ├── README.md │ │ │ ├── archive.repository.ts │ │ │ ├── asset.repository.ts │ │ │ ├── bookmark.repository.ts │ │ │ ├── index.ts │ │ │ ├── linkstash-user.repository.ts │ │ │ ├── tag.repository.ts │ │ │ ├── user-credentials.repository.ts │ │ │ └── user-permissions.repository.ts │ │ ├── sequence.ts │ │ ├── services │ │ │ ├── archive.service.ts │ │ │ ├── index.ts │ │ │ ├── linkstash-bookmark.service.ts │ │ │ ├── netscape-bookmark-converter.service.ts │ │ │ ├── permissions.service.ts │ │ │ └── user.service.ts │ │ └── types │ │ │ ├── auth.ts │ │ │ ├── index.ts │ │ │ ├── readme.md │ │ │ ├── schemas.ts │ │ │ ├── schemas │ │ │ ├── archive.ts │ │ │ ├── bulkArchive.ts │ │ │ ├── bulkDelete.ts │ │ │ ├── bulkTag.ts │ │ │ ├── bulkTagAdd.ts │ │ │ ├── bulkTagDelete.ts │ │ │ └── credentials.ts │ │ │ └── utils.ts │ └── tsconfig.json ├── linkstash-frontend │ ├── .dockerignore │ ├── .env.example │ ├── .env.production │ ├── .eslintrc.json │ ├── .gitignore │ ├── .nvmrc │ ├── .vscode │ │ ├── extensions.json │ │ ├── launch.json │ │ └── settings.json │ ├── Dockerfile │ ├── README.md │ ├── next.config.js │ ├── package.json │ ├── postcss.config.js │ ├── public │ │ ├── .keep │ │ ├── img │ │ │ └── icon.svg │ │ ├── web-app-manifest-192x192.png │ │ └── web-app-manifest-512x512.png │ ├── src │ │ ├── app │ │ │ ├── addBookmark │ │ │ │ └── page.tsx │ │ │ ├── apple-icon.png │ │ │ ├── bookmarks │ │ │ │ ├── [id] │ │ │ │ │ └── page.tsx │ │ │ │ └── page.tsx │ │ │ ├── context │ │ │ │ └── application.ts │ │ │ ├── favicon.ico │ │ │ ├── fetchUrlMetadata │ │ │ │ └── route.ts │ │ │ ├── globals.css │ │ │ ├── icon.png │ │ │ ├── icon.svg │ │ │ ├── import │ │ │ │ └── page.tsx │ │ │ ├── layout.tsx │ │ │ ├── login │ │ │ │ └── page.tsx │ │ │ ├── logout │ │ │ │ └── page.tsx │ │ │ ├── manifest.json │ │ │ ├── not-found.tsx │ │ │ ├── settings │ │ │ │ └── page.tsx │ │ │ ├── showArchive │ │ │ │ └── [id] │ │ │ │ │ └── page.tsx │ │ │ ├── styletest │ │ │ │ └── page.tsx │ │ │ └── users │ │ │ │ └── page.tsx │ │ ├── components │ │ │ ├── AuthenticatedSection │ │ │ │ └── AuthenticatedSection.tsx │ │ │ ├── BookmarkCard │ │ │ │ ├── BookmarkCard.tsx │ │ │ │ ├── BookmarkCardContext.ts │ │ │ │ ├── styles.module.css │ │ │ │ └── subcomponents │ │ │ │ │ ├── BookmarkCardBottomBar.tsx │ │ │ │ │ ├── BookmarkCardDescriptions.tsx │ │ │ │ │ ├── BookmarkCardTagGroup.tsx │ │ │ │ │ └── BookmarkCardTitle.tsx │ │ │ ├── BookmarkForm │ │ │ │ ├── BookmarkForm.tsx │ │ │ │ └── styles.module.css │ │ │ ├── BookmarksPage │ │ │ │ ├── BookmarksPage.tsx │ │ │ │ ├── styles.module.css │ │ │ │ └── subcomponents │ │ │ │ │ └── BookmarksPageMultiSelectProvider │ │ │ │ │ └── BookmarksPageMultiSelectProvider.tsx │ │ │ ├── BookmarksToolbar │ │ │ │ └── BookmarskToolbar.tsx │ │ │ ├── BulkToolbar │ │ │ │ └── BulkToolbar.tsx │ │ │ ├── ConfirmActionButton │ │ │ │ └── ConfirmActionButton.tsx │ │ │ ├── Default │ │ │ │ ├── ComboBox │ │ │ │ │ └── ComboBox.tsx │ │ │ │ ├── Dialog │ │ │ │ │ └── LinkstashDialog.tsx │ │ │ │ ├── InputComponent │ │ │ │ │ ├── InputComponent.module.css │ │ │ │ │ ├── InputComponent.tsx │ │ │ │ │ └── types.ts │ │ │ │ ├── TagGroup │ │ │ │ │ └── TagGroup.tsx │ │ │ │ ├── TagInput │ │ │ │ │ ├── TagInput.tsx │ │ │ │ │ ├── TagInputContext.ts │ │ │ │ │ └── subcomponents │ │ │ │ │ │ ├── TagInputAutoCompleteTextbox.tsx │ │ │ │ │ │ ├── TagInputAutocompleteContext.tsx │ │ │ │ │ │ ├── TagInputAutocompleteDropDown.tsx │ │ │ │ │ │ └── TagInputSelectedTags.tsx │ │ │ │ ├── ToastNotification │ │ │ │ │ ├── ToastNotification.module.css │ │ │ │ │ └── ToastNotification.tsx │ │ │ │ └── index.tsx │ │ │ ├── Header │ │ │ │ ├── Header.module.css │ │ │ │ └── Header.tsx │ │ │ ├── Loader │ │ │ │ ├── Loader.module.css │ │ │ │ └── Loader.tsx │ │ │ ├── LoadingSpinner │ │ │ │ └── LoadingSpinner.tsx │ │ │ ├── LoginForm │ │ │ │ ├── LoginForm.module.css │ │ │ │ └── LoginForm.tsx │ │ │ ├── Pager │ │ │ │ └── Pager.tsx │ │ │ ├── Providers │ │ │ │ ├── ApplicationProvider │ │ │ │ │ └── ApplicationProvider.tsx │ │ │ │ ├── AuthenticationProvider │ │ │ │ │ └── AuthenticationProvider.tsx │ │ │ │ ├── Providers.tsx │ │ │ │ ├── QueryStateProvider │ │ │ │ │ └── QueryStateProvider.tsx │ │ │ │ └── ToastProvider.tsx │ │ │ ├── RerenderCheckDiv │ │ │ │ └── RerenderCheckDiv.tsx │ │ │ ├── TagCloud │ │ │ │ └── TagCloud.tsx │ │ │ ├── UserNavigationBar │ │ │ │ └── UserNavigationBar.tsx │ │ │ ├── UserTableRow │ │ │ │ └── UserTableRow.tsx │ │ │ └── index.tsx │ │ ├── global_styles │ │ │ └── react-aria_combobox.css │ │ ├── hooks │ │ │ ├── index.ts │ │ │ ├── useAuthentication.ts │ │ │ ├── useBookmarks.ts │ │ │ ├── useBookmarksPageMultiSelection.ts │ │ │ ├── useTags.ts │ │ │ └── useUsers.ts │ │ ├── scripts │ │ │ ├── api.ts │ │ │ ├── constants.ts │ │ │ ├── css.ts │ │ │ ├── dev_mode.ts │ │ │ ├── env.ts │ │ │ ├── forms.ts │ │ │ ├── index.ts │ │ │ ├── search_params.ts │ │ │ └── server_scripts.ts │ │ └── types │ │ │ ├── api.ts │ │ │ ├── authentication.ts │ │ │ ├── backend.ts │ │ │ ├── components.ts │ │ │ ├── index.ts │ │ │ └── props.ts │ ├── tailwind.config.ts │ ├── test.json │ └── tsconfig.json └── linkstash-website │ ├── .gitignore │ ├── .nvmrc │ ├── README.md │ ├── components.json │ ├── docs │ ├── api-reference │ │ └── README.md │ ├── changelog.mdx │ ├── news.md │ └── user-guide │ │ ├── README.md │ │ ├── adding_bookmarks.md │ │ ├── archiving.md │ │ ├── bulk.md │ │ ├── experimental │ │ ├── README.md │ │ └── sqlite.md │ │ ├── faq.md │ │ ├── filtering.md │ │ ├── from-code.md │ │ ├── getting_help.md │ │ ├── install.md │ │ ├── manage_bookmark.md │ │ ├── security.md │ │ └── settings.md │ ├── docusaurus.config.ts │ ├── output.css │ ├── package-lock.json │ ├── package.json │ ├── postcss.config.mjs │ ├── sidebars.ts │ ├── src │ ├── components │ │ ├── Changelog │ │ │ ├── Changelog.tsx │ │ │ ├── data.ts │ │ │ └── output.css │ │ ├── HomepageFeatures │ │ │ ├── index.tsx │ │ │ └── styles.module.css │ │ └── shadcn │ │ │ ├── badge.tsx │ │ │ ├── button.tsx │ │ │ ├── card.tsx │ │ │ ├── scroll-area.tsx │ │ │ └── select.tsx │ ├── css │ │ ├── custom.css │ │ └── tailwind.css │ ├── lib │ │ └── utils.ts │ └── pages │ │ ├── index.module.css │ │ ├── index.tsx │ │ ├── markdown-page.md │ │ └── page2.tsx │ ├── static │ ├── .nojekyll │ ├── favicons │ │ ├── apple-touch-icon.png │ │ ├── favicon-96x96.png │ │ ├── favicon.ico │ │ ├── favicon.svg │ │ ├── site.webmanifest │ │ ├── web-app-manifest-192x192.png │ │ └── web-app-manifest-512x512.png │ └── img │ │ ├── docusaurus-logo.svg │ │ ├── docusaurus-social-card.jpg │ │ ├── docusaurus.png │ │ ├── favicon.ico │ │ ├── icons │ │ ├── archive-in-solid-24.png │ │ ├── edit-alt-solid-24.png │ │ ├── read.svg │ │ ├── trash-solid-24.png │ │ └── user-gear-solid.svg │ │ ├── logo.svg │ │ ├── screencast │ │ ├── addbookmarklet.gif │ │ ├── addbookmarks.gif │ │ ├── createarchive.gif │ │ ├── deletearchive.gif │ │ ├── deleting.gif │ │ ├── editing.gif │ │ ├── importing.gif │ │ ├── login.gif │ │ ├── usebookmarklet.gif │ │ └── viewarchive.gif │ │ ├── screenshot.png │ │ ├── screenshots │ │ └── openapi-explorer.png │ │ ├── undraw_docusaurus_mountain.svg │ │ ├── undraw_docusaurus_react.svg │ │ └── undraw_docusaurus_tree.svg │ ├── tsconfig.json │ ├── versioned_docs │ ├── version-0.1a │ │ ├── README.md │ │ ├── api-reference │ │ │ └── README.md │ │ ├── docsaurus-docs │ │ │ ├── intro.md │ │ │ ├── tutorial-basics │ │ │ │ ├── _category_.json │ │ │ │ ├── congratulations.md │ │ │ │ ├── create-a-blog-post.md │ │ │ │ ├── create-a-document.md │ │ │ │ ├── create-a-page.md │ │ │ │ ├── deploy-your-site.md │ │ │ │ └── markdown-features.mdx │ │ │ └── tutorial-extras │ │ │ │ ├── _category_.json │ │ │ │ ├── img │ │ │ │ ├── docsVersionDropdown.png │ │ │ │ └── localeDropdown.png │ │ │ │ ├── manage-docs-versions.md │ │ │ │ └── translate-your-site.md │ │ └── user-guide │ │ │ ├── README.md │ │ │ ├── adding_bookmarks.md │ │ │ ├── archiving.md │ │ │ ├── faq.md │ │ │ ├── filtering.md │ │ │ ├── from-code.md │ │ │ ├── getting_help.md │ │ │ ├── install.md │ │ │ ├── manage_bookmark.md │ │ │ ├── security.md │ │ │ └── settings.md │ ├── version-1.0.0 │ │ ├── api-reference │ │ │ └── README.md │ │ ├── changelog.mdx │ │ ├── linkstash.md │ │ └── user-guide │ │ │ ├── README.md │ │ │ ├── adding_bookmarks.md │ │ │ ├── archiving.md │ │ │ ├── faq.md │ │ │ ├── filtering.md │ │ │ ├── from-code.md │ │ │ ├── getting_help.md │ │ │ ├── install.md │ │ │ ├── manage_bookmark.md │ │ │ ├── security.md │ │ │ └── settings.md │ └── version-1.1.0 │ │ ├── api-reference │ │ └── README.md │ │ ├── changelog.mdx │ │ ├── news.md │ │ └── user-guide │ │ ├── README.md │ │ ├── adding_bookmarks.md │ │ ├── archiving.md │ │ ├── bulk.md │ │ ├── experimental │ │ ├── README.md │ │ └── sqlite.md │ │ ├── faq.md │ │ ├── filtering.md │ │ ├── from-code.md │ │ ├── getting_help.md │ │ ├── install.md │ │ ├── manage_bookmark.md │ │ ├── security.md │ │ └── settings.md │ ├── versioned_sidebars │ ├── version-0.1a-sidebars.json │ ├── version-1.0.0-sidebars.json │ └── version-1.1.0-sidebars.json │ └── versions.json ├── commitlint.config.js ├── docker ├── .env.example ├── docker-compose-db-only.yaml └── docker-compose.yaml ├── docs ├── CSS Style guide.md ├── README.md ├── build docker.md ├── codingstyle.md ├── exposing to internet.md ├── faqs.md ├── get git history.md ├── logging.md └── release.md ├── img ├── V1.0 │ ├── screenshot.png │ ├── screenshot1.png │ ├── screenshot2.png │ └── screenshot3.png ├── screenshot.png ├── screenshot1.png ├── screenshot2.png └── screenshot3.png ├── package-lock.json ├── package.json ├── packages └── linkstash-client-sdk │ ├── eslint.config.mjs │ ├── package.json │ ├── src │ └── index.ts │ ├── test │ └── index.test.ts │ ├── tsconfig.json │ └── vitest.config.ts ├── releases ├── 1.0.0.md ├── 1.1.0.md └── 1.1.1.md ├── resources └── favicons │ ├── logo-trans.svg │ ├── logo.svg │ └── packages │ ├── favicon-for-app.zip │ ├── favicon-for-public.zip │ └── favicon.zip └── turbo.json /.github/workflows/test-backend.yaml: -------------------------------------------------------------------------------- 1 | name: Test backend 2 | run-name: ${{ github.actor }} triggered test 3 | on: 4 | workflow_dispatch 5 | jobs: 6 | test_backend: 7 | runs-on: ubuntu-latest 8 | defaults: 9 | run: 10 | working-directory: ./linkstash-backend 11 | # strategy: 12 | # matrix: 13 | # node-version: [18.x, 20.x, 22.x] 14 | # # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ 15 | steps: 16 | - uses: actions/checkout@v4 17 | - name: Use Node.js 18 | uses: actions/setup-node@v4 19 | with: 20 | cache: 'npm' 21 | node-version-file : '.apps/linkstash-backend/.nvmrc' 22 | - run: npm ci 23 | - run: npm test 24 | 25 | -------------------------------------------------------------------------------- /.idea/.gitignore: -------------------------------------------------------------------------------- 1 | # Default ignored files 2 | /shelf/ 3 | /workspace.xml 4 | # Editor-based HTTP Client requests 5 | /httpRequests/ 6 | # Datasource local storage ignored files 7 | /dataSources/ 8 | /dataSources.local.xml 9 | -------------------------------------------------------------------------------- /.idea/codeStyles/codeStyleConfig.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | -------------------------------------------------------------------------------- /.idea/inspectionProfiles/Project_Default.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | -------------------------------------------------------------------------------- /.idea/inspectionProfiles/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | -------------------------------------------------------------------------------- /.idea/prettier.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | -------------------------------------------------------------------------------- /.idea/runConfigurations/backend.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /.idea/runConfigurations/build_frontend.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 |