├── tests ├── __init__.py └── test_json.py ├── Procfile ├── nofussbm ├── static │ ├── robots.txt │ ├── favicon.ico │ ├── flattr-badge-large.png │ ├── forkme_right_darkblue_121621.png │ ├── jquery.cookie.js │ ├── html5.js │ ├── jquery.ba-bbq.min.js │ ├── bootstrap-modal.js │ ├── jquery.tablesorter.min.js │ └── bootstrap.min.css ├── debug.py ├── templates │ ├── list-content.html │ ├── uibase.html │ ├── base.html │ ├── options.html │ ├── list.html │ └── signup.html ├── helpers.py ├── json.py ├── tags.py ├── __init__.py └── api.py ├── .slugignore ├── extension ├── icon128.png ├── icon16.png ├── icon19.png ├── icon48.png ├── manifest.json ├── getinfo.js ├── options.html ├── options.js ├── popup.html └── popup.js ├── scripts ├── setenv ├── getenv ├── mongo ├── mongodump ├── logs ├── json_diff └── cli_client ├── .github └── FUNDING.yml ├── requirements.txt ├── .hgignore ├── wrapper.sh ├── .gitignore ├── README.md ├── CHANGELOG.txt └── LICENSE.txt /tests/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Procfile: -------------------------------------------------------------------------------- 1 | web: ./wrapper.sh 2 | 3 | -------------------------------------------------------------------------------- /nofussbm/static/robots.txt: -------------------------------------------------------------------------------- 1 | User-agent: * 2 | Allow: / 3 | -------------------------------------------------------------------------------- /.slugignore: -------------------------------------------------------------------------------- 1 | extension 2 | scripts 3 | README.rst 4 | LICENSE.txt 5 | CHANGELOG.txt 6 | -------------------------------------------------------------------------------- /extension/icon128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mapio/nofussbm/HEAD/extension/icon128.png -------------------------------------------------------------------------------- /extension/icon16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mapio/nofussbm/HEAD/extension/icon16.png -------------------------------------------------------------------------------- /extension/icon19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mapio/nofussbm/HEAD/extension/icon19.png -------------------------------------------------------------------------------- /extension/icon48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mapio/nofussbm/HEAD/extension/icon48.png -------------------------------------------------------------------------------- /scripts/setenv: -------------------------------------------------------------------------------- 1 | eval $(sed 's/\(.*\)=\(.*\)/export \1="\2"/' < ./.env) 2 | export PYTHONPATH=. -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: [mapio] 4 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | Flask==1.0.2 2 | Flask-PyMongo==2.1.0 3 | gunicorn==19.9.0 4 | pymongo==3.7.2 5 | -------------------------------------------------------------------------------- /nofussbm/debug.py: -------------------------------------------------------------------------------- 1 | from . import app 2 | 3 | def _run(): 4 | app.run( debug = True, use_reloader = False ) -------------------------------------------------------------------------------- /nofussbm/static/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mapio/nofussbm/HEAD/nofussbm/static/favicon.ico -------------------------------------------------------------------------------- /.hgignore: -------------------------------------------------------------------------------- 1 | syntax: glob 2 | 3 | *.log 4 | *.pem 5 | *.json 6 | .env* 7 | packed 8 | local 9 | TODO.txt 10 | .git 11 | -------------------------------------------------------------------------------- /nofussbm/static/flattr-badge-large.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mapio/nofussbm/HEAD/nofussbm/static/flattr-badge-large.png -------------------------------------------------------------------------------- /nofussbm/static/forkme_right_darkblue_121621.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mapio/nofussbm/HEAD/nofussbm/static/forkme_right_darkblue_121621.png -------------------------------------------------------------------------------- /scripts/getenv: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | heroku config --app nofussbm -s | egrep '(MONGOLAB_URI|SECRET_KEY|SENDGRID_PASSWORD|SENDGRID_USERNAME)' > .env 4 | -------------------------------------------------------------------------------- /scripts/mongo: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | 3 | from os import environ 4 | from urlparse import urlparse 5 | 6 | up = urlparse( environ['MONGOLAB_URI'] ) 7 | 8 | print 'mongo -u {} -p {} {}:{}{}'.format( up.username, up.password, up.hostname, up.port, up.path ) 9 | -------------------------------------------------------------------------------- /nofussbm/templates/list-content.html: -------------------------------------------------------------------------------- 1 | {% for bm in bookmarks %} 2 |
94 | {% for tag, count in top_tags[ : 100 ] %} 95 | {{ tag }} {{ count|int }} 96 | {% endfor %} 97 |
98 | {% endif %} 99 | {% endblock %} 100 | 101 | {% block content %} 102 |
29 |
30 | No Fuss Bookmarks is a very simple software and service to store 35 | bookmarks especially designed for hackers (that don't need fancy interfaces, but nice 36 | API).
37 |The software is a simple RESTful 38 | server, written using Flask, providing a CRUD interface to a mongoDB store, plus a very basic Google 41 | Chrome extension to submit bookmarks. The code is released under the GPL and available from GitHub.
44 |The service is just an incarnation of such software hosted by heroku 45 | and mongolab that you can freely use just submitting your email below to obtain your 46 | API key.
47 | If you like this, please consider making a small donation
48 | 
Install the No Fuss 76 | Bookmark Chrome extension that will, by default, use this server as a backend.
77 | Attention After installing it, point your Chrome browser at
78 | chrome://settings/extensionSettings and, follow the "Option" link of the extension, enter the API key you
79 | got submitting your email in the above form.
If you want to use an alternate server (and API key), you must download the extension source code and edit it 81 | accordingly, than you can install it following for instance this instructions.
83 | Point your browser at http://nofussbm.herokuapp.com/<EMAIL>, where <EMAIL> is
91 | your email, to get a list of all your bookmarks as a (tab separated) text file (that you can, for instance, conveniently
92 | grep, or sort); moreover you can set an alias if your email is just too long (see the API section for instructions).
You can optionally filter such list by tag and/or title adding to the above URL a (suitably encoded) query string with the field tags having as value a
97 | (comma separated list) of tags that will all match, and/or the field title having as value a string that
98 | will match as a (case insensitive) substring.
Attention All bookmarks are public, anyone with your email can 100 | get your bookmarks. For instance, you can see a list of all my bookmarks, 101 | or just the one tagged with Python.
102 |Important You can easily export your bookmarks from the now fussy Delicious and import them here! See the API section for 111 | instructions.
112 |The API are so simple that you can perform all the CRUD operations from the command line, using simple tools such 122 | as, for instance, cURL.
123 | Assume that KEY contains your API key (for instance, the one you got submitting your email in the above
124 | form), URL contains the API endpoint (that is http://nofussbm.herokuapp.com/api/v1/ if you
125 | use this server as a backend), and the bm.json file contains the following JSON representation of a bookmark
[{
128 | "title": "mapio/nofussbm - GitHub",
129 | "url": "https://github.com/mapio/nofussbm",
130 | "tags": "flask,mongodb,python,bookmarks"
131 | }]
132 | Them, you can create such a bookmark by the following command
133 |curl -X POST -d @bm.json -H "Content-type: application/json" -H "X-Nofussbm-Key: $KEY" $URL134 |
Hence, you can read your bookmarks (and record them in the bms.json file) using
curl -H "Content-type: application/json" -H "X-Nofussbm-Key: $KEY" $URL > bms.json136 |
If the store was initially empty and you added just bm.json, then bms.json will contain
137 |
[{
138 | "date-added": "2011-11-24 21:33:50.290000",
139 | "id": "4eceb83e57ae478fc5000000",
140 | "tags": "flask,mongodb,python,bookmarks",
141 | "title": "mapio/nofussbm - GitHub",
142 | "url": "https://github.com/mapio/nofussbm"
143 | }]
144 | If you want, you can edit bms.json and then update (matching bookmarks by id) the store with
curl -X PUT -d @bms.json -H "Content-type: application/json" -H "X-Nofussbm-Key: $KEY" $URL146 |
Finally, you can delete bookmarks (matching the id) in bms.json with
curl -X DELETE -d @bms.json -H "Content-type: application/json" -H "X-Nofussbm-Key: $KEY" $URL148 |
Important You can import your Delicious bookmarks as follows: first, export them from their site and you should get
151 | an HTML file (usually named delicious.html) containing a sequence of lines of the form
<DT><A HREF="[url]" ADD_DATE="[timestamp]" PRIVATE="[0|1]" TAGS="[tags]">[title]</A>153 |
Then, import it (preserving all the information except for the PRIVATE field) as simply as
curl -T delicious.html -H "X-Nofussbm-Key: $KEY" ${URL}import
155 | If you feel that your email is too long, or you want to post somewhere the list of your bookmarks without reveailng 156 | your identity, you can setup an alias as follows
157 |curl -X POST -H "X-Nofussbm-Key: $KEY" ${URL}setalias/<YOUR_ALIAS>
158 | where <YOUR_ALIAS> is any word of your choice (look at the answer to see if, in case of
159 | duplicates, your request wasnt satisfyed).