{"id":16214827,"url":"https://github.com/lecrapouille/islandedbrowser","last_synced_at":"2025-04-07T22:30:07.601Z","repository":{"id":115857072,"uuid":"499625805","full_name":"Lecrapouille/IslandedBrowser","owner":"Lecrapouille","description":"[Application][Prototype] Display your browser bookmarks as an island","archived":false,"fork":false,"pushed_at":"2022-06-17T16:55:59.000Z","size":353,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-02-13T23:45:06.959Z","etag":null,"topics":["bookmark","bookmark-manager","bookmarks","bookmarks-manager","firefox","force-directed-graphs","graph","graph-theory","stigmee","url"],"latest_commit_sha":null,"homepage":"","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Lecrapouille.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-06-03T19:18:31.000Z","updated_at":"2023-04-08T10:56:26.000Z","dependencies_parsed_at":null,"dependency_job_id":"5dff5668-d04a-4975-8658-0273b3cba5aa","html_url":"https://github.com/Lecrapouille/IslandedBrowser","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Lecrapouille%2FIslandedBrowser","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Lecrapouille%2FIslandedBrowser/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Lecrapouille%2FIslandedBrowser/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Lecrapouille%2FIslandedBrowser/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Lecrapouille","download_url":"https://codeload.github.com/Lecrapouille/IslandedBrowser/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247740380,"owners_count":20988203,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bookmark","bookmark-manager","bookmarks","bookmarks-manager","firefox","force-directed-graphs","graph","graph-theory","stigmee","url"],"created_at":"2024-10-10T11:13:07.892Z","updated_at":"2025-04-07T22:30:07.586Z","avatar_url":"https://github.com/Lecrapouille.png","language":"C++","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Islanded Browser\n\nThis is a in gestation personal experience for the [Stigmee](https://github.com/stigmee) for displaying your (Firefox) browser bookmarks as an 3D island.\n\nNotes:\n- I wrote *bookmarks* not *tabs* because I never have 500 tabs opened in my browser but have so many unorganized bookmarks.\n- I used Firefox, I do not use Chrome browser but I guess the process is identical.\n- You can click on the picture below, to see my Youtube tutorial [![video](doc/screenshot.png)](https://youtu.be/_IjCipUK8Bk) but with real collection of bookmarks, the graph is currently not displayed well as showned in the screenshot.\n\n## Compilation process\n\nPrerequisites: You need a g++, makefile, openmp and the library libsfml. They are easily install on your operating system.\n\nStep one: git clone the [IslandedBrowser](https://github.com/Lecrapouille/IslandedBrowser) repository but do not compile it yet!\nIn your Linux console, type the following command:\n\n```\ngit clone https://github.com/Lecrapouille/IslandedBrowser.git --depth=1\ncd IslandedBrowser\n```\n\nStep two: organize your Firefox bookmarks and save them as JSON file:\n- Move your favorite URL into folders.\n- Give them some more explicit names.\n- Add some tags separated by commas.\n- See this video on how to open the bookmarks organizer window: https://youtu.be/ZCSd5wcHcnQ\n\nStep three: Save your Firefox bookmarks as JSON file into `IslandedBrowser/bookmarks/bookmarks.json`:\n- On Firefox, do not click on the button \"export to HTML\" but instead on the button \"Save...\"\n- Save to this location: `IslandedBrowser/bookmarks/bookmarks.json`.\n- See this video on how to save the bookmarks: https://youtu.be/n-aw0ZNRby0\n\nStep four: Compile the IslandedBrowser:\n- `make -j8`\n- The Makefile will do it for you: it will call the Python3 `bookmarks/bookmark.py` to generate the C++ source file in `src/bookmarks.cpp` from `bookmarks/bookmarks.json`.\n- You can run the application: `./build/IslandedBrowser`\n\nStep five: Click on an URL this will open your Firefox. Click on a node this will open all URLs as child.\n- Bookmarks are in blue.\n- Folders are in red.\n\n## Algorithm\n\nPipeline:\n- The JSON file is parsed in to two separated set: folders and URLs. This is considered as low cost database.\n- The folder and URL sets are parsed into a graph.\n- The graph is expanded through a force-directed-graphs algorithm.\n\nUnder developement:\n- The expanded graph is converted into a 3D scene.\n- A spatial hash is used to fasten URL search when the user is clicking on the scene.\n\n## Work in progress\n\n- The force-directed-graphs algorithm is slow.\n- Thinking on how to generate heigh maps from the graph.\n- Generate 3D meshes and use OpenGL.\n- Display URL when mouse is pointing on node\n\n## Limitation\n\n- A 450 Kb JSON file is long to get the graph expanded.\n- I finally not sure that expanded graph looks nice. Bookmarks are not a balanced tree but looks like more a flat tree.\n\n## Example src/Bookmarks.cpp\n\n```c++\n#include \"IslandedBrowser.hpp\"\n\nvoid IslandedBrowser::init(Bookmarks\u0026 bookmarks, Folders\u0026 folders)\n{\n    folders =\n    {\n        { 0, { .title = \"\", .id = 0, .parent = 0 } },\n        { 2, { .title = \"Bookmarks Toolbar\", .id = 2, .parent = 0 } },\n        { 1660, { .title = \"qq\", .id = 1660, .parent = 2 } },\n    };\n\n    bookmarks =\n    {\n        { 1722, { .title = \"DMT004 Decentralized Meta Transactions - Google Docs\", .uri = \"https://docs.google.com/document/d/1U_fN6fbhdHBUnbibeWhgwtDbDFLSeSk3wu60VVo9ykw/edit\", .id = 1722, .parent = 1660 } },\n        { 1723, { .title = \"Équipements Arts Martiaux et Sports de Combat – VMA Self Défense\", .uri = \"https://vmaselfdefense-online.com/collections/equipement-art-martiaux\", .id = 1723, .parent = 1660 } },\n        { 1724, { .title = \"chromiumembedded / cef / wiki / BranchesAndBuilding — Bitbucket\", .uri = \"https://bitbucket.org/chromiumembedded/cef/wiki/BranchesAndBuilding\", .id = 1724, .parent = 1660 } },\n        { 1725, { .title = \"limmh/cef_mfc_demo: Integrating Chromium Embedded Framework (CEF) in a sample MFC application\", .uri = \"https://github.com/limmh/cef_mfc_demo\", .id = 1725, .parent = 1660 } },\n        { 1726, { .title = \"CEF3 C++ API Docs - Version 80.1.4+g8927396+chromium-80.0.3987.149\", .uri = \"https://magpcss.org/ceforum/apidocs3/\", .id = 1726, .parent = 1660 } },\n        { 1727, { .title = \"Feature: Vulkan Support · Issue #631 · NVIDIA/nvidia-docker\", .uri = \"https://github.com/NVIDIA/nvidia-docker/issues/631\", .id = 1727, .parent = 1660 } },\n        { 1728, { .title = \"A Simple Windows Example Using the Chromium Embedded Framework 3 - CodeProject\", .uri = \"https://www.codeproject.com/Tips/785840/A-Simple-Windows-Example-Using-the-Chromium-Embedd\", .id = 1728, .parent = 1660 } },\n        { 1729, { .title = \"fphammerle/docker-brave-browser: brave-browser https://brave.com/ 🐳\", .uri = \"https://github.com/fphammerle/docker-brave-browser\", .id = 1729, .parent = 1660 } },\n        { 1730, { .title = \"How can I generate a Git patch for a specific commit? - Stack Overflow\", .uri = \"https://stackoverflow.com/questions/6658313/how-can-i-generate-a-git-patch-for-a-specific-commit\", .id = 1730, .parent = 1660 } },\n        { 1731, { .title = \"git - How to shallow clone a specific commit with depth 1? - Stack Overflow\", .uri = \"https://stackoverflow.com/questions/31278902/how-to-shallow-clone-a-specific-commit-with-depth-1\", .id = 1731, .parent = 1660 } },\n        { 1732, { .title = \"Pinterest\", .uri = \"https://www.pinterest.fr/\", .id = 1732, .parent = 1660 } },\n        { 1733, { .title = \"zouzias/docker-boost: Docker images for Boost's C++ libraries\", .uri = \"https://github.com/zouzias/docker-boost\", .id = 1733, .parent = 1660 } },\n        { 1734, { .title = \"Docker Hub\", .uri = \"https://hub.docker.com/repository/docker/lecrapouille/chreage\", .id = 1734, .parent = 1660 } },\n    };\n}\n```\n\n## References\n\n- Philipp Kindermann Youtube videos [Force-Directed Drawings (1/3)](https://youtu.be/WWm-g2nLHds)\n- https://github.com/qdHe/Parallelized-Force-directed-Graph-Drawing\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flecrapouille%2Fislandedbrowser","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flecrapouille%2Fislandedbrowser","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flecrapouille%2Fislandedbrowser/lists"}