Minimalistic bookmark manager for your own server written in PHP. Bookmarks are stored in a sqlite database.

Overview

b - Bookmark manager

b is a minimalistic bookmark manager for your own server. Written in PHP. Bookmarks are stored in a sqlite database. Features:

  • filtering
  • tagging
  • automatic fetching of page title
  • infinite scrolling (optional)
  • bookmarklet
  • multiple users

Requirements

  • make
  • docker + docker compose

Tested on Ubuntu 21.04 and macOS Big Sur.

Setup

This web app uses HTTP basic auth password protection. Create a htusers file and specify username/password like this:

mkdir db
./htpasswd -c db/htusers peter

The bookmark manager can host multiple databases. To initialize a new database, simply create a subdirectory:

mkdir db/peter

This will make bookmarks accessible via http://localhost:9090/peter.

Use make to start the webserver container and make down to stop it.

To prevent forking the container into the background, use make up instead of make (useful for debugging).

How to use

  • To add a new bookmark, simply paste it into the input field and press return. the url may be followed by hash tags, e.g. http://example.com #example #bla #wurst
  • The website's title is automatically fetched and the bookmark is added to the database.
  • Edit title by double clicking it. This opens a prompt-dialog where you can edit the title. Enter '-' (minus sign) to remove an entry.
  • To edit the URL, double click beside the link.
  • The input field can also be used to filter bookmarks. Filtering is done with a full-text search on all titles. Search terms are separated by spaces and joined with AND.

Infinite scrolling

If you have a massive amount of bookmarks and you don't want to load them all at once, you can activate infinite scrolling. This will load a limited amount of bookmarks initially and load more when you scroll to the bottom of the page. Activate infinite scrolling by adding INFINITE_SCROLLING=200 to .env. Replace 200 with the number of bookmarks you want to load each time you hit the bottom.

Bookmarklet

Visit /[user]/bookmarklet to access the user's bookmarklet, e.g. http://bookmarks.example.com/peter/bookmarklet. (Thanks to nibreh for the suggestion!)

Credits

Copyright (c) 2011-2021 Sebastian Volland http://github.com/sebcode

The source code is licensed under the terms of the MIT license (see LICENSE file).

Comments
  • File not found

    File not found

    I'm trying to setup B on a remote server through ftp. The site should run in a subdomain. http://testing.meplaza.nl/index.php?configtest gives an 'OK', but going trying to access the site results in 'Page not found.' How to fix this?

    opened by sjev 3
  • Pagination

    Pagination

    How about to add a pagination system ?

    For example, in config.php, we can choose how much link we want to display. Maybe this can be useful when there are many links to display. But I don't know if it's necessary or possible and simple to do.

    opened by nibreh 2
  • I don't think it's a good idea to define the namespace in index.php

    I don't think it's a good idea to define the namespace in index.php

    https://github.com/sebcode/b/blob/29584190cb3a7c079e9c6b80e904669b6e68abcf/htdocs/index.php#L3

    technically it probably works.

    but up to now, I've only seen the namespace used where the functions and classes are defined, not where they are used.

    not a big issue, but that did let me wonder what was going on...

    this will probably be my last ticket for now. b now works on my computer and i will upload it to my server and start using it. thanks for sharing your code!

    opened by aoloe 1
  • no need to cast getenv to string

    no need to cast getenv to string

    https://github.com/sebcode/b/blob/29584190cb3a7c079e9c6b80e904669b6e68abcf/src/BookmarkManager.php#L17

    getenv() alway returns a string or false.

    since you're checking for false, there is no use for the cast.

    opened by aoloe 1
  • getConfig() cannot return false

    getConfig() cannot return false

    https://github.com/sebcode/b/blob/29584190cb3a7c079e9c6b80e904669b6e68abcf/htdocs/index.php#L55

    as it is currently defined, getConfig() will return a string or a null value.

    opened by aoloe 1
  • returning mixed crashes in (at least) php 7.4.26

    returning mixed crashes in (at least) php 7.4.26

    https://github.com/sebcode/b/blob/29584190cb3a7c079e9c6b80e904669b6e68abcf/src/BookmarkManager.php#L85

    returning mixed crashes for me in (at least) php 7.4.26

    i guess that if you want to use types, you should rather use:

    public function getConfig(string $key): ?string
    

    this will work as long as -- i think to understand -- the configs are done by putenv, which will always return a string (or false... but you're catching that branch in putenv())

    opened by aoloe 1
  • bookmarklet.php reads a config.php which is supposed to be in htdocs

    bookmarklet.php reads a config.php which is supposed to be in htdocs

    https://github.com/sebcode/b/blob/29584190cb3a7c079e9c6b80e904669b6e68abcf/htdocs/bookmarklet.php#L3

    bookmarklet.php reads a config.php which is supposed to be in htdocs:

    • i would avoid to require a config.php to be in htdocs. i would read it from __DIR__/../conf/, instead
    • i could not find in the documentation how config.php should look like...
    opened by aoloe 1
  • Added possibility of searching a combination of multiple tags

    Added possibility of searching a combination of multiple tags

    Changed WHERE clause in DB.php to select a combination of tags using multiple AND clauses.

    This makes it possible to search tags independently of their order in the desc-column. With this patch it is possible to use tags like subcategories.

    Thank You for this nice little project!

    opened by edgar79 1
  • Bookmarklet feature

    Bookmarklet feature

    HI! Very nice app, I like the minimalism !

    A bookmarklet will be nice, what do you think about ?

    For now I use this trick: http://codepen.io/Realto619/pen/RPGaVd

    Juh

    opened by nibreh 1
  • Hashtag list

    Hashtag list

    Hello @sebcode ,

    I just implemented a list of the used hashtags - sorted by alphabet or count number. Additionally I added a redirect e.g. from /b/ to the authenticated users folder /b/username.

    best regards, edgar79

    opened by edgar79 0
Owner
Sebastian Volland
Independent full stack software consultant. Creator of macOS app freezeapp.net.
Sebastian Volland
Your visual bookmark manager

Colllect Introduction Colllect is your new bookmark manager! With it, you can manage your inspiration and resources into colllections. Go to Colllect

Colllect 336 Jan 4, 2023
YCOM Impersonate. Login as selected YCOM user 🧙‍♂️in frontend.

YCOM Impersonate Login as selected YCOM user in frontend. Features: Backend users with admin rights or YCOM[] rights, can be automatically logged in v

Friends Of REDAXO 17 Sep 12, 2022
Simple user settings facade for Hyperf. Settings are stored as JSON in a single database column, so you can easily add it to an existing table.

hyperf-user-settings Simple user settings util for hyperf Settings are stored as JSON in a single database column, so you can easily add it to an exis

lysice 1 Oct 15, 2021
Sample application to bookmark links, where interface build with Angular.js + Twitter Bootstrap and server powered by PHP with Slim Framework

RESTful Bookmarks PHP Slim TODO: review and update FrontEnd Sample application to bookmark links, where interface build with Angular.js + Twitter Boot

Erko Bridee 50 Dec 15, 2021
Your self-hosted bookmark archive. Free and open source.

Your self-hosted bookmark archive. Free and open source. Contents About LinkAce Support Setup Contribution About LinkAce LinkAce is a self-hosted arch

Kevin Woblick 1.7k Jan 2, 2023
Ip2region is a offline IP location library with accuracy rate of 99.9% and 0.0x millseconds searching performance. DB file is ONLY a few megabytes with all IP address stored. binding for Java,PHP,C,Python,Nodejs,Golang,C#,lua. Binary,B-tree,Memory searching algorithm

Ip2region是什么? ip2region - 准确率99.9%的离线IP地址定位库,0.0x毫秒级查询,ip2region.db数据库只有数MB,提供了java,php,c,python,nodejs,golang,c#等查询绑定和Binary,B树,内存三种查询算法。 Ip2region特性

Lion 12.6k Dec 30, 2022
A curated list of awesome Laravel bookmarks, packages, tools, articles, tutorials and related resources.

ATTENTION: This list is obsolete and discontinued. Please find a much more comprehensive, much more well-maintained awesome-laravel list at chiraggude

Unnawut Leepaisalsuwanna 96 Aug 5, 2022
🔖 Bookmark app for Nextcloud

Nextcloud Bookmarks Bookmarks app for Nextcloud This app provides you with a web interface for collecting and organizing bookmarks to the places on th

Nextcloud 803 Jan 8, 2023
Magento 2 Grid Colors module for colorizing admin grids. Supports saving of states with the help of grid's bookmarks.

Magento 2 Grid Colors Overview The module adds extra coloring features to admin grids at the Sales section. With help of this module, it is possible t

Dmitry Shkoliar 58 Dec 8, 2022
Integrates the ClassicPress Plugin Directory and any plugin stored in GitHub (tagged with classicpress-plugin) in the ClassicPress Admin

ClassicPress Plugin Directory Adds a new screen in a ClassicPress Install where you can browse, install, activate, deactivate, update, delete and pagi

TukuToi 3 Dec 27, 2022
This project processes a small database with php all on a web server. This project uses XAMPP to run the web server and the database.

PHP-introduction This project processes a small database with php all on a web server. This project uses XAMPP to run the web server and the database.

Tyler Jacques 1 Jan 6, 2022
A minimalistic implementation of Promises for PHP

libPromise A minimalistic implementation of Promises for PHP. Installation via DEVirion Install the DEVirion plugin and start your server. This will c

null 8 Sep 27, 2022
You have just downloaded "Messenger-app" [A lightweight, minimalistic real-time chat application]

MESSENGER-APP You have just downloaded "Messenger-app" [A lightweight, minimalistic real-time chat application] Setup To get it working, follow these

Chr1st0ph3r SAB 1 Oct 29, 2021
An extension that enables the SQLite DB

SQLite on MediaWiki This extension is based on a WIP in the WMF’s gerrit. How to use it Put the following in your composer.local.json: { "require": {

MediaWiki Stakeholders 0 Jul 15, 2019
Minimalistic Light colour scheme for PhpStorm

A minimalistic light colour scheme for PhpStorm If you need convincing of a light colour scheme, I'd like to direct you to a post on the topic. Colour

Brent Roose 269 Dec 24, 2022
Laravel Podcast Manager is a complete podcast manager package for Laravel 5.3+ that enables you to manage RSS feeds for your favorite podcasts and listen to the episodes in a seamless UI.

laravelpodcast | A Laravel podcast manager package - v0.0.8 Introduction Laravel Podcast Manager is a complete podcast manager package for Laravel 5.3

Jeremy Kenedy 22 Nov 4, 2022
Download this Plugin and you will have Hive MC server in your own!

Your-Own-Hive Version: v1.9.0 Murder Mystery Update Next Update: Survival Games This Plugin has all the essentials with HiveMC! Updates Every Day! Pla

null 16 Sep 9, 2022
An amazing Rank and Permissions Manager. The best ranks manager for PocketMine-MP.

?? RankSystem ?? An amazing Rank and Permissions Manager Description: An amazing Rank and Permissions Manager. The best ranks manager for PocketMine-M

null 22 Nov 7, 2022
Laragon MultiPHP per App + PECL Module + Extension manager + Ini Manager

LMPA Laragon MultiPHP per App This tools allow you to run multiple PHP version per app with Laragon, so you can have multiple site running different p

Gilbert Paquin 8 Oct 10, 2022