Giter VIP home page Giter VIP logo

linkding's Introduction

Overview

Introduction

linkding is a bookmark manager that you can host yourself. It's designed be to be minimal, fast, and easy to set up using Docker.

The name comes from:

  • link which is often used as a synonym for URLs and bookmarks in common language
  • Ding which is German for thing
  • ...so basically something for managing your links

Feature Overview:

  • Clean UI optimized for readability
  • Organize bookmarks with tags
  • Bulk editing, Markdown notes, read it later functionality
  • Share bookmarks with other users or guests
  • Automatically provides titles, descriptions and icons of bookmarked websites
  • Automatically archive websites, either as local HTML file or on Internet Archive
  • Import and export bookmarks in Netscape HTML format
  • Installable as a Progressive Web App (PWA)
  • Extensions for Firefox and Chrome, as well as a bookmarklet
  • SSO support via OIDC or authentication proxies
  • REST API for developing 3rd party apps
  • Admin panel for user self-service and raw data access

Demo: https://demo.linkding.link/

Screenshot:

Screenshot

Installation

linkding is designed to be run with container solutions like Docker. The Docker image is compatible with ARM platforms, so it can be run on a Raspberry Pi.

linkding uses an SQLite database by default. Alternatively linkding supports PostgreSQL, see the database options for more information.

Using Docker

The Docker image comes in several variants. To use a different image than the default, replace latest with the desired tag in the commands below, or in the docker-compose file.

Tag Description
latest Provides the basic functionality of linkding
latest-plus Includes feature for archiving websites as HTML snapshots
  • Significantly larger image size as it includes a Chromium installation
  • Requires more runtime memory to run Chromium
  • Requires more disk space for storing HTML snapshots
latest-alpine latest, but based on Alpine Linux. 🧪 Experimental
latest-plus-alpine latest-plus, but based on Alpine Linux. 🧪 Experimental

To install linkding using Docker you can just run the image from Docker Hub:

docker run --name linkding -p 9090:9090 -v {host-data-folder}:/etc/linkding/data -d sissbruecker/linkding:latest

In the command above, replace the {host-data-folder} placeholder with an absolute path to a folder on your host system where you want to store the linkding database.

If everything completed successfully, the application should now be running and can be accessed at http://localhost:9090.

To upgrade the installation to a new version, remove the existing container, pull the latest version of the linkding Docker image, and then start a new container using the same command that you used above. There is a shell script available to automate these steps. The script can be configured using environment variables, or you can just modify it.

To complete the setup, you still have to create an initial user, so that you can access your installation.

Using Docker Compose

To install linkding using Docker Compose, you can use the docker-compose.yml file. Copy the .env.sample file to .env, configure the parameters, and then run:

docker-compose up -d

To complete the setup, you still have to create an initial user, so that you can access your installation.

User Setup

For security reasons, the linkding Docker image does not provide an initial user, so you have to create one after setting up an installation. To do so, replace the credentials in the following command and run it:

Docker

docker exec -it linkding python manage.py createsuperuser --username=joe [email protected]

Docker Compose

docker-compose exec linkding python manage.py createsuperuser --username=joe [email protected]

The command will prompt you for a secure password. After the command has completed you can start using the application by logging into the UI with your credentials.

Alternatively you can automatically create an initial superuser on startup using the LD_SUPERUSER_NAME option.

Reverse Proxy Setup

When using a reverse proxy, such as Nginx or Apache, you may need to configure your proxy to correctly forward the Host header to linkding, otherwise certain requests, such as login, might fail.

Apache

Apache2 does not change the headers by default, and should not need additional configuration.

An example virtual host that proxies to linkding might look like:

<VirtualHost *:9100>
    <Proxy *>
        Order deny,allow
        Allow from all
    </Proxy>

    ProxyPass / http://linkding:9090/
    ProxyPassReverse / http://linkding:9090/
</VirtualHost>

For a full example, see the docker-compose configuration in jhauris/apache2-reverse-proxy

If you still run into CSRF issues, please check out the LD_CSRF_TRUSTED_ORIGINS option.

Caddy 2

Caddy does not change the headers by default, and should not need any further configuration.

