Giter Club home page Giter Club logo

grimoire's Introduction

Grimoire Logo

Grimoire

Bookmark manager for the wizards πŸ§™

GitHub License GitHub Actions Workflow Status GitHub Release Docker Pulls

Glimpse into the magical book of your forbidden knowledge - Grimoire! πŸ“–πŸ’«

Unleash your inner sorcerer and conquer the chaos of bookmarks! With Grimoire, you'll have a bewitching way to store and sort your enchanted links.

But wait, there's more!

Transmute your saved pages into juicy content snippets with our mystical extraction feature. Embrace the magic, tame the clutter, and let Grimoire be your mystical companion in the vast library of the web.

It's time to conjure up some organization! πŸ“šβœ¨

Features

  • add and organize bookmarks easily πŸ”–
  • create new user accounts, each with their own bookmarks, categories and tags πŸ™‹
  • fuzzy search through bookmarks πŸ”
  • supports tags and categories 🏷️
  • fetch metadata from websites, store it locally and update it when needed 🌐
  • add your personal notes to bookmarks πŸ“
  • integration API to add bookmarks from other sources 🧰
  • embrace the night with a dark mode πŸŒ™
  • and stay productive using our official browser extension, grimoire companion (available here) πŸͺ„

Screenshots

Light Mode Dark Mode
Only unread Show only unread Adding new bookmark Adding new bookmark
User Profile view User Profile view Bookmark details Bookmark details

More screenshots can be found in the screenshots directory.

Installation

Run using Docker Compose (recommended)

Prerequisites

Steps

# Clone the repository
git clone https://github.com/goniszewski/grimoire

# Rename the `.env.example` file to `.env`
# "mv .env.example .env" on Linux/MacOS, "ren .env.example .env" on Windows

# [RECOMMENDED] Update the `.env` to set the initial admin user credentials
# (admins are separate from regular users)

# Build and run the containers
docker compose up

Note

For the recommended setup, only the docker-compose.yml, .env.example files and the pb_migrations/ directory (containing the migration files) are needed.

Run app using Node + Pocketbase using Docker Compose

Prerequisites

Steps

# Clone the repository
git clone https://github.com/goniszewski/grimoire

# Rename the `.env.example` file to `.env`
# "mv .env.example .env" on Linux/MacOS, "ren .env.example .env" on Windows

# [RECOMMENDED] Update the `.env` to set the initial admin user credentials
# (admins are separate from regular users)

# Install the dependencies
pnpm i

# Run the Pocketbase container using Docker Compose and start the app
chmod +x ./run-dev.sh && ./run-dev.sh
Run app using Node + standalone Pocketbase

Prerequisites

Steps

# Clone the repository
git clone https://github.com/goniszewski/grimoire

# Rename the `.env.example` file to `.env`
# "mv .env.example .env" on Linux/MacOS, "ren .env.example .env" on Windows

# [RECOMMENDED] Update the `.env` to set the initial admin user credentials
# (admins are separate from regular users)

# Move the pocketbase executable to the project root directory and run it
./pocketbase serve

# Install the dependencies
pnpm i

# Build and start the app
pnpm build && node -r dotenv/config build

# To start the app again, just run `node -r dotenv/config build`

Tip

Although the above setups are intended for development, they are also suitable for daily use. For a better experience, it is recommended to use a Node.js process manager, such as PM2.

Development

Check out the development guide to learn how to set up the project for development.

Roadmap

  • Initial relase (0.1.0) πŸš€
  • Official Docker image 🐳
  • Add Integration API 🧰
  • Official browser extension (repository) πŸͺ„
  • Bookmark import and export features πŸ’Ό
  • AI features, like generated descriptions and tags suggestions πŸ€–
  • Public User profiles & bookmark sharing 🌍
  • Flows - a way to keep bookmarks in a session-like order with related notes (e.g. for learning, research, etc.) ✨
  • ...and more to come! πŸ§™

We're open to suggestions and feature requests! If you have an idea for a feature, please open an issue or start a discussion.

Contributing

If you want to contribute to the project, please read the contributing guide.

License

This project is licensed under the MIT License.

Credits

Special thanks to: @extractus/article-extractor, DaisyUI, Fuse.js, MetaScraper, PocketBase, sanitize-html, SvelteKit, Svelte Select, Svelte French Toast, Tailwind CSS

grimoire's People

Contributors

babariviere avatar dependabot[bot] avatar geezus42 avatar goniszewski avatar jonrick avatar peterdavehello avatar whereistejas avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar

grimoire's Issues

Can't build the application

Hi,
i'm trying to build the docker-compose but i t fail in the JS stacktrace, if i understand correctly.

This is the list of messages:

Building grimoire
[+] Building 285.0s (13/15) docker:default
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 1.04kB 0.0s
=> [internal] load metadata for docker.io/library/node:20-slim 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 273B 0.0s
=> [base 1/5] FROM docker.io/library/node:20-slim 0.0s
=> [internal] load build context 0.1s
=> => transferring context: 10.52kB 0.1s
=> CACHED [base 2/5] RUN corepack enable 0.0s
=> CACHED [base 3/5] RUN apt-get update && apt-get install -y python3 python3-pip 0.0s
=> CACHED [base 4/5] COPY . /app 0.0s
=> CACHED [base 5/5] WORKDIR /app 0.0s
=> CACHED [build 1/2] RUN --mount=type=cache,id=pnpm,target=/pnpm/store pnpm install --frozen-lockfile 0.0s
=> CACHED [prod-deps 1/1] RUN --mount=type=cache,id=pnpm,target=/pnpm/store pnpm install --prod --frozen-loc 0.0s
=> CACHED [stage-3 1/3] COPY --from=prod-deps /app/node_modules /app/node_modules 0.0s
=> ERROR [build 2/2] RUN pnpm run build 284.7s


[build 2/2] RUN pnpm run build:
2.117
2.117 > [email protected] build /app
2.117 > vite build
2.117
5.613
5.615 vite v4.5.1 building SSR bundle for production...
5.694 transforming...
9.906
9.906 warn - As of Tailwind CSS v3.3, the @tailwindcss/line-clamp plugin is now included by default.
9.906 warn - Remove it from the plugins array in your configuration to eliminate this warning.
10.85
10.85 ╭── 🌼 daisyUI 3.9.4 https://daisyui.com
11.18 β”‚
11.18 β”œβ”€β”€ 2 themes are enabled. How to add more themes:
11.18 β”‚ https://daisyui.com/docs/themes
11.18 β”‚
11.18 ╰── πŸ’š Support daisyUI project: https://opencollective.com/daisyui
11.18
11.77
11.77 ╭── 🌼 daisyUI 3.9.4 https://daisyui.com
12.04 β”‚
12.04 β”œβ”€β”€ 2 themes are enabled. How to add more themes:
12.04 β”‚ https://daisyui.com/docs/themes
12.04 β”‚
12.04 ╰── ⭐ Star daisyUI project on GitHub: https://github.com/saadeghi/daisyui
12.04
64.97 src/routes/+page.svelte (189:13) "PUBLIC_SIGNUP_DISABLED" is not exported by "virtual:$env/static/public", imported by "src/routes/+page.svelte".
66.19 "BaseAuthStore" is imported from external module "pocketbase" but never used in "src/lib/pb.ts".
66.20 βœ“ 5036 modules transformed.
66.63 rendering chunks...
72.59 vite v4.5.1 building for production...
72.59
72.61 transforming...
283.8
283.8 <--- Last few GCs --->
283.8
283.8 [19:0x560ebd0] 276977 ms: Mark-Compact 1836.5 (1906.5) -> 1821.3 (1908.3) MB, 1863.04 / 0.21 ms (average mu = 0.207, current mu = 0.212) allocation failure; scavenge might not succeed
283.8 [19:0x560ebd0] 279277 ms: Mark-Compact 1838.0 (1908.3) -> 1822.5 (1909.8) MB, 1995.94 / 0.06 ms (average mu = 0.171, current mu = 0.132) allocation failure; scavenge might not succeed
283.8
283.8
283.8 <--- JS stacktrace --->
283.8
283.8 FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory
283.8 ----- Native stack trace -----
283.8
283.8 1: 0xca5430 node::Abort() [node]
283.8 2: 0xb7807d [node]
283.8 3: 0xeca0b0 v8::Utils::ReportOOMFailure(v8::internal::Isolate*, char const*, v8::OOMDetails const&) [node]
283.8 4: 0xeca397 v8::internal::V8::FatalProcessOutOfMemory(v8::internal::Isolate*, char const*, v8::OOMDetails const&) [node]
283.8 5: 0x10dc0e5 [node]
283.8 6: 0x10dc674 v8::internal::Heap::RecomputeLimits(v8::internal::GarbageCollector) [node]
283.8 7: 0x10f3564 v8::internal::Heap::PerformGarbageCollection(v8::internal::GarbageCollector, v8::internal::GarbageCollectionReason, char const*) [node]
283.8 8: 0x10f3d7c v8::internal::Heap::CollectGarbage(v8::internal::AllocationSpace, v8::internal::GarbageCollectionReason, v8::GCCallbackFlags) [node]
283.8 9: 0x114cb3c v8::internal::MinorGCJob::Task::RunInternal() [node]
283.9 10: 0xd201a6 [node]
283.9 11: 0xd22d5f node::PerIsolatePlatformData::FlushForegroundTasksInternal() [node]
283.9 12: 0x188aa33 [node]
283.9 13: 0x189f41b [node]
283.9 14: 0x188b757 uv_run [node]
283.9 15: 0xbbbb83 node::SpinEventLoopInternal(node::Environment*) [node]
283.9 16: 0xcf4d25 [node]
283.9 17: 0xcf56ed node::NodeMainInstance::Run() [node]
283.9 18: 0xc5f367 node::Start(int, char**) [node]
283.9 19: 0x7f751e2171ca [/lib/x86_64-linux-gnu/libc.so.6]
283.9 20: 0x7f751e217285 __libc_start_main [/lib/x86_64-linux-gnu/libc.so.6]
283.9 21: 0xbb8d7e _start [node]
284.5 Aborted (core dumped)
284.5  ELIFECYCLE  Command failed with exit code 134.

Dockerfile:14

12 | FROM base AS build
13 | RUN --mount=type=cache,id=pnpm,target=/pnpm/store pnpm install --frozen-lockfile
14 | >>> RUN pnpm run build
15 |
16 | FROM base

ERROR: failed to solve: process "/bin/sh -c pnpm run build" did not complete successfully: exit code: 1
ERROR: Service 'grimoire' failed to build : Build failed

Are a minimal requirements to install?
I have 4GB of memory in the system but i use less than 1GB.
I hope that someone can help me.

  • OS: Ubuntu 22.04.3 LTS x86_64
  • Browser Firefox
  • Version 121.0

Docker image without needing source

In order to simplify installation, it would be great to be able to use the docker image without needing to clone the repository. Ideally, the image would also include and apply all the pocketbase migrations at startup, so that those files aren't required either.

Subcategories of subcategories do not show in left column

Describe the bug
I have a bookmark that is at this level of categories: Self-Hosted > Photos > Immich. The Immich subcategory does not show in the left column.

To Reproduce
Steps to reproduce the behavior:

  1. Create bookmark at category level: Self-Hosted > Photos > Immich
  2. See that Immich is not listed under Photos

Expected behavior
Immich should be listed under Photos.

Screenshots
Screen Shot 2024-03-30 at 11 20 37 AM

Desktop (please complete the following information):

  • OS: [Mac Monterey 12.7.4]
  • Browser [Opera]
  • Version [108.0.5067.29]

Additional context
Running latest version (v0.2.6) on Docker Desktop for Mac 4.28.0.

After first install login not possible with initial user "Incorrect credentials"

Describe the bug
docker-compose up "install" produces non working instance, no idea how to login when all i get is Incorrect credentials.

% grep -v '^#' .env
PUBLIC_POCKETBASE_URL=
[email protected]
ROOT_ADMIN_PASSWORD=test123
ORIGIN=http://localhost:5173
PUBLIC_HTTPS_ONLY=
PORT=5173
PUBLIC_SIGNUP_DISABLED=false
% docker compose up
[+] Running 2/2
 βœ” Container grimoire-pocketbase  Recreated                                                                                                0.1s
 βœ” Container grimoire             Recreated                                                                                                0.1s
Attaching to grimoire, grimoire-pocketbase
grimoire-pocketbase  | 2024/01/06 03:26:54 Server started at http://0.0.0.0:80
grimoire-pocketbase  | β”œβ”€ REST API: http://0.0.0.0:80/api/
grimoire-pocketbase  | └─ Admin UI: http://0.0.0.0:80/_/
grimoire             | Listening on 0.0.0.0:5173
grimoire             | { invalid: true }
grimoire             | { invalid: true }

To Reproduce
Steps to reproduce the behavior:

  1. git clone https://github.com/goniszewski/grimoire
  2. edit .env
  3. docker compose up
  4. go to http://localhost:5173/login, try to login -> invalid credentials with the pw defined from .env

Expected behavior
be able to login with the email/pw defined in .env

Screenshots
image

Desktop (please complete the following information):

  • OS: debian sid
  • Browser chrome
  • Version 120.0.6099.129 (Official Build) (64-bit)

Update search mechanism for bookmarks

Is your feature request related to a problem? Please describe.
At this very moment, bookmark search is based on items from $page.data.bookmarks (code) which can be pretty sparse thanks to page and limit parameters (code).

This is unacceptable and should be handled properly for the whole bookmark collection. Keep in mind that PocketBase doesn't support fuzzy search yet, and Fuse.js we're using is local only, so all the bookmarks should be loaded on the client/server. It can cause a significant load when dealing with large collections.

Describe the solution you'd like
I want to make the search work with all users' bookmarks. Moreover, to be efficient enough to not cause any issues with bigger bookmark counts.

Describe alternatives you've considered
We can always try to connect to the DB itself. But if there's any way to deal with this problem without bypassing PB, it would be the preferred one.

Additional context
Not atm.

Browser Addon and SSO

Great Project.

If you are creating a browser-addon, please keep in mind that people (like me) are using it for sites that are protected by basic auth/sso (like authentik)

Social bookmarking on the Fediverse

Cool project, found via HN. Since you are already having account management, Social bookmarking seems like a small step away. Recently Postmarks was launched with Fediverse support, and very well received. You may consider adding ActivityPub support and be interoperable with Postmarks and other apps on the Fediverse (like Mastodon and Lemmy). It that doesn't interest you, feel free to close the issue.. I'm just providing a showerthought idea.. πŸ€—

ClientResponseError 400: Failed to authenticate.

Describe the bug
Can't log in.

To Reproduce
Steps to reproduce the behavior:

  1. I cloned the repo
  2. ran docker-compose --env-file .env.docker up

Expected behavior
I could log in using the credentials in .env.docker

Screenshots
Additional context

Attaching to grimoire-pocketbase, grimoire
grimoire-pocketbase | 2023/11/29 20:52:18 Server started at http://0.0.0.0:80
grimoire-pocketbase | β”œβ”€ REST API: http://0.0.0.0:80/api/
grimoire-pocketbase | └─ Admin UI: http://0.0.0.0:80/_/
grimoire      | Listening on 0.0.0.0:5173
grimoire      | ClientResponseError 400: Failed to authenticate.
grimoire      |     at file:///app/node_modules/.pnpm/[email protected]/node_modules/pocketbase/dist/pocketbase.es.mjs:1:31144
grimoire      |     at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
grimoire      |     at async default (file:///app/build/server/chunks/7-cc1cc215.js:9:20)
grimoire      |     at async handle_action_request (file:///app/build/server/index.js:1072:18)
grimoire      |     at async render_page (file:///app/build/server/index.js:2508:23)
grimoire      |     at async resolve (file:///app/build/server/index.js:3524:24)
grimoire      |     at async Object.handle (file:///app/build/server/chunks/hooks.server-13110f1a.js:31:20)
grimoire      |     at async respond (file:///app/build/server/index.js:3410:22)
grimoire      |     at async Array.ssr (file:///app/build/handler.js:1221:3) {
grimoire      |   url: 'http://pocketbase/api/collections/users/auth-with-password',
grimoire      |   status: 400,
grimoire      |   response: { code: 400, message: 'Failed to authenticate.', data: {} },
grimoire      |   isAbort: false,
grimoire      |   originalError: {
grimoire      |     url: 'http://pocketbase/api/collections/users/auth-with-password',
grimoire      |     status: 400,
grimoire      |     data: { code: 400, message: 'Failed to authenticate.', data: {} }
grimoire      |   }
grimoire      | }
grimoire      | ClientResponseError 404: The requested resource wasn't found.
grimoire      |     at file:///app/node_modules/.pnpm/[email protected]/node_modules/pocketbase/dist/pocketbase.es.mjs:1:31144
grimoire      |     at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
grimoire      |     at async default (file:///app/build/server/chunks/12-e50058f8.js:14:7)
grimoire      |     at async handle_action_json_request (file:///app/build/server/index.js:997:18)
grimoire      |     at async resolve (file:///app/build/server/index.js:3524:24)
grimoire      |     at async Object.handle (file:///app/build/server/chunks/hooks.server-13110f1a.js:31:20)
grimoire      |     at async respond (file:///app/build/server/index.js:3410:22)
grimoire      |     at async Array.ssr (file:///app/build/handler.js:1221:3) {
grimoire      |   url: 'http://pocketbase/api/collections/categories/records',
grimoire      |   status: 404,
grimoire      |   response: {
grimoire      |     code: 404,
grimoire      |     message: "The requested resource wasn't found.",
grimoire      |     data: {}
grimoire      |   },
grimoire      |   isAbort: false,

BACKEND_URL & POCKETBASE_URL

in: src/lib/config.ts

shouldn't those two get their values from two different environment-variables to define the front & backend ?

best regards

ClientResponseError 0: The request was autocancelled.

Describe the bug
Docker compose starts up just fine, however as soon as you hit the web URL, I get a 500 Internal Error

To Reproduce

  1. git clone https://github.com/goniszewski/grimoire
  2. docker-compose up

Expected behavior
The containers should start, and I should be able to hit the URL and view the application

Screenshots
Error:

 docker-compose logs | more
/usr/lib/python3.12/site-packages/requests/__init__.py:109: RequestsDependencyWarning: urllib3 (2.0.7) or chardet (5.2.0)/charset_normalizer (3.2.0) doesn't match a supported version!
  warnings.warn(
Attaching to grimoire, grimoire-pocketbase
grimoire      | Listening on 0.0.0.0:5173
grimoire      | ClientResponseError 0: The request was autocancelled. You can find more info in https://github.com/pocketbase/js-sdk#auto-cancellation.
grimoire      |     at file:///app/node_modules/.pnpm/[email protected]/node_modules/pocketbase/dist/pocketbase.es.mjs:1:31144
grimoire      |     at async load (file:///app/build/server/chunks/0-546e495e.js:32:24)
grimoire      |     at async load_server_data (file:///app/build/server/index.js:1186:18)
grimoire      |     at async file:///app/build/server/index.js:2557:18 {
grimoire      |   url: '',
grimoire      |   status: 0,
grimoire      |   response: {},
grimoire      |   isAbort: true,
grimoire      |   originalError: DOMException [AbortError]: This operation was aborted
grimoire      |       at fetch (file:///app/build/shims.js:20346:13)
grimoire      |       at async load (file:///app/build/server/chunks/0-546e495e.js:32:24)
grimoire      |       at async load_server_data (file:///app/build/server/index.js:1186:18)
grimoire      |       at async file:///app/build/server/index.js:2557:18
grimoire      | }

image

Desktop (please complete the following information):

  • OS: Fedora Linux 39
  • Browser: Vivaldi
  • Version: 6.5.3206.55 (Stable channel) (64-bit)

Be able to search by text in the Content field

Describe the solution you'd like
With Grimoire being the only bookmark manager I know that does browser-side metadata delivery, it seems like the next move is to allow us to actually search through that metadata in the bookmark manager.

Right now, any information in the "Content" saved in a bookmark appears to not really be utilized, unless you use AI. I am storing corporate web pages for my own reference, hosted locally, and cannot utilize AI for tagging/summarization/etc.

Can the search feature include searching the content fields for bookmarks?

Feature ideas

Feature parity to Shaarli:

  • See also #8
  • Install as PWA (progressive webapp) on Android
  • Share into Grimoire on Android and/or an Android app like Shaarlier
  • Parameterized share link that can be used for bookmarklets or custom scripts (eg. ?url=...&title=...&note=...&...)
  • If a link has already been shared, load the existing data as edit
  • Local storage entry edit backup (in case the browser crashes, the submit fails, etc, the possibility to go back to the edit form with the last unsaved state, very useful for notes) (similar)
  • Search in tags with multiple match (eg. "android app opensource" meaning a match for 3 tags) or in the whole entry

I added checkboxes in case something is already supported

Add Bookmark and Edit buttons not working

Describe the bug
The "add bookmark" and "edit" buttons are not working. The first when you click the component to insert the url appears, but the "ADD" button never be enabled. Clicking on edit button do nothing. The delete button and the chrome extension are working fine.

To Reproduce
Steps to reproduce the behavior:

  1. Go to 'http://0.0.0.0:5173/'
  2. Click on 'add bookmark'
  3. Paste the URL on the pop up
  4. Add button not enabled

Expected behavior
Open another box with the details related to the link that I paste.

Desktop (please complete the following information):

  • OS: Armbian 24.5.0-trunk.417 jammy" based on Ubuntu 22.04.4
  • Browser: Brave
  • Version 1.64.122

Additional context
I use the docker version from source code and updated the code today.
I saw this errors on the developer tools when the page loads. Don't know if this is relevant
image

Website favicon

First, I recently found this project and I'm excited to try this out as a self-hosted bookmark alternative to Raindrop! It's super minor, but I thought I would point out that the grimoire website favicon is the default Docusaurus icon, and I'm sure the intention is to have the grimoire icon there. But I really I just wanted to take advantage of this to let you know that I appreciate the hard work you're putting into the project that you're graciously allowing others to use!

Standalone Traefik reverse proxy & 405 Method Not Allowed

Describe the bug
After setting up the container I am unable to login through the admin portal with my defined credentials and I can't set up a new user.

grimoire-pocketbase | 2024/03/14 21:27:14 Server started at http://0.0.0.0:80
grimoire-pocketbase | β”œβ”€ REST API: http://0.0.0.0:80/api/
grimoire-pocketbase | └─ Admin UI: http://0.0.0.0:80/_/
grimoire      | Configuration used {
grimoire      |   BACKEND_URL: 'https://grimoire.local.mydomain.co.uk/pb',
grimoire      |   POCKETBASE_URL: 'https://grimoire.local.mydomain.co.uk/pb',
grimoire      |   HTTPS_ONLY: false,
grimoire      |   SIGNUP_DISABLED: false
grimoire      | }
grimoire      | Listening on 0.0.0.0:5173
grimoire      | ClientResponseError 405: Method Not Allowed.
grimoire      |     at file:///app/node_modules/.pnpm/[email protected]/node_modules/pocketbase/dist/pocketbase.es.mjs:1:31966
grimoire      |     at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
grimoire      |     at async AdminService.authWithPassword (file:///app/node_modules/.pnpm/[email protected]/node_modules/pocketbase/dist/pocketbase.es.mjs:1:10785)
grimoire      |     at async default (file:///app/build/server/chunks/5-QHe1JzzZ.js:9:7)
grimoire      |     at async handle_action_request (file:///app/build/server/index.js:966:18)
grimoire      |     at async render_page (file:///app/build/server/index.js:2525:23)
grimoire      |     at async resolve2 (file:///app/build/server/index.js:3637:24)
grimoire      |     at async Object.handle (file:///app/build/server/chunks/hooks.server-MgKWq-jv.js:33:20)
grimoire      |     at async respond (file:///app/build/server/index.js:3528:22)
grimoire      |     at async Array.ssr (file:///app/build/handler.js:1243:3) {
grimoire      |   url: 'https://grimoire.local.mydomain.co.uk/pb/api/admins/auth-with-password',
grimoire      |   status: 405,
grimoire      |   response: { code: 405, message: 'Method Not Allowed.', data: {} },
grimoire      |   isAbort: false,
grimoire      |   originalError: {
grimoire      |     url: 'https://grimoire.local.mydomain.co.uk/pb/api/admins/auth-with-password',
grimoire      |     status: 405,
grimoire      |     data: { code: 405, message: 'Method Not Allowed.', data: {} }
grimoire      |   }
grimoire      | }

I am unsure whether my Traefik setup may be to blame:
I have tried using the labels defined in the docs

    network_mode: bridge
    labels:
      - traefik.http.routers.grimoire-pocketbase.rule=Host(`grimoire.local.mydomain.co.uk`) && PathPrefix(`/pb/`)
      - traefik.http.middlewares.grimoire-pocketbase.stripprefix.prefixes=/pb
      - traefik.http.routers.grimoire-pocketbase.middlewares=grimoire-pocketbase

AND

    network_mode: bridge
    labels:
      - traefik.http.routers.grimoire.rule=Host(`grimoire.local.mydomain.co.uk`)

But this will not allow anything to load.

When I use the following, the service will load and I can navigate the login pages, but I can't submit any data.

    networks:
      - proxy
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.grimoire-pocketbase.entrypoints=http"
      - "traefik.http.routers.grimoire-pocketbase.rule=Host(`grimoire.local.mydomain.co.uk`) && PathPrefix(`/pb/`)"
      - "traefik.http.middlewares.grimoire-pocketbase.stripprefix.prefixes=/pb"
      - "traefik.http.middlewares.grimoire-pocketbase-https-redirect.redirectscheme.scheme=https"
      - "traefik.http.routers.grimoire-pocketbase.middlewares=grimoire-pocketbase"
      - "traefik.http.routers.grimoire-pocketbase.middlewares=grimoire-pocketbase-https-redirect"
      - "traefik.http.routers.grimoire-pocketbase-secure.entrypoints=https"
      - "traefik.http.routers.grimoire-pocketbase-secure.rule=Host(`grimoire.local.mydomain.co.uk`) && PathPrefix(`/pb/`)"
      - "traefik.http.routers.grimoire-pocketbase-secure.tls=true"
      - "traefik.http.routers.grimoire-pocketbase-secure.service=grimoire-pocketbase"
      - "traefik.http.services.grimoire-pocketbase.loadbalancer.server.port=80"
      - "traefik.docker.network=proxy"

AND

    networks:
      - proxy
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.grimoire.entrypoints=http"
      - "traefik.http.routers.grimoire.rule=Host(`grimoire.local.mydomain.co.uk`)"
      - "traefik.http.middlewares.grimoire-https-redirect.redirectscheme.scheme=https"
      - "traefik.http.routers.grimoire.middlewares=grimoire-https-redirect"
      - "traefik.http.routers.grimoire-secure.entrypoints=https"
      - "traefik.http.routers.grimoire-secure.rule=Host(`grimoire.local.mydomain.co.uk`)"
      - "traefik.http.routers.grimoire-secure.tls=true"
      - "traefik.http.routers.grimoire-secure.service=grimoire"
      - "traefik.http.services.grimoire.loadbalancer.server.port=5173"
      - "traefik.docker.network=proxy"

AND

networks:
  proxy:
    external: true

To Reproduce
Steps to reproduce the behavior:
Traefik setup following this guide - https://technotim.live/posts/traefik-portainer-ssl/
docker-compose.yml as described.
.env:

# Set it if you're using external PocketBase installation (default: http://localhost:8090)
# Example: PUBLIC_POCKETBASE_URL=https://grimoire.mydomain.com:8090
PUBLIC_POCKETBASE_URL=https://grimoire.local.mydomain.co.uk/pb
# RECOMMENDED: Change this to your email
[email protected]
# RECOMMENDED: Use a secure password. Can be later changed in PocketBase's admin panel
ROOT_ADMIN_PASSWORD=changeme
# Set this to your domain name (default: http://localhost:5173)
# Example: ORIGIN=grimoire.mydomain.com
ORIGIN=https://grimoire.local.mydomain.co.uk
# Set this to true if you're using HTTPS (default: false)
# Example: PUBLIC_HTTPS_ONLY=true
PUBLIC_HTTPS_ONLY=false
# Change to the port you want the app to listen on (default: 5173)
# Example: PORT=80
PORT=5173
# Set this to true if you want to disable public signups (default: false)
PUBLIC_SIGNUP_DISABLED=false

Additional context
I'm no expert on Traefik and I have used the labels I tend to use for my other services. I have tried removing some and modifying some but have not had any luck yet.

Unable to clone from git using the instructions in the README

Running the git clone command in an otherwise functioning Fedora installation results in the following:

[nico@gallus grimoire]$ git clone [email protected]:goniszewski/grimoire.git
Cloning into 'grimoire'...
[email protected]: Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

I was able to replicate the issue on an Arch machine as well.

Could not connect to Pocketbase

Describe the bug
I've used the docker-compose.yml and .env files as stock from Github, and modified to my own spec, but regardless every time I login to the app's WebUI, I get the error "Could not connect to Pocketbase on . Is it running? " According to docker logs, both the grimoire and pocketbase containers are running fine. Since Pocketbase can't connect, I can't move on to create a new user. I've tried manually adding the pb_data and pb_migrations folders, and left them to be created by docker when running docker compose up, but neither method resolves the issue.

To Reproduce
Steps to reproduce the behavior:
Just use the default .env and docker-compose.yml

Expected behavior
To function as advertised.

Screenshots
Screenshot 2024-03-29 214558

Top-level category does not show all bookmarks under subcategories or the subcategories of those subcategories.

Describe the bug
I have a bookmark under Self-Hosted > Photos and another one under Self-Hosted > Bookmarks. Clicking on Self-Hosted does not list any of those bookmarks.

To Reproduce
Steps to reproduce the behavior:

  1. Create bookmarks at category level: Self-Hosted > Photos and category level: Self-Hosted > Bookmarks.
  2. Click on Self-Hosted
  3. See that none of the bookmarks from #1 are listed under Self-Hosted.

Expected behavior
Bookmarks from subcategories and also their subcategories should be listed underneath the top-level category.

Screenshots
Screen Shot 2024-03-30 at 11 26 24 AM
Screen Shot 2024-03-30 at 11 26 32 AM

Desktop (please complete the following information):

  • OS: [Mac Monterey 12.7.4]
  • Browser [Opera]
  • Version [108.0.5067.29]

Additional context
Running latest version (v0.2.6) on Docker Desktop for Mac 4.28.0.

Login through reverse proxy results in cross-site form submissions forbidden

When running a Caddy reverse proxy directing https://grimoire.mysite.com to localhost:5173, the login page loads fine, but after clicking submit the following error appears: Cross-site POST form submissions are forbidden

This is usually resolved by either making Grimoire aware of its own domain in a Docker variable or enabling cross-site POST in Caddy, but Grimoire shouldn't be redirecting to another domain, so the former is more likely. Enabling cross-site can be a security risk as a compromised container can redirect your login credentials to another site.

Internal Server Error on User Registration in Development Mode

Describe the bug

Internal Server Error on User Registration. The default admin and password in the env.docker are also not working

To Reproduce
Steps to reproduce the behavior:

Run docker-compose --env-file .env.docker up

Sign up

And the error occurs.

Expected behavior

A user should be created with the supplied username and password.

Screenshots

image

Desktop (please complete the following information):

  • OS: Debian 11
  • Browser: Firefox-ESR
  • Version: 115.5.0esr

Additional context

ilfs@ilfs80:~/Public/grimoire$ docker compose --env-file .env.docker up
[+] Running 16/16
 βœ” pocketbase 3 layers [β£Ώβ£Ώβ£Ώ]      0B/0B      Pulled                                                                              16.4s 
   βœ” 96526aa774ef Pull complete                                                                                                   3.5s 
   βœ” b81d65e74622 Pull complete                                                                                                   4.4s 
   βœ” a6035ffe0b8d Pull complete                                                                                                   7.8s 
 βœ” grimoire 11 layers [β£Ώβ£Ώβ£Ώβ£Ώβ£Ώβ£Ώβ£Ώβ£Ώβ£Ώβ£Ώβ£Ώ]      0B/0B      Pulled                                                                       92.5s 
   βœ” 1f7ce2fa46ab Pull complete                                                                                                   8.4s 
   βœ” be65943961fd Pull complete                                                                                                   6.7s 
   βœ” deaa56ebdf84 Pull complete                                                                                                  13.4s 
   βœ” 75001c095b3d Pull complete                                                                                                  11.5s 
   βœ” 696f14a4770f Pull complete                                                                                                  12.1s 
   βœ” bcd4e171318c Pull complete                                                                                                  14.0s 
   βœ” e20100610709 Pull complete                                                                                                  30.2s 
   βœ” 912033d20149 Pull complete                                                                                                  18.2s 
   βœ” 4f4fb700ef54 Pull complete                                                                                                  16.5s 
   βœ” 86b0332a7a4b Pull complete                                                                                                  23.4s 
   βœ” ac31ac158758 Pull complete                                                                                                  20.9s 
[+] Running 3/3
 βœ” Network grimoire_default       Created                                                                                         0.2s 
 βœ” Container grimoire-pocketbase  Created                                                                                         6.5s 
 βœ” Container grimoire             Created                                                                                         1.9s 
Attaching to grimoire, grimoire-pocketbase
grimoire-pocketbase  | 2023/11/30 12:36:14 Server started at http://0.0.0.0:80
grimoire-pocketbase  | β”œβ”€ REST API: http://0.0.0.0:80/api/
grimoire-pocketbase  | └─ Admin UI: http://0.0.0.0:80/_/
grimoire             | Listening on 0.0.0.0:5173
grimoire             | Error: Not found: /favicon.ico
grimoire             |     at resolve (file:///app/build/server/index.js:3585:18)
grimoire             |     at resolve (file:///app/build/server/index.js:3412:34)
grimoire             |     at Object.handle (file:///app/build/server/chunks/hooks.server-13110f1a.js:31:26)
grimoire             |     at respond (file:///app/build/server/index.js:3410:43)
^CGracefully stopping... (press Ctrl+C again to force)
Aborting on container exit...
[+] Stopping 2/2
 βœ” Container grimoire             Stopped                                                                                        11.6s 
 βœ” Container grimoire-pocketbase  Stopped                                                                                         1.2s 
canceled

ilfs@ilfs80:~/Public/grimoire$ docker compose --env-file .env.docker up
[+] Running 2/2
 βœ” Container grimoire-pocketbase  Running                                                                                         0.0s 
 βœ” Container grimoire             Recreated                                                                                       1.0s 
Attaching to grimoire, grimoire-pocketbase
grimoire             | Listening on 0.0.0.0:5173
grimoire             | Error: Not found: /favicon.ico
grimoire             |     at resolve (file:///app/build/server/index.js:3585:18)
grimoire             |     at resolve (file:///app/build/server/index.js:3412:34)
grimoire             |     at Object.handle (file:///app/build/server/chunks/hooks.server-13110f1a.js:31:26)
grimoire             |     at respond (file:///app/build/server/index.js:3410:43)
grimoire             | ClientResponseError 0: Something went wrong while processing your request.
grimoire             |     at file:///app/node_modules/.pnpm/[email protected]/node_modules/pocketbase/dist/pocketbase.es.mjs:1:31144
grimoire             |     at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
grimoire             |     at async default (file:///app/build/server/chunks/7-ca624c92.js:9:20)
grimoire             |     at async handle_action_request (file:///app/build/server/index.js:1072:18)
grimoire             |     at async render_page (file:///app/build/server/index.js:2508:23)
grimoire             |     at async resolve (file:///app/build/server/index.js:3524:24)
grimoire             |     at async Object.handle (file:///app/build/server/chunks/hooks.server-13110f1a.js:31:20)
grimoire             |     at async respond (file:///app/build/server/index.js:3410:22)
grimoire             |     at async Array.ssr (file:///app/build/handler.js:1221:3) {
grimoire             |   url: '',
grimoire             |   status: 0,
grimoire             |   response: {},
grimoire             |   isAbort: false,
grimoire             |   originalError: TypeError: fetch failed
grimoire             |       at fetch (file:///app/build/shims.js:20346:13)
grimoire             |       at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
grimoire             |       at async default (file:///app/build/server/chunks/7-ca624c92.js:9:20)
grimoire             |       at async handle_action_request (file:///app/build/server/index.js:1072:18)
grimoire             |       at async render_page (file:///app/build/server/index.js:2508:23)
grimoire             |       at async resolve (file:///app/build/server/index.js:3524:24)
grimoire             |       at async Object.handle (file:///app/build/server/chunks/hooks.server-13110f1a.js:31:20)
grimoire             |       at async respond (file:///app/build/server/index.js:3410:22)
grimoire             |       at async Array.ssr (file:///app/build/handler.js:1221:3) {
grimoire             |     cause: Error: connect ECONNREFUSED 127.0.0.1:8090
grimoire             |         at TCPConnectWrap.afterConnect [as oncomplete] (node:net:1595:16) {
grimoire             |       errno: -111,
grimoire             |       code: 'ECONNREFUSED',
grimoire             |       syscall: 'connect',
grimoire             |       address: '127.0.0.1',
grimoire             |       port: 8090
grimoire             |     }
grimoire             |   }
grimoire             | }
grimoire             | ClientResponseError 0: Something went wrong while processing your request.
grimoire             |     at file:///app/node_modules/.pnpm/[email protected]/node_modules/pocketbase/dist/pocketbase.es.mjs:1:31144
grimoire             |     at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
grimoire             |     at async default (file:///app/build/server/chunks/7-ca624c92.js:9:20)
grimoire             |     at async handle_action_request (file:///app/build/server/index.js:1072:18)
grimoire             |     at async render_page (file:///app/build/server/index.js:2508:23)
grimoire             |     at async resolve (file:///app/build/server/index.js:3524:24)
grimoire             |     at async Object.handle (file:///app/build/server/chunks/hooks.server-13110f1a.js:31:20)
grimoire             |     at async respond (file:///app/build/server/index.js:3410:22)
grimoire             |     at async Array.ssr (file:///app/build/handler.js:1221:3) {
grimoire             |   url: '',
grimoire             |   status: 0,
grimoire             |   response: {},
grimoire             |   isAbort: false,
grimoire             |   originalError: TypeError: fetch failed
grimoire             |       at fetch (file:///app/build/shims.js:20346:13)
grimoire             |       at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
grimoire             |       at async default (file:///app/build/server/chunks/7-ca624c92.js:9:20)
grimoire             |       at async handle_action_request (file:///app/build/server/index.js:1072:18)
grimoire             |       at async render_page (file:///app/build/server/index.js:2508:23)
grimoire             |       at async resolve (file:///app/build/server/index.js:3524:24)
grimoire             |       at async Object.handle (file:///app/build/server/chunks/hooks.server-13110f1a.js:31:20)
grimoire             |       at async respond (file:///app/build/server/index.js:3410:22)
grimoire             |       at async Array.ssr (file:///app/build/handler.js:1221:3) {
grimoire             |     cause: Error: connect ECONNREFUSED 127.0.0.1:8090
grimoire             |         at TCPConnectWrap.afterConnect [as oncomplete] (node:net:1595:16) {
grimoire             |       errno: -111,
grimoire             |       code: 'ECONNREFUSED',
grimoire             |       syscall: 'connect',
grimoire             |       address: '127.0.0.1',
grimoire             |       port: 8090
grimoire             |     }
grimoire             |   }
grimoire             | }
grimoire             | ClientResponseError 0: Something went wrong while processing your request.
grimoire             |     at file:///app/node_modules/.pnpm/[email protected]/node_modules/pocketbase/dist/pocketbase.es.mjs:1:31144
grimoire             |     at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
grimoire             |     at async default (file:///app/build/server/chunks/12-82d76df8.js:12:7)
grimoire             |     at async handle_action_json_request (file:///app/build/server/index.js:997:18)
grimoire             |     at async resolve (file:///app/build/server/index.js:3524:24)
grimoire             |     at async Object.handle (file:///app/build/server/chunks/hooks.server-13110f1a.js:31:20)
grimoire             |     at async respond (file:///app/build/server/index.js:3410:22)
grimoire             |     at async Array.ssr (file:///app/build/handler.js:1221:3) {
grimoire             |   url: '',
grimoire             |   status: 0,
grimoire             |   response: {},
grimoire             |   isAbort: false,
grimoire             |   originalError: TypeError: fetch failed
grimoire             |       at fetch (file:///app/build/shims.js:20346:13)
grimoire             |       at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
grimoire             |       at async default (file:///app/build/server/chunks/12-82d76df8.js:12:7)
grimoire             |       at async handle_action_json_request (file:///app/build/server/index.js:997:18)
grimoire             |       at async resolve (file:///app/build/server/index.js:3524:24)
grimoire             |       at async Object.handle (file:///app/build/server/chunks/hooks.server-13110f1a.js:31:20)
grimoire             |       at async respond (file:///app/build/server/index.js:3410:22)
grimoire             |       at async Array.ssr (file:///app/build/handler.js:1221:3) {
grimoire             |     cause: Error: connect ECONNREFUSED 127.0.0.1:8090
grimoire             |         at TCPConnectWrap.afterConnect [as oncomplete] (node:net:1595:16) {
grimoire             |       errno: -111,
grimoire             |       code: 'ECONNREFUSED',
grimoire             |       syscall: 'connect',
grimoire             |       address: '127.0.0.1',
grimoire             |       port: 8090
grimoire             |     }
grimoire             |   }
grimoire             | }
grimoire             | ClientResponseError 0: Something went wrong while processing your request.
grimoire             |     at file:///app/node_modules/.pnpm/[email protected]/node_modules/pocketbase/dist/pocketbase.es.mjs:1:31144
grimoire             |     at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
grimoire             |     at async default (file:///app/build/server/chunks/12-82d76df8.js:12:7)
grimoire             |     at async handle_action_json_request (file:///app/build/server/index.js:997:18)
grimoire             |     at async resolve (file:///app/build/server/index.js:3524:24)
grimoire             |     at async Object.handle (file:///app/build/server/chunks/hooks.server-13110f1a.js:31:20)
grimoire             |     at async respond (file:///app/build/server/index.js:3410:22)
grimoire             |     at async Array.ssr (file:///app/build/handler.js:1221:3) {
grimoire             |   url: '',
grimoire             |   status: 0,
grimoire             |   response: {},
grimoire             |   isAbort: false,
grimoire             |   originalError: TypeError: fetch failed
grimoire             |       at fetch (file:///app/build/shims.js:20346:13)
grimoire             |       at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
grimoire             |       at async default (file:///app/build/server/chunks/12-82d76df8.js:12:7)
grimoire             |       at async handle_action_json_request (file:///app/build/server/index.js:997:18)
grimoire             |       at async resolve (file:///app/build/server/index.js:3524:24)
grimoire             |       at async Object.handle (file:///app/build/server/chunks/hooks.server-13110f1a.js:31:20)
grimoire             |       at async respond (file:///app/build/server/index.js:3410:22)
grimoire             |       at async Array.ssr (file:///app/build/handler.js:1221:3) {
grimoire             |     cause: Error: connect ECONNREFUSED 127.0.0.1:8090
grimoire             |         at TCPConnectWrap.afterConnect [as oncomplete] (node:net:1595:16) {
grimoire             |       errno: -111,
grimoire             |       code: 'ECONNREFUSED',
grimoire             |       syscall: 'connect',
grimoire             |       address: '127.0.0.1',
grimoire             |       port: 8090
grimoire             |     }
grimoire             |   }
grimoire             | }
grimoire             | ClientResponseError 0: Something went wrong while processing your request.
grimoire             |     at file:///app/node_modules/.pnpm/[email protected]/node_modules/pocketbase/dist/pocketbase.es.mjs:1:31144
grimoire             |     at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
grimoire             |     at async default (file:///app/build/server/chunks/12-82d76df8.js:12:7)
grimoire             |     at async handle_action_json_request (file:///app/build/server/index.js:997:18)
grimoire             |     at async resolve (file:///app/build/server/index.js:3524:24)
grimoire             |     at async Object.handle (file:///app/build/server/chunks/hooks.server-13110f1a.js:31:20)
grimoire             |     at async respond (file:///app/build/server/index.js:3410:22)
grimoire             |     at async Array.ssr (file:///app/build/handler.js:1221:3) {
grimoire             |   url: '',
grimoire             |   status: 0,
grimoire             |   response: {},
grimoire             |   isAbort: false,
grimoire             |   originalError: TypeError: fetch failed
grimoire             |       at fetch (file:///app/build/shims.js:20346:13)
grimoire             |       at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
grimoire             |       at async default (file:///app/build/server/chunks/12-82d76df8.js:12:7)
grimoire             |       at async handle_action_json_request (file:///app/build/server/index.js:997:18)
grimoire             |       at async resolve (file:///app/build/server/index.js:3524:24)
grimoire             |       at async Object.handle (file:///app/build/server/chunks/hooks.server-13110f1a.js:31:20)
grimoire             |       at async respond (file:///app/build/server/index.js:3410:22)
grimoire             |       at async Array.ssr (file:///app/build/handler.js:1221:3) {
grimoire             |     cause: Error: connect ECONNREFUSED 127.0.0.1:8090
grimoire             |         at TCPConnectWrap.afterConnect [as oncomplete] (node:net:1595:16) {
grimoire             |       errno: -111,
grimoire             |       code: 'ECONNREFUSED',
grimoire             |       syscall: 'connect',
grimoire             |       address: '127.0.0.1',
grimoire             |       port: 8090
grimoire             |     }
grimoire             |   }
grimoire             | }
grimoire             | ClientResponseError 0: Something went wrong while processing your request.
grimoire             |     at file:///app/node_modules/.pnpm/[email protected]/node_modules/pocketbase/dist/pocketbase.es.mjs:1:31144
grimoire             |     at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
grimoire             |     at async default (file:///app/build/server/chunks/12-82d76df8.js:12:7)
grimoire             |     at async handle_action_json_request (file:///app/build/server/index.js:997:18)
grimoire             |     at async resolve (file:///app/build/server/index.js:3524:24)
grimoire             |     at async Object.handle (file:///app/build/server/chunks/hooks.server-13110f1a.js:31:20)
grimoire             |     at async respond (file:///app/build/server/index.js:3410:22)
grimoire             |     at async Array.ssr (file:///app/build/handler.js:1221:3) {
grimoire             |   url: '',
grimoire             |   status: 0,
grimoire             |   response: {},
grimoire             |   isAbort: false,
grimoire             |   originalError: TypeError: fetch failed
grimoire             |       at fetch (file:///app/build/shims.js:20346:13)
grimoire             |       at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
grimoire             |       at async default (file:///app/build/server/chunks/12-82d76df8.js:12:7)
grimoire             |       at async handle_action_json_request (file:///app/build/server/index.js:997:18)
grimoire             |       at async resolve (file:///app/build/server/index.js:3524:24)
grimoire             |       at async Object.handle (file:///app/build/server/chunks/hooks.server-13110f1a.js:31:20)
grimoire             |       at async respond (file:///app/build/server/index.js:3410:22)
grimoire             |       at async Array.ssr (file:///app/build/handler.js:1221:3) {
grimoire             |     cause: Error: connect ECONNREFUSED 127.0.0.1:8090
grimoire             |         at TCPConnectWrap.afterConnect [as oncomplete] (node:net:1595:16) {
grimoire             |       errno: -111,
grimoire             |       code: 'ECONNREFUSED',
grimoire             |       syscall: 'connect',
grimoire             |       address: '127.0.0.1',
grimoire             |       port: 8090
grimoire             |     }
grimoire             |   }
grimoire             | }


Ollama URL from settings is not respected.

Hi there.

Describe the bug

Ollama URL from the settings is not respected when adding a link.
I was able to bypass it by replacing all localhost:11434:
find "." -type f | xargs sed -i "s/localhost:11434/aaa.bbb.ccc.ddd:11434"/g"
and then building the image locally.

To Reproduce

Steps to reproduce the behavior:

  1. Change the ollama url in the settings and toggle tag/summary.
  2. Open network panel.
  3. Add an entry.
  4. See request being fired at localhost.

Expected behavior

Request in 5 should be targeted at the ollama url in the settings.

Screenshots

image

(Edit for formatting)

[Feature] Link Behavior

Just a small idea for user setting:

"Always open link in new tab"

The "open in new tab"-icon could then switch to "bookmark details"

I usually open multiple links by ctrl+click, but doing that with the small "open in new tab"-symbol is challenging

Docker install is very cumbersome

It took 11 plus minutes to deploy the container only to find out it won't work locally. Do I HAVE to have it behind a reverse proxy? If so please let me know so I can test again. I hope to use this and write a review soon.

Issues seem to be with Pocketbase? When I try to log in I get this error. I followed your install guide which seems pretty basic. The install however took forever lol.

Cross-site POST form submissions are forbidden

chrome_USdVWDG5KN

Thank you!

Grimoire API not reachable

Describe the bug
Grimoire API not reachable from extension through Cloudflare tunnel or locally on fresh docker setup.
Also, trying to directly add bookmark by accessing grimoire locally is not possible because Add button is disabled and bookmark popup cannot be closed.

To Reproduce
Steps to reproduce the behavior:

  1. Setup docker container inside ProxMox Ubuntu 22.04 CT
  2. Click on extension button in Firefox
  3. Grimoire API is not reachable
  4. See error

Expected behavior
Bookmark was saved to Grimoire

Desktop (please complete the following information):

  • OS: Nobara 39
  • Browser Firefox
  • Version 124.0.1

Feature: allow disabling registration

Is your feature request related to a problem? Please describe.
I would like to use my grimoire instance as a single user one. This would allow me to expose it to the internet without having random people create user on this instance.

Describe the solution you'd like
The best solution would be to set an environment variable to enable registration or not (e.g. Gitea does it this way: https://docs.gitea.com/next/administration/config-cheat-sheet#service-service DISABLE_REGISTRATION).

Describe alternatives you've considered
One hacky way was to do it using this solution:
pocketbase/pocketbase#3488 (comment)

Additional context

Import bookmarks from Shaarli

Import bookmarks from Shaarli could ease migration.

  • Ability to import ~5000 links with notes and ~1700 tags
  • Support markdown notes for links
  • Support notes without links (eg. grocery shopping list, private note, etc)
  • Support public and private notes
  • Optimize displaying entries up to 15 or more tags

How can I help?

I've been watching this project with great interest since you posted about it on reddit and I'd like to help make some of the roadmap features a reality. Are there features you're working on currently that you'd like help with QA on? Are there features you know you're not going to tackle in the immediate that you'd like me or others to start on? Thanks for open sourcing all your time and effort!

Handle relative URL's while fetching images for new bookmark

Describe the bug
Some URLs have only the filename of an image being parsed by get-metadata.ts (like favicon.icon). It causes an unhandled error when addNewBookmark action tries to fetch it here:

if (main_image_url || icon_url) {
.

To Reproduce
Steps to reproduce the behavior:

  1. Add new bookmark with URL https://news.ycombinator.com/
  2. It should fail with errors Error: Not found: /favicon.ico and Error: Cannot use relative URL (favicon.ico) with global fetch β€” use event.fetch instead: https://kit.svelte.dev/docs/web-standards#fetch-apis

Expected behavior
In get-metadata.ts all relative URLs for images should be replaced with absolute ones, if possible. The addNewBookmark should gracefully handle any failed attempts for fetching images.

History Sync

Is your feature request related to a problem? Please describe.
There's no single self-hosted sync server that takes care of browsinghistory. Except for Firefox Sync server.

Describe the solution you'd like
For Grimoire to sync browsing history.

Describe alternatives you've considered
Firefox Sync server, which has lots of issues and it's hard to properly set up.

500 error when searching on clean install: "Invalid filter parameters."

Describe the bug
On a fresh install of Grimoire using git clone and docker-compose up, running localhost without any default settings changed, the search feature is not working.

Inspecting traffic, I can see it's attempting to filter the relevant results based on the ids parameter being passed to the http://localhost:5173/api/bookmarks endpoint, however when any IDs are being passed in the array through the parameter, it's rejecting with a 500 and:

{
    "success": false,
    "error": "Invalid filter parameters."
}

To Reproduce
Steps to reproduce the behavior:

  1. Git clone
  2. docker-compose up
  3. Add a bookmark (I did it through Chrome companion extension)
  4. Try to search for title of bookmark
  5. Confirm no results show up
  6. Inspect traffic, see that ids param populates with ID of correct bookmark(s) when typing, however server is returning 500
  7. Intentionally search for incorrect bookmark, and confirm that the ids field is blank, and it returns 200

Expected behavior
When the HTTP request is generated for the /api/bookmarks endpoint and an array of ids is being passed through, the server should be responding with a 200 HTTP response with the metadata of the relevant bookmarks requested, and not a 500 Internal Server Error.

Screenshots
Screenshot 2024-04-21 at 11 03 55β€―PM

Desktop (please complete the following information):

  • OS: macOS 14.4.1 (23E224)
  • Browser Edge
  • Version 0.3.3

Trying to add a bookmark without a category triggers an error

Hi there,

Describe the bug

Trying to add a bookmark without any category existing triggers an error and blocks the adding process.

To Reproduce

  1. Steps to reproduce the behavior:
  2. Delete all categories
  3. Open browser dev tools
  4. Try to add a bookmark
  5. See error and process locking

Expected behavior

Display an error saying that no category exists/create a "Uncategorized" category/Allow the creation of the category on the pane

Screenshots

image

No way to choose model in Ollama

There is nothing to choose in model dropdown

Screenshot from 2023-12-09 12-14-56

curl http://10.0.0.76:11434/
Ollama is running%  

I am not sure if ollama is expected to be working in current release.
If not, you can close the issue.

Error with .env file

Describe the bug
Error regarding .env file

To Reproduce
Here is my compose file

version: '3.7'
services:
pocketbase:
image: spectado/pocketbase:0.19.2
container_name: grimoire-pocketbase
restart: unless-stopped
ports:
- '8091:80'
volumes:
- /mnt/user/appdata/grimoire/pb_data:/pb_data
- /mnt/user/appdata/grimoire/pb_migrations:/pb_migrations/
healthcheck:
test: wget --no-verbose --tries=1 --spider http://localhost:8091/api/health || exit 1
interval: 5s
timeout: 5s
retries: 5
env_file: .env
grimoire:
image: goniszewski/grimoire:latest
container_name: grimoire
restart: unless-stopped
env_file: .env
build:
context: .
dockerfile: Dockerfile
ports:
- '5173:5173'
depends_on:
- pocketbase

Desktop (please complete the following information):

  • OS: Unraid
  • Browser Edge
  • Version [

Additional context
I'm trying to deploy this using portainer but I get this error message

Deployment error
failed to deploy a stack: Failed to load /data/compose/47/.env: open /data/compose/47/.env: no such file or directory

Internal server error 500

Describe the bug
The application starts itself without errors after docker-compose up:

$ docker-compose up
[+] Building 0.0s (0/0)
[+] Running 2/0
 βœ” Container grimoire-pocketbase  Created
 βœ” Container grimoire             Created
Attaching to grimoire, grimoire-pocketbase
grimoire-pocketbase  | 2024/01/23 13:15:19 Server started at http://0.0.0.0:80
grimoire-pocketbase  | β”œβ”€ REST API: http://0.0.0.0:80/api/
grimoire-pocketbase  | └─ Admin UI: http://0.0.0.0:80/_/
grimoire             | Listening on 0.0.0.0:5173

But when I try to access http://localhost:5173 I receive an error 500. The console shows an error in loop:

grimoire             | ClientResponseError 0: The request was autocancelled. You can find more info in https://github.com/pocketbase/js-sdk#auto-cancellation.
grimoire             |     at file:///app/node_modules/.pnpm/[email protected]/node_modules/pocketbase/dist/pocketbase.es.mjs:1:31144
grimoire             |     at async load (file:///app/build/server/chunks/0-546e495e.js:32:24)
grimoire             |     at async load_server_data (file:///app/build/server/index.js:1186:18)
grimoire             |     at async file:///app/build/server/index.js:2557:18 {
grimoire             |   url: '',
grimoire             |   status: 0,
grimoire             |   response: {},
grimoire             |   isAbort: true,
grimoire             |   originalError: DOMException [AbortError]: This operation was aborted
grimoire             |       at fetch (file:///app/build/shims.js:20346:13)
grimoire             |       at async load (file:///app/build/server/chunks/0-546e495e.js:32:24)
grimoire             |       at async load_server_data (file:///app/build/server/index.js:1186:18)
grimoire             |       at async file:///app/build/server/index.js:2557:18
grimoire             | }
grimoire             | ClientResponseError 0: The request was autocancelled. You can find more info in https://github.com/pocketbase/js-sdk#auto-cancellation.
grimoire             |     at file:///app/node_modules/.pnpm/[email protected]/node_modules/pocketbase/dist/pocketbase.es.mjs:1:31144
grimoire             |     at async load (file:///app/build/server/chunks/0-546e495e.js:32:24)
grimoire             |     at async load_server_data (file:///app/build/server/index.js:1186:18)
grimoire             |     at async respond_with_error (file:///app/build/server/index.js:2215:27)
grimoire             |     at async resolve (file:///app/build/server/index.js:3573:16)
grimoire             |     at async Object.handle (file:///app/build/server/chunks/hooks.server-6da8a1ec.js:31:20)
grimoire             |     at async respond (file:///app/build/server/index.js:3404:22)
grimoire             |     at async Array.ssr (file:///app/build/handler.js:1221:3) {
grimoire             |   url: '',
grimoire             |   status: 0,
grimoire             |   response: {},
grimoire             |   isAbort: true,
grimoire             |   originalError: DOMException [AbortError]: This operation was aborted
grimoire             |       at fetch (file:///app/build/shims.js:20346:13)
grimoire             |       at async load (file:///app/build/server/chunks/0-546e495e.js:32:24)
grimoire             |       at async load_server_data (file:///app/build/server/index.js:1186:18)
grimoire             |       at async respond_with_error (file:///app/build/server/index.js:2215:27)
grimoire             |       at async resolve (file:///app/build/server/index.js:3573:16)

<continues forever>

To Reproduce
Steps to reproduce the behavior:

  1. git clone https://github.com/goniszewski/grimoire
  2. cd grimoire
  3. docker-compose up
  4. Try to access http://localhost:5173

Expected behavior
The web application should not return an error 500.

Desktop (please complete the following information):

  • OS: WSL 2 openSUSE running on Windows 11
  • Browser Firefox
  • Version 121

Additional context
I already have other docker containers running without problems in my WSL.

This is my .env:

# Set it if you're using external PocketBase installation (default: http://localhost:8090)
# Example: PUBLIC_POCKETBASE_URL=https://grimoire.mydomain.com:8090
PUBLIC_POCKETBASE_URL=
# RECOMMENDED: Change this to your email
[email protected]
# RECOMMENDED: Use a secure password. Can be later changed in PocketBase's admin panel
ROOT_ADMIN_PASSWORD=123456
# Set this to your domain name (default: http://localhost:5173)
# Example: ORIGIN=grimoire.mydomain.com
ORIGIN=http://localhost:5173
# Set this to true if you're using HTTPS (default: false)
# Example: PUBLIC_HTTPS_ONLY=true
PUBLIC_HTTPS_ONLY=false
# Change to the port you want the app to listen on (default: 5173)
# Example: PORT=80
PORT=5173
# Set this to true if you want to disable public signups (default: false)
PUBLIC_SIGNUP_DISABLED=false

Grimoire web app is showing outdated information for Settings and Bookmarks

Describe the bug
After deleting a bookmark or changing settings, the webapp does not update the view until the page is refreshed.

To Reproduce
Steps to reproduce the behavior:

  1. Go to settings, toggle animations off.
  2. Click on the "Back to Home" button
  3. Go back to settings, animations are still toggled on
  4. Refresh the page, animations are now toggled off.
  5. Similarly after deleting a bookmark, it is still present on the view until the page is refreshed.

Expected behavior
The webapp should have the latest data. You should not have to refresh to see the up to data settings or bookmarks.

Screenshots
Before refresh:
image
After refresh:
image

Desktop (please complete the following information):

  • OS: Windows 11, Grimoire running on WSL
  • Browser Firefox
  • Version 120.0.1

Let me know if you need any more information

Incorrect Tag Links

Describe the bug
I've created two tags, called Test Tag 1 and TestTag2.

On the left side (marked with red), the links to the tags are https://my-server/tags/test-tag-1 and https://my-server/tags/testtag2. These links work. The tag links below the link (marked with yellow) lead to https://my-server/tags/Test%20Tag%201 respectively https://my-server/tags/TestTag2 which end up on the page Tag: undefined

To Reproduce
Steps to reproduce the behavior:

  1. Create a new link and tag it with the two tags Test Tag 1 and TestTag2.
  2. Click on one of the links marked with yellow on the screenshot.
  3. See error

Expected behavior
The link for the tags should be translated in the same way as they are for the links on the left side - or not translated for both.

Screenshots

image

Additional context

REPOSITORY              TAG           IMAGE ID       CREATED        SIZE
goniszewski/grimoire    latest        165dc89e8f6f   2 days ago     1.04GB
spectado/pocketbase     0.19.2        fec2ed5075bd   5 months ago   55.1MB

Bookmark pictures not loading

When logging into the app and waiting for the bookmarks to be shown - all of the bookmarks appear with an unloaded picture. Trying to open it up manually will result in a 500 error. The logs show this:

TypeError: fetch failed at node:internal/deps/undici/undici:12618:11 at process.processTicksAndRejections (node:internal/process/task_queues:95:5) at async GET (file:///app/build/server/chunks/_server.ts-z21KZ-VH.js:6:20) at async render_endpoint (file:///app/build/server/index.js:391:20) at async resolve2 (file:///app/build/server/index.js:3661:22) at async Object.handle (file:///app/build/server/chunks/hooks.server--1Uz_Y0W.js:32:20) at async respond (file:///app/build/server/index.js:3555:22) at async Array.ssr (file:///app/build/handler.js:1243:3) { cause: Error: connect ECONNREFUSED 127.0.0.1:8090 at TCPConnectWrap.afterConnect [as oncomplete] (node:net:1605:16) { errno: -111, code: 'ECONNREFUSED', syscall: 'connect', address: '127.0.0.1', port: 8090 }

The instance is self-hosted in a container in Unraid, with Pocketbase, using the :latest tag for the container.

Steps to reproduce the behavior:

  1. Go to the local instance address and login with any user account (admin included)
  2. Wait for the bookmarks to be shown
  3. Observe that all the bookmarks are shown with broken pictures

Expected behavior
Background pictures for bookmarks are loaded and shown

Screenshots
bandicam 2024-04-30 20-50-41-995
bandicam 2024-04-30 20-50-46-372
bandicam 2024-04-30 20-50-49-862

Desktop (please complete the following information):

  • OS: Unraid 6.12.6
  • Browser any (tried with Brave, Firefox)

support sqlite?

Is your feature request related to a problem? Please describe.
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]

Describe the solution you'd like
A clear and concise description of what you want to happen.

Describe alternatives you've considered
A clear and concise description of any alternative solutions or features you've considered.

Additional context
Add any other context or screenshots about the feature request here.

Feature request

A way to create offline copy of the webpages. Something to prevent link rot. Will be useful if website goes down and we will have access to local offline version of the webpage.

Adding/loading bookmarks doesn't work correctly with custom domain

          > With commit [d485055](https://github.com/goniszewski/grimoire/commit/d485055081a5d191a6782a3363e13c8dce8cc97b) I was successful in launching the app via `docker compose up` for external IP, domain as well as simply local deployment. Moreover, this commit fixes an issue with invalid URLs for files stored by PocketBase.

I hope it will work for you guys just fine this time. Please inform me if that's the case, or if there are any issues or questions related to new/updated environment variables. And also, please accept my apologies for this mess!

It worked for me, but there are still a few issues I observe.

  1. After creating a user, I get a 500 error one single time with the same TypeError: Cannot read properties of null (reading 'id') error. But after refreshing I'm logged in.

  2. Adding a new bookmark just freezes after the spinning circle to grab the meta data. I can, however, press enter again at the URL box to save it.

  3. Saving the bookmark does not add the bookmark to the bookmarks page automatically. I had to manually refresh again to see it appear.

  4. The new bookmark has no meta data, only the URL and HTML code is saved. Images, titles etc are not saved, this is presumably due to error number 2.

Originally posted by @maya329 in #12 (comment)

Bookmark images are fetched from 127.0.0.1 only

It appears that bookmark images are hardcoded to fetch from 127.0.0.1 with no way to configure the actual pocketbase url.

Screenshot 2023-11-26 124014

I have confirmed that the application url is set correctly in pocketbase's settings.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    πŸ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. πŸ“ŠπŸ“ˆπŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❀️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.