A simple personal knowledge platform with a focus on clean markdown files, simple queries and a journal.
- Introduction
- Current Status
- Run Looksyk
- Migrate Your Existing Logseq Graph
- Configuration
- Usage
- Contribution Guidelines
- License
I have always been a fan of Logseq, but there were a few things that bothered me, such as the many control characters in the markdown files, the query language that is difficult to learn and limited in its capability, or the general performance. When the database version announced the move away from Markdown as the leading data storage format, I tried to write my own client: Looksyk (name may need to be changed).
With Looksyk I want to create a local platform to collect information.
Currently, the backend renders all content in Markdown, which is displayed with Marked in the frontend. This makes Looksyk relatively close to the Markdown standard. Code highlighting is done with highlightjs and emojis with openmoji. The application is wrapped in an electron app (with electron forge).
Even if the project is currently a pure web project, I would not deploy it publicly because the project in its current state has not paid much attention to security (for example Injection-Attacks or Path-Traversal-Attacks).
Currently, the backend is very fast, my Logseq graph (~900 pages and 900kb text) is scanned and indexed in under a second (~200ms). That's why Looksyk doesn't have a database, reading new data into RAM is fast enough.
The frontend still has some challenges. Performance and design can be improved and sometimes scrolling on the journal page has issues.
The project is a little hobby of mine, and I program a few lines sometimes when I feel like it and have the time.
I am happy about every contribution, but I cannot guarantee that I will implement every feature request.
If you have any changes or suggestions, please send me a pull request. For feature requests and bugs, you can submit an issue (or a pull request if you can).
- Pages
- Journal
- Todos
- Content assist
- Creating links, inserting queries, tags and media
- View (and link) media
- Images
- PDFs
- HTML Files (e.g. SingleFile saved pages from SingleFile Firefox or SingleFile Chrome)
- Video (html5 video player)
- Audio (html5 audio player)
- Code (with highlighting)
- Text files
- Queries (placeholders for dynamic content)
- Query todos
- Page hierarchy
- References
- Render video, audio, images, text files and code files (with highlighting)
- Search across all pages and journals
- Delete and rename pages (and update references across all pages and journals)
- Favourites
- History: Show, drop, navigate to previous and next page. Keyboard shortcurts available.
- Non-Markdown content (e.g. flashcards, whiteboards)
- PDF annotation
- Dynamic backend plugins
- Server version / multi user / rcs
- i18n
- Sync with other devices. Please use other tools like Nextcloud, git or OneDrive to sync your graph
- Run the script
bash build.sh
(this will build the frontend and backend, and requiresnpm
andcargo
) - The application is now in the
target
folder - (Optional) Create a shortcut icon
sh create_desktop_shortcut.sh
- Start the application. Use the created shortcut or run
./application-wrapper/looksyk
in thetarget
folder. You can instrument the application with the arguments--port
and--graph-location
to change the port and the graph location, and with--title
to change the title. With the argument--devtools true
the electron devtools are opened as default. - The application is now available at
http://localhost:8989
(or the configured port)
You can use the create_desktop_shortcut.sh
script to create a shortcut with a different port and graph location. Or
you can run the application with the arguments --port
, --graph-location
and --title
manually.
- Clone the repository
- Install frontend dependencies and run
cd frontend/looksyk
,npm install
,ng serve
- Install backend dependencies and run
cd backend
andcargo run
- The application is now available at
http://localhost:4200
(frontend) andhttp://localhost:8989
(backend)
- Change into the application-wrapper directory
cd application-wrapper
- Install electron dependencies
npm install
- Build the electron app
npm run package
- The application is now in the
out
folder e.g.out/looksyk-linux-x64/looksyk
- Start the application to create an empty graph
- Copy your journals into the journal folder (
~/graph/journals
) - Copy your pages into the pages folder (
~/graph/pages
) - Copy your assets into the assets folder (
~/graph/assets
) - Start / Restart the backend
- (Optional): Replace all asset references
(some name)[../assets/assetName]
with(some name)[/assets/assetName]
in your pages so 'on click' navigates to the media preview page and does not download the file. - (Optional): Replace all labels
#myTag
with[[myTag]]
in your pages so the tags are recognized by the backend. - (Optional): Replace your queries with the Looksyk query syntax
- (Optional): Replace your todos with the markdown checkbox / todo syntax. '[x]' for done, '[ ]' for todo.
The configuration is done in the config.json
file in the directory ~/.local/share/looksyk
. This path can be changed
with the environment variable LOOKSYK_CONFIG_PATH
.
The default graph location is in ~/graph
(or the configured location in the config.json
).
The application port and the graph location can be provided by arguments ( --port
and --graph-location
).
The application title can be modified with the argument --title
.
[[a link]]
creates a link to a page, typing[[
opens the content assist in "insert link mode"- Ctrl+Enter creates a new block
- Insert emojis with
:emoji:
(all emojis from openmoji available) - Ctrl+Space opens the content assist
- With open markdown block -> "insert mode"
- With no open markdown block -> "navigation mode"
- Alt+Left Navigate to the previous page
- Alt+Right Navigate to the next page
- Ctrl+R Refresh the current page
- Lists inside of blocks are supported.
- Unordered lists are supported with
*
(and not with-
, because-
starts a new block) - Ordered lists are supported with
1.
,2.
...
- Unordered lists are supported with
- Ctrl+Shift+F opens the content assist in "search mode" (case sensitive search across all pages and journals)
- Every tag
[[myTag]]
links to a page with the namemyTag
- To create a hierarchy, use the
/
character in the page name.[[myTag / mySubTag]]
creates a pagemyTag / mySubTag
in the and the parent tagmyTag
- You can navigate to the parent page by clicking on the parent tag in the page header
- You can query the page hierarchy with the query
page-hierarchy
(see page hierarchy)
- You can mark a page as favorite by clicking on the star next to the page title
- Favorites are displayed in the sidebar
- You can reorder the favorites by dragging them
- Code block start with three backticks and the language name (e.g. ```rust)
- Code blocks are highlighted with highlightjs. For proper highlighting, the language name must be provided
- Code blocks can be inserted with the query
insert-file-content
(see render assets)
- Todo-blocks are blocks with a leading
[ ]
for todo or[x]
for done. The rendered block has a checkbox that can be toggled - You can query todos with the query
todos
(see todos) - A todo block can be associated with a tags.
- The todo is always tagged with the tag of the page it is on. If the todo is
on a page with the tag
myTag
, the todo is also tagged withmyTag
. - Furthermore, the todo can be tagged with a custom tag. All tags that are in the todo block are associated with the todo.
- All tags in previous blocks that have a lower indentation will also be associated with the todo.
- The todo is always tagged with the tag of the page it is on. If the todo is
on a page with the tag
Queries are placeholders for dynamic content in Markdown. The result of the query is calculated and displayed dynamically at runtime, whereby only the query syntax and not the result is stored in the Markdown file on disk.
Queries are particularly suitable for three problems:
- Content that changes continuously over time and where the references should be dynamically adapted across all pages. For example, "Which todos for the tag "myTag" are not yet completed?" or "which subpages does the page myTag have?".
- Content that is not stored in the Markdown file, but should be displayed in the Markdown file. For example, "Insert the content of the file myFile.asdf as a code block" or "Insert the content of the file myFile.mp4 as a video".
- Content that is not supported by the Markdown standard, but should be displayed in the Markdown file. For example, "Insert a video" or "Insert an audio file".
Currently,all queries must be inserted exactly as described. Parameters cannot yet be swapped or omitted.
Show a list of links
{query: page-hierarchy root:"myRootTag" display:"inplace-list" }
Show the count
{query: page-hierarchy root:"myRootTag" display:"count" }
Show a list of todos with a checkbox and a link to the source file. The list is appended to the end of the current block
{query: todos tag:"myTag" state:"todo" display:"referenced-list" }
Show a list of todos (not modifiable, but renders in place)
{query: todos tag:"myTag" state:"todo" display:"inplace-list"}
Show the count of todos
{query: todos tag:"myTag" state:"todo" display:"count" }
Show done todos
{query: todos tag:"myTag" state:"done" display:"referenced-list" }
Show a list of backlinks
{query: references-to tag:"myTag" display:"referenced-list" }
Show the count
{query: references-to tag:"myTag" display:"count" }
Insert the content of a file as text block
{query: insert-file-content target-file:"myFile.asdf" display:"inline-text" }
Insert the content of a file as code block, and highlight the code
{query: insert-file-content target-file:"myFile.asdf" display:"code-block" }
Insert a video
{query: insert-file-content target-file:"myFile.mp4" display:"video" }
Insert an audio file
{query: insert-file-content target-file:"myFile.ogg" display:"audio" }
- Fork the repository.
- Create a new branch (
git checkout -b feature-branch
). - Make your changes.
- Commit your changes (
git commit -am 'Add new feature'
). - Push to the branch (
git push origin feature-branch
). - Create a new Pull Request.
This project is licensed under the AGPL3 License - see the LICENSE
file for details.