If you still run into CSRF issues, please check out the LD_CSRF_TRUSTED_ORIGINS option.

Nginx

Nginx by default rewrites the Host header to whatever URL is used in the proxy_pass directive. To forward the correct headers to linkding, add the following directives to the location block of your Nginx config:

location /linkding {
    ...
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-Proto $scheme;
}

Instead of configuring header forwarding in your proxy, you can also configure the URL from which you want to access your linkding instance with the LD_CSRF_TRUSTED_ORIGINS option.

Managed Hosting Options

Self-hosting web applications still requires a lot of technical know-how and commitment to maintenance, in order to keep everything up-to-date and secure. This section is intended to provide simple alternatives in form of managed hosting solutions.

Documentation

Document Description
Options Lists available options, and describes how to apply them
Backups How to backup the linkding database
Troubleshooting Advice for troubleshooting common problems
How To Tips and tricks around using linking
Keyboard shortcuts List of available keyboard shortcuts
Admin documentation User documentation for the Admin UI
API documentation Documentation for the REST API

Browser Extension

linkding comes with an official browser extension that allows to quickly add bookmarks, and search bookmarks through the browser's address bar. You can get the extension here:

The extension is open-source as well, and can be found here.

Community

This section lists community projects around using linkding, in alphabetical order. If you have a project that you want to share with the linkding community, feel free to submit a PR to add your project to this section.

Acknowledgements + Donations

PikaPods

PikaPods has a revenue sharing agreement with this project, sharing some of their revenue from hosting linkding instances. I do not intend to profit from this project financially, so I am in turn donating that revenue. Big thanks to PikaPods for making this possible.

See the table below for a list of donations.

Source Description Amount Donated to
PikaPods Linkding hosting June 2022 - September 2023 $163.50 Internet Archive

JetBrains

JetBrains has previously provided an open-source license of IntelliJ IDEA for the development of linkding.

Development

The application is open source, so you are free to modify or contribute. The application is built using the Django web framework. You can get started by checking out the excellent Django docs. The bookmarks folder contains the actual bookmark application, siteroot is the Django root application. Other than that the code should be self-explanatory / standard Django stuff 🙂.

Prerequisites

  • Python 3.10
  • Node.js

Setup

Create a virtual environment for the application (https://docs.python.org/3/tutorial/venv.html):

python3 -m venv ~/environments/linkding

Activate the environment for your shell:

source ~/environments/linkding/bin/activate[.csh|.fish]

Within the active environment install the application dependencies from the application folder:

pip3 install -r requirements.txt -r requirements.dev.txt

Install frontend dependencies:

npm install

Initialize database:

mkdir -p data
python3 manage.py migrate

Create a user for the frontend:

python3 manage.py createsuperuser --username=joe [email protected]

Start the Node.js development server (used for compiling JavaScript components like tag auto-completion) with:

npm run dev

Start the Django development server with:

python3 manage.py runserver

The frontend is now available under http://localhost:8000

Tests

Run all tests with pytest:

pytest

Formatting

Format Python code with black, and JavaScript code with prettier:

make format

DevContainers

This repository also supports DevContainers: Open in Remote - Containers

Once checked out, only the following commands are required to get started:

Create a user for the frontend:

python3 manage.py createsuperuser --username=joe [email protected]

Start the Node.js development server (used for compiling JavaScript components like tag auto-completion) with:

npm run dev

Start the Django development server with:

python3 manage.py runserver

The frontend is now available under http://localhost:8000

linkding's People

Contributors

ab623 avatar acbgbca avatar andrewdolphin avatar bachya avatar bah0 avatar bohrium272 avatar clach04 avatar crahan avatar dependabot[bot] avatar fivefold avatar hugo-vrijswijk avatar hypebeast avatar jhauris avatar jonathan-s avatar kgh02017 avatar kzshantonu avatar livingwithhippos avatar mattofr avatar mckennajones avatar operepadia avatar pascaliske avatar pettijohn avatar plockaby avatar qiaohao9 avatar rithask avatar rogryza avatar sissbruecker avatar strubbl avatar tianheg avatar vitormarcal 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  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

linkding's Issues

Show URL if title is not available

If you add a bookmark and linkding fails to fetch title/description, the bookmark will be displayed as "None" in the list. I think URL should be displayed in such cases.

Screenshot_2021-01-11 linkding

Add archive/unarchive button to edit bookmark page

Feature request

Can you add an Archive button to the edit bookmark page?

Use case

i just bought an article on my todo list. while changing the tags from todo to bought i had to to Save my entry and Archiveit afterwards. An Archive or Save and archive button would be useful.

Vice versa there should be an button to Restore the link from the archive if the entry is already archived.

hidden feature request

You may want to change the title from Edit bookmark to Edit archived bookmark if you edit an archived bookmark,

Example

grafik

Enhancement: return to same page we were on after editing a bookmark

I am retrospectively trying to add tags to all my bookmarks. Once I reached page 2, edited a bookmark, and saved it, I was redirected back to the homepage (page 1). I'm having to manually go back to page 2 and edit the next bookmark.

A good UX would be to go back to the same page we were on before hitting the edit button.

minor ui nitpicks

Hi, first of all thank you for making linkding! I've been looking for a while for a selfhosted alternative to pinboard.in and I think I finally found one.

I just wanted to comment on two minor issues:

  1. The search bar and button on mobile don't look like they do on desktop, is this intentional? Because it doesn't look good in my opinion.
  2. Always on mobile, the hamburger menu can't be closed once it has been opened. I have to click on a link or on the search bar to hide it.

Thanks!

Add Favicon

I looked into creating a PR for this one, but I'm not sure how to go about it. The current project logo appears to be a Spectre link icon made in CSS, and I couldn't find any .svg or raster image version to make into a favicon.

This is a bit of a convenience feature, but it would definitely improve the overall look as I have mine pinned in the Bookmarks bar.

feature request: tag edit

Thank you for your great work. I found linkding was missing tag edit function. Could you can it. tks.

Improve admin utilization

Currently linkding provides no management UI of its own, however it comes with the default Django Admin which is quite powerful and could solve quite a few use cases. As such the admin panel should be linked from settings and be improved:

  • user management for adding accounts or changing password
  • auth token management to revoke auth tokens
  • bookmark view: ensure title is displayed
  • bulk operations on bookmarks (delete, archive, unarchive)
  • tag view: show how often the tag is used
  • bulk operations on tags (delete, delete unused)

Import does not import bookmark descriptions

Currently the import only imports bookmark titles, but ignores the optional description. I think the issue is that the loose Netscape HTML format makes it difficult to relate link elements (<a>) with description elements (<dd>) using the current HTML parser (BeautifulSoup).

Novice help.

Hello, I am a novice, how to deploy linkding to heroku, I tried several times, but failed, I hope the boss can provide a tutorial, thank you very much!

Add an API for backup / store data in pure text

It's nice that you considered the backups which is one of the very important component for a service.
But I have to idea for you to improve the user experience for backups.

  1. Add an API for backup. Then users could remotely do backups by calling this API.
  2. Store the data in pure text. If all data store in pure text, then everything can be backuped by regularly commit and push through VCS.

thank you and a chrome extension

Hello @sissbruecker, wanted to let you know I love linkding and I use it every day.

I put together a little Chromium extension for my preferred way of using Linkding, thought you'd might like to know about it. And possibly it will be of use to someone besides me :)

Keep up the great work!

API for app development

Hello,

Does linkding have API for developing browser extensions, desktop application etc. ?

Wayback Machine Integration

I think a really interesting feature for linkding to adapt would be an integration with Internet Archive (IA). I've looked into this myself, and got an almost working prototype, but run into an issue with response time and rate limiting of the IA API.

In short, I added an archive_url variable to each Bookmark and queried the https://web.archive.org/save/{bookmark.url} endpoint on creation. This would create a backup, and link to it in the response's Location header. However, as mentioned above, there were two issues:

  1. The response time of the archive API is quite slow and blocks the main thread until completion. This could potentially be solved with some sort of asynchronous request, but I'm not familiar enough with Django to know how to implement this.
  2. Though I was successful in making several requests to /save, there appears to be some sort of rate limiting and not very much information on how it works (that I could find).

Regardless, I think this is a really cool feature that I would definitely be interested in (implementing and using).

add an archive function

hi,
it would be cool if links could be archived an therefore not being shown in the main list.

use case
i like adding links which are

  • noteworthy
  • on my todo list

after finishing my task the links on my todo list should disappear from the main list while not being deleted. i still want to find them if i have to check on them later on.

behaviour
links can only be removed from the list. once removed, they are deleted and can never be found again

feature request
Add an button to archive a link. Archived links are shown in a seperate list. the tag list should remain the same but filter only on the archived links.

Bookmark view

  • you can switch to the Archive view
  • links can be Archived
  • search an tags work only for the main list

image

Archive view

  • you can switch back to the main Bookmarks view
  • links can be Restored to the main bookmark list
  • search an tags work only for the archived list

image

Option to create bookmarks public

Would it be possible to implement an option to have the bookmark display in a public list?

Say if you were to do to /public at the end of the url it would display a list of URLs that users have set as public when creating the bookmark. Probably not high on the todo list, but would be nice to see if possible 👍

Great bookmark software. Been using it for over a week now!

Import should scrape title and description from URL

Currently bookmarks automatically use the title + description from the website when added manually.

The same should also work when importing bookmarks. This would be easy to add, but might slow down the import immensely due to the high number or requests that need to be executed. Would have to check if that is acceptable or if this can be solved through async jobs/tasks or similar.

invalid request block size: 4243 (max 4096)...skip

Installed at Unraid but can't open WebUI. This is the log:

Operations to perform:
Apply all migrations: admin, auth, bookmarks, contenttypes, sessions
Running migrations:
No migrations to apply.
There is already a secret key in `secretkey.txt`
[uWSGI] getting INI configuration from uwsgi.ini
[uwsgi-static] added mapping for /static => static
*** Starting uWSGI 2.0.18 (64bit) on [Sun Sep 6 07:36:41 2020] ***
compiled with version: 6.3.0 20170516 on 07 June 2020 12:18:45

os: Linux-4.19.107-Unraid #1 SMP Sun Mar 8 14:34:03 CDT 2020
nodename: 86ee98549238
machine: x86_64
clock source: unix
detected number of CPU cores: 8
current working directory: /etc/linkding
writing pidfile to /tmp/linkding.pid
detected binary path: /usr/local/bin/uwsgi
!!! no internal routing support, rebuild with pcre support !!!
setgid() to 33
setuid() to 33
chdir() to /etc/linkding
your processes number limit is 123542
your memory page size is 4096 bytes
detected max file descriptor number: 40960
building mime-types dictionary from file /etc/mime.types...554 entry found
lock engine: pthread robust mutexes
thunder lock: disabled (you can enable it with --thunder-lock)
uWSGI http bound on :9090 fd 4
uwsgi socket 0 bound to TCP address 127.0.0.1:34187 (port auto-assigned) fd 3
Python version: 3.7.7 (default, May 20 2020, 21:22:20) [GCC 6.3.0 20170516]

Python main interpreter initialized at 0x55a85049e140
python threads support enabled
your server socket listen backlog is limited to 100 connections
your mercy for graceful operations on workers is 60 seconds
mapped 416720 bytes (406 KB) for 8 cores
*** Operational MODE: preforking+threaded ***
WSGI app 0 (mountpoint='') ready in 0 seconds on interpreter 0x55a85049e140 pid: 10 (default app)
*** uWSGI is running in multiple interpreter mode ***
spawned uWSGI master process (pid: 10)
spawned uWSGI worker 1 (pid: 11, cores: 2)
spawned uWSGI worker 2 (pid: 12, cores: 2)
spawned uWSGI worker 3 (pid: 14, cores: 2)
spawned uWSGI worker 4 (pid: 16, cores: 2)
*** Stats server enabled on 127.0.0.1:9191 fd: 18 ***
spawned uWSGI http 1 (pid: 18)
invalid request block size: 4211 (max 4096)...skip
[uwsgi-http key: 10.1.0.10:9090 client_addr: 10.1.0.100 client_port: 3026] hr_instance_read(): Connection reset by peer [plugins/http/http.c line 647]

Want to be compatible with PostgreSQL

I installed linkding manually and accessed top page, then linkding responded Server Error (500).
It seems to happen it when accessing https://example.com/bookmarks. When trying /bookmarks/new, /settings, /bookmarklet and /logout, linkding showed pages normally.
How can I fix this?

  • OS: Debian 10.2
  • Python: 3.7.6

Add an invitiation workflow

Currently there is no UI workflow to add new users to the system. The only options are creating new super-users using the Django script or enabling registration for a limited time. For self-hosted scenarios, it would make sense if the application would support invites. That would make it simple to add specific users (such as family members, friends, colleagues) without setting a password for them.

The workflow would look something like this:

  • Application provides a page + form to invite a new user per mail
  • User clicks on link in mail and lands on page / form where they can complete their registration details and set their password
  • Completing the form enables the account and the user is now able to login

Would need to consider if this needs to be behind a config flag or if the invite feature can be active all the time (for super users).

BUG: Search with tag is a bit broken

#typography is a valid tag, but I don't see it in search results:

image

But #typography, (notice the extra ,) returns the search:

image

Is that the intended behavior?

Enhancement: category and pagination

Firstly I want to thank you for this wonderful bookmark manager. It is just what I'm looking for.

Two suggestions you may consider:
1). Pagination. If someone happens to manage many bookmarks, that would be diserable.
2). Category. In addition to tags, category is still an effective way to organise bookmarks.

Thanks again!

Missing "description" request body parameter in API causes 500

Version: 1.3.1
Architecture: Docker

When I attempt to omit the description request body parameter in the POST /api/bookmarks/ API call, I get a 500 response. The API should either instruct me to include this field or gracefully handle its absence.

Make tags case-insensitive

hi,
first of all, i really like your service and get used to it.

behaviour
tags are case-sensitive. but due to the highlight/capitalization the first letter is uppercase while the tag itself maybe not. having the same tag lower-case and capitalized shows the tag also twice.

image

expected behaviour
tags should be case-insensitive. this would

  • show the same tag only once
  • make tagging easier especially when on mobile

Database locked

I've just installed Linkding for Docker with permanent storage, but I can create user, or login, I get the following error :
Traceback (most recent call last):
File "/usr/local/lib/python3.7/site-packages/django/db/backends/base/base.py", line 240, in _commit
return self.connection.commit()
sqlite3.OperationalError: database is locked

Add a dark mode

It would be nice if this included a dark mode.

I will likely PR this at some point (since it's the one thing between now and me using linkding), though I'm not familiar with Django so we'll see~
Otherwise I could skip making it a config setting and just do it in CSS (using prefers-color-scheme)... what would be preferred here?

Error importing bookmarks

Running in a docker from hub.docker.com:
sissbruecker/linkding:latest | pulled on 2020-04-07 15:16:52

I can't seem to get the import to work. I've tried exporting from Firefox and Chrome, but always the same error:
An error occurred during bookmark import.

Any pointers to enabling error logs on the docker instance? If I was running the dev setup, I would enable the debug logs in django settings, but want to avoid that, if possible and keep it within docker.

Enhancement: let user configure to open links in same tab instead on a new window/tab

My use-case: I use my linkding site as the default new tab page. I would like to quickly search and open a link in the same tab.

Currently, clicking a link opens a new tab and I'm left with the new tab that I had opened with linkding, as well as the actual link I wanted to open in another new tab.

This actually involves two facets once a user configures these:

  1. autofocus on the linkding search bar
  2. update the target values on the linkding bookmark entries to open in current tab

Enhancement: add archive funcitonality

I love this app.

If you can support archive, it would be even nice.

The motivation is obvious, cleanup interesting but not oftenly used stuffs.
Though bookmarks can be recovered by tag filtering or searching.

Unused tags still get suggested after no longer being attached to any bookmarks

I don't quite know if this is intended behavior (it might be?) but the suggest box when editing bookmarks suggests every tag ever used rather than just tags that are currently in use. This is kind of a pain if you accidentally saved something with a tag that had a typo, or imported a batch of bookmarks that had tags you don't wish to use.

Search autocomplete

Add an auto-complete component that provides suggestions for searches:

  • Tags
  • Recent searches
  • Bookmarks

/archive and /unarchive API routes return 404

Version: 1.3.1
Architecture: Docker

I'm hosting linkding behind Traefik. I've confirmed that all API endpoints work with my host/token. The exceptions are POST /api/bookmarks/<id>/archive/ and POST /api/bookmarks/<id>/unarchive/, both of which return 404 responses when I query them:

Archive

Request:

POST /api/bookmarks/1/archive/ HTTP/1.1
Authorization: Token REDACTED
Host: REDACTED
Connection: close
User-Agent: Paw/3.2.2 (Macintosh; OS X/11.2.1) GCDHTTPRequest
Content-Length: 0

Response:

HTTP/1.1 404 Not Found
Content-Length: 77
Content-Type: text/html
X-Frame-Options: SAMEORIGIN
Date: Thu, 18 Feb 2021 01:06:19 GMT
Connection: close

<h1>Not Found</h1><p>The requested resource was not found on this server.</p>

Unarchive

Request:

POST /api/bookmarks/1/unarchive/ HTTP/1.1
Authorization: Token REDACTED
Host: REDACTED
Connection: close
User-Agent: Paw/3.2.2 (Macintosh; OS X/11.2.1) GCDHTTPRequest
Content-Length: 0

Response:

HTTP/1.1 404 Not Found
Content-Length: 77
Content-Type: text/html
X-Frame-Options: SAMEORIGIN
Date: Thu, 18 Feb 2021 01:06:19 GMT
Connection: close

<h1>Not Found</h1><p>The requested resource was not found on this server.</p>

Improve Netscape bookmarks file parsing

Currently linkding uses the beautiful-soup library to parse import files. Since the format is missing closing tags in many places this leads to a high number of nested tags / recursion when parsing the files. This leads to errors when parsing files with a large number of bookmarks.

I plan to replace beautiful-soup with a custom parser that does not have the nesting issue.

Add Lotus Notes links

Hello,

I am trying to setup linkding to use it with Lotus Notes.

I want to add Lotus Notes Document links as bookmarks.
Unfortunately its not possible.

A notes url/link looks like this:
notes://NOTESSERVER.SUBDMAIN.DOMAIN.COM/C12H9BF2F0261BDA/7B18866DH/THGUJZC1257D330032D158/0807E72E8A1D1B52C12585G/HFZ&RUZG

If you open this link, it redirects you to the document in Lotus Notes.
Would that be possible to add?

Enhancement: detect duplicates at entry time

Thanks for this great app. Perfect for managing a bunch of bookmarks.

What do you think about a warning/message when trying to bookmark a page that's already bookmarked? If that sounds good, give me a couple pointers and I'll give you a PR.

Increase limit on bookmark URL length

I tried to add a URL but got:

Ensure this value has at most 200 characters (it has 265).

This seems pretty low as clean URLs even without tracking/marketing parameters can often go beyond 200 chars. No such complaint was made for any link at the time of import so it does seem to work (or does it trim such URLs while importing?)

Would request for an increased limit on bookmark URL length.

Archived bookmarks - no result when searching for a word which is used only as tag

Actual behavoiour

If you search the archive for a word which is used as Tag but not in the Title or Description the Tag is shown in the Tags list but not in the results.

Archive

Before search: There is an entry where the search term matches a Tag.

grafik

Search result

No results but an entry in the Tags list.

grafik

Expected behaviour

As in the normal (unarchived) bookmarks list the result should be shown if a searchterm matches a Tag.

grafik

Tag generation when importing

I just discovered linkding, and think it may be what I've been hoping for, except for one issue.

Is there a way to get it to turn bookmark folder names into tags when importing?

That is, if I have a bookmark like this stored three folders deep...

Cars > Restoration > Paint > http://example.com/howtopaintcars

...I'd like to have it automatically tagged Cars, Restoration and Paint.

I have a couple thousand bookmarks to import, so bringing them in without tags is unworkable, as is manual tagging.

This approach wouldn't be perfect in all cases, but would retain much of the organization I've already established.

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.