Add README, fix license, add querysheet
All checks were successful
continuous-integration/drone/push Build is passing
All checks were successful
continuous-integration/drone/push Build is passing
This commit is contained in:
parent
fdb8544b30
commit
7fa31575f9
7 changed files with 105 additions and 13 deletions
2
LICENSE
2
LICENSE
|
@ -1,4 +1,4 @@
|
||||||
MIT License Copyright (c) <year> <copyright holders>
|
MIT License Copyright (c) 2020 Armin Friedl <dev@friedl.net>
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
|
76
README.md
76
README.md
|
@ -1,3 +1,75 @@
|
||||||
# snip
|
# Snip
|
||||||
|
[![Build Status](https://drone.friedl.net/api/badges/incubator/snip/status.svg)](https://drone.friedl.net/incubator/snip)
|
||||||
|
|
||||||
Self-hosted, url-based redirection service
|
No-fuzz link shortener.
|
||||||
|
|
||||||
|
![Snip Screenshot](snip_screen.png)
|
||||||
|
|
||||||
|
## Getting started
|
||||||
|
Snip is a self-hosted link shortener. It provides an API and a web interface.
|
||||||
|
Dependencies are managed with [pipenv](https://pipenv.pypa.io/en/latest/) and
|
||||||
|
[npm](https://www.npmjs.com/). Snip runs on
|
||||||
|
[flask](https://flask.palletsprojects.com/) the frontend is assembled with
|
||||||
|
[webpack](https://webpack.js.org/). All this is rather simple in practice.
|
||||||
|
|
||||||
|
### Run from docker
|
||||||
|
The simplest way to get started is to run snip from the regularily [published
|
||||||
|
docker containers](https://hub.docker.com/repository/docker/arminfriedl/snip).
|
||||||
|
|
||||||
|
```shell
|
||||||
|
docker run -p5000 arminfriedl/snip:latest
|
||||||
|
```
|
||||||
|
|
||||||
|
Then navigate your browser to http://localhost:5000. Alternatively, you can also
|
||||||
|
query the REST API. For an example see the [querysheet.http](querysheet.http) in
|
||||||
|
this repository. If you want to run it manually you can also install snip and
|
||||||
|
its dependencies yourself.
|
||||||
|
|
||||||
|
### Install Dependencies
|
||||||
|
To install the dependencies for snip, you need
|
||||||
|
[pipenv](https://pipenv.pypa.io/en/latest/) and [npm](https://www.npmjs.com/)
|
||||||
|
installed on your system. Then run:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
pipenv install --dev
|
||||||
|
npm install --dev
|
||||||
|
```
|
||||||
|
|
||||||
|
### Build Snip
|
||||||
|
The snip backend itself needs no separate build step. However, the frontend
|
||||||
|
needs to be assembled by webpack.
|
||||||
|
|
||||||
|
|
||||||
|
```shell
|
||||||
|
# Run a development build with continuous update
|
||||||
|
npm run watch
|
||||||
|
|
||||||
|
# Run a production build
|
||||||
|
npm run publish
|
||||||
|
```
|
||||||
|
|
||||||
|
### Run Snip
|
||||||
|
From the repository root run:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
export FLASK_ENV=production # or development
|
||||||
|
export FLASK_APP=snip
|
||||||
|
|
||||||
|
pipenv run flask run
|
||||||
|
```
|
||||||
|
|
||||||
|
Flask will tell you where you can reach snip, per default http://localhost:5000.
|
||||||
|
|
||||||
|
# Contribute
|
||||||
|
If you want to contribute to `snip` feel free to send patches to
|
||||||
|
dev[at]friedl[dot]net. Alternatviely, you can issue a pull request on GitHub
|
||||||
|
which will be cherry picked into my tree. If you plan significant long-term
|
||||||
|
contributions drop me a mail for access to the incubator repository.
|
||||||
|
|
||||||
|
# Github Users
|
||||||
|
If you are visiting this repository on GitHub, you are on a mirror of
|
||||||
|
https://git.friedl.net/incubator/snip. This mirror is regularily updated
|
||||||
|
with my other GitHub mirrors.
|
||||||
|
|
||||||
|
Like with my other incubator projects, once I consider `snip` reasonable
|
||||||
|
stable the main tree will move to GitHub.
|
||||||
|
|
25
TODO.org
25
TODO.org
|
@ -1,19 +1,28 @@
|
||||||
#+TODO: TODO NEXT HOLD | DONE CANCELLED
|
#+TODO: TODO NEXT HOLD | DONE CANCELLED
|
||||||
|
|
||||||
* URL Shortener [22%]
|
* URL Shortener [57%]
|
||||||
** DONE Landing Page Endpoint
|
** DONE Landing Page Endpoint
|
||||||
CLOSED: [2020-10-25 Sun 04:50]
|
CLOSED: [2020-10-25 Sun 04:50]
|
||||||
** DONE Snip Endpoint
|
** DONE Snip Endpoint
|
||||||
CLOSED: [2020-10-25 Sun 05:22]
|
CLOSED: [2020-10-25 Sun 05:22]
|
||||||
** TODO Shorten URL
|
** DONE Shorten URL
|
||||||
** TODO Save Shortened URLs
|
CLOSED: [2020-11-06 Fri 00:48]
|
||||||
** TODO Unsnip Shortened URLs
|
** DONE Save Shortened URLs
|
||||||
** TODO Landing Page Template
|
CLOSED: [2020-11-06 Fri 00:48]
|
||||||
** TODO Rediret
|
** DONE Unsnip Shortened URLs
|
||||||
|
CLOSED: [2020-11-06 Fri 00:48]
|
||||||
|
** DONE Landing Page Template
|
||||||
|
CLOSED: [2020-11-06 Fri 00:48]
|
||||||
|
** DONE Redirect
|
||||||
|
CLOSED: [2020-11-06 Fri 00:48]
|
||||||
** TODO Stats Endpoint
|
** TODO Stats Endpoint
|
||||||
** TODO Store Stats
|
** TODO Store Stats
|
||||||
** TODO Stats Template
|
** TODO Stats Template
|
||||||
** TODO Externalize config
|
** TODO Externalize config
|
||||||
** TODO Deploy script
|
** DONE Deploy script
|
||||||
** TODO Improvement: Pronouncable short urls
|
CLOSED: [2020-11-06 Fri 00:49]
|
||||||
|
** HOLD Improvement: Pronouncable short urls
|
||||||
with markov chain?
|
with markov chain?
|
||||||
|
see womblies
|
||||||
|
|
||||||
|
** TODO Better persistence concept
|
||||||
|
|
|
@ -18,7 +18,7 @@
|
||||||
"build_scss": "node-sass --include-path node_modules/foundation-sites/scss --include-path node_modules/motion-ui/src -o snip/static snip/templates",
|
"build_scss": "node-sass --include-path node_modules/foundation-sites/scss --include-path node_modules/motion-ui/src -o snip/static snip/templates",
|
||||||
"build_webpack": "webpack --config webpack.dev.js",
|
"build_webpack": "webpack --config webpack.dev.js",
|
||||||
"watch": "npm-watch",
|
"watch": "npm-watch",
|
||||||
"publish": "node-sass --include-path node_modules/foundation-sites/scss -o snip/static snip/templates && webpack --config webpack.prod.js"
|
"publish": "node-sass --include-path node_modules/foundation-sites/scss --include-path node_modules/motion-ui/src -o snip/static snip/templates && webpack --config webpack.prod.js"
|
||||||
},
|
},
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
|
|
11
querysheet.http
Normal file
11
querysheet.http
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
:host = http://localhost:5000
|
||||||
|
|
||||||
|
# Create a new shortlink
|
||||||
|
POST :host/api/snip
|
||||||
|
-> jq-set-var :snip .snip
|
||||||
|
{
|
||||||
|
"url": "https://example.com"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Unsnip shortlink
|
||||||
|
GET :host/api/:snip
|
|
@ -38,7 +38,7 @@ def snip():
|
||||||
return {"url": url, "snip": snip}
|
return {"url": url, "snip": snip}
|
||||||
|
|
||||||
|
|
||||||
@app.route("/api/unsnip/<snip>", methods=['GET'])
|
@app.route("/api/<snip>", methods=['GET'])
|
||||||
def unsnip(snip):
|
def unsnip(snip):
|
||||||
url = snipper.unsnip(snip)
|
url = snipper.unsnip(snip)
|
||||||
if not url:
|
if not url:
|
||||||
|
|
BIN
snip_screen.png
Normal file
BIN
snip_screen.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 36 KiB |
Loading…
Reference in a new issue