{"id":24769096,"url":"https://github.com/sayoun/kort","last_synced_at":"2026-05-01T18:31:36.703Z","repository":{"id":62574586,"uuid":"95896245","full_name":"sayoun/kort","owner":"sayoun","description":"Kort is a URL-Shortener API written in python using Flask and SQLAlchemy","archived":false,"fork":false,"pushed_at":"2017-06-30T23:29:26.000Z","size":12,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-09-28T09:22:18.129Z","etag":null,"topics":["api","flask","python","url-shortener"],"latest_commit_sha":null,"homepage":"","language":"Python","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/sayoun.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGES.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2017-06-30T14:30:19.000Z","updated_at":"2020-05-13T04:02:04.000Z","dependencies_parsed_at":"2022-11-03T17:45:43.008Z","dependency_job_id":null,"html_url":"https://github.com/sayoun/kort","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/sayoun/kort","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sayoun%2Fkort","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sayoun%2Fkort/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sayoun%2Fkort/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sayoun%2Fkort/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/sayoun","download_url":"https://codeload.github.com/sayoun/kort/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sayoun%2Fkort/sbom","scorecard":{"id":802348,"data":{"date":"2025-08-11","repo":{"name":"github.com/sayoun/kort","commit":"9a2ccd4f805d54a543871ffba42bba38863d8840"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3,"checks":[{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"SAST","score":0,"reason":"no SAST tool detected","details":["Warn: no pull requests merged into dev branch"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Code-Review","score":0,"reason":"Found 0/4 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}}]},"last_synced_at":"2025-08-23T10:50:20.427Z","repository_id":62574586,"created_at":"2025-08-23T10:50:20.428Z","updated_at":"2025-08-23T10:50:20.428Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32508900,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-30T13:12:12.517Z","status":"online","status_checked_at":"2026-05-01T02:00:05.856Z","response_time":64,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"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":["api","flask","python","url-shortener"],"created_at":"2025-01-29T02:47:15.799Z","updated_at":"2026-05-01T18:31:36.681Z","avatar_url":"https://github.com/sayoun.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Kort API\n\nKort is a URL-Shortener API written in python using Flask and SQLAlchemy\n\n## Why create yet another URL-Shortener ?\n\nThere is already a lot of url shortener libs existing and written in python, but they are usually not really shortening but rather encoding the url using a hash which is on average longer than the url which we wanted to shorten.\n\nIn Kort we use a bijective function which will use the database entry ID as key, so the link will always be really short (starting from 1 letter) and fast to encode/decode.\n\n## Why make an API and not a web form/page ?\n\nSo it can be used programmatically, called by script or bots. But feel free to make a web form which will call this API internally.\n\n## Who could need this ?\n\nIf you use any kind of complex dashboards at your company, it uses have a lot of parameters and the url is really long, and you usually end copy/pasting it manually in a mail or pastebin, as it can even break url parsing/triggering on some medias like IRC client (irssi).\n\n\n## Table of contents\n\n  * [Requirements](#requirements)\n  * [Installation](#installation)\n  * [Getting started](#getting-started)\n  * [Use cases](#use-cases)\n    * [Creating a shortened link](#creating-a-shortened-link)\n    * [Using a shortened link](#using-a-shortened-link)\n  * [Advanced Usage](#advanced-usage)\n    * [Configuration](#configuration)\n    * [WSGI](#wsgi)\n  * [License](#license)\n\n## Requirements\n\n* A compatible operating system (Linux, BSD, Mac OS X/Darwin, Windows)\n* Python 2.6/2.7/3.2/3.3/3.4/3.5/3.6\n\n## Installation\n\n### Install with pip\n\n    $ pip install kort\n\n### Build from source\n\n    $ cd /path/to/the/repository\n    $ python setup.py install --user\n\n## Getting started\n\nUsing the provided CLI command 'kort', you can use --help for each command to see available options.\n\nFirst initialize the database. Default is using a sqlite DB located in relative directory 'sqlite:///kort.db'.\n\n    $ kort initdb\n\nLaunch the API. Default is running on localhost and port 5000.\n\n    $ kort run\n\n## Use cases\n\n  * [Creating a shortened link](#creating-a-shortened-link)\n  * [Using a shortened link](#using-a-shortened-link)\n\n### Creating a shortened link\n\nusing curl\n\n    $ curl -X POST \"http://0.0.0.0:5000/\" --data \"url=http://example.com/\"\n\nwill return a 201 response, shortened url is in response `Location` header\n\n    `Location: http://0.0.0.0:5000/M`\n\nIf you submit the same request it will not create a new entry but return the previous entry with the same response to avoid duplicate entries in database.\n\n### Using a shortened link\n\nusing curl\n\n    $ curl -X GET \"http://0.0.0.0:5000/M\"\n\nwill return a 302 response with the real url located in a `Location` header.\n\n## Advanced Usage\n\n### Configuration\n\nKort comes with defaults value for configuration. But you can override everything using a YAML configuration file. One configuration example is provided in the conf directory: [conf.yaml.tmpl](https://github.com/sayoun/kort/blob/master/kort/conf/conf.yaml.tmpl).\n\nKort will search for a configuration file located in `/etc/kort.yaml`, if not found it will use default values.\n\n### WSGI\n\nYou can launch Kort API as a WSGI process, using file provided in the bin directory [wsgi.py](https://github.com/sayoun/kort/blob/master/kort/bin/wsgi.py).\n\nOne gunicorn example is provided in the conf directory: [kort.gunicorn.tmpl](https://github.com/sayoun/kort/blob/master/kort/conf/kort.gunicorn.tmpl).\n\n## License / Copying\n\nMIT License\n\nCopyright (c) [2017] [Dejan Filipovic (sayoun)]\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsayoun%2Fkort","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsayoun%2Fkort","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsayoun%2Fkort/lists"}