{"id":48653079,"url":"https://github.com/shantanugoel/deecubes","last_synced_at":"2026-04-10T08:55:44.520Z","repository":{"id":62567386,"uuid":"103430381","full_name":"shantanugoel/deecubes","owner":"shantanugoel","description":"Damn Simple Static url Shortener","archived":false,"fork":false,"pushed_at":"2020-10-16T20:17:14.000Z","size":24,"stargazers_count":11,"open_issues_count":1,"forks_count":1,"subscribers_count":1,"default_branch":"master","last_synced_at":"2026-04-10T08:55:37.346Z","etag":null,"topics":["bitly","bitly-clone","shorturl","tinyurl"],"latest_commit_sha":null,"homepage":null,"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/shantanugoel.png","metadata":{"files":{"readme":"README.md","changelog":null,"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-09-13T17:32:18.000Z","updated_at":"2024-01-23T07:44:52.000Z","dependencies_parsed_at":"2022-11-03T16:30:36.126Z","dependency_job_id":null,"html_url":"https://github.com/shantanugoel/deecubes","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/shantanugoel/deecubes","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shantanugoel%2Fdeecubes","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shantanugoel%2Fdeecubes/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shantanugoel%2Fdeecubes/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shantanugoel%2Fdeecubes/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/shantanugoel","download_url":"https://codeload.github.com/shantanugoel/deecubes/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shantanugoel%2Fdeecubes/sbom","scorecard":{"id":816135,"data":{"date":"2025-08-11","repo":{"name":"github.com/shantanugoel/deecubes","commit":"6b6405a9141f43d267ac398dd794ca6fd7873606"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3,"checks":[{"name":"Code-Review","score":0,"reason":"Found 1/30 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":"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":"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":"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"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 1 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-23T14:18:41.735Z","repository_id":62567386,"created_at":"2025-08-23T14:18:41.735Z","updated_at":"2025-08-23T14:18:41.735Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31635969,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-10T07:40:12.752Z","status":"ssl_error","status_checked_at":"2026-04-10T07:40:11.664Z","response_time":98,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["bitly","bitly-clone","shorturl","tinyurl"],"created_at":"2026-04-10T08:55:42.298Z","updated_at":"2026-04-10T08:55:44.504Z","avatar_url":"https://github.com/shantanugoel.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# deecubes (Damn Simple Static url Shortener)\n\nThe name comes from the short form DSSS of Damn Simple Static url Shortener (so, a D and a cube of S's. Idiotic, I know :P). This program allows to maintain a website of short urls, akin to bit.ly/tinyurl etc, that can redirect to longer urls so one has to remember/give shorter ones. The main point of this project is to allow this to be done via a static website instead of a database based solution.\n\nThere are several benefits of a static website like they are much cheaper (Free to host on github/gitlab etc), easy to migrate to any host in minutes (if not seconds), etc. On top of this, the project strives to make this process as simple as possible to use.\n\n## Input\n\nLong url that you want to shorten\n\nA mnemonic/shorturl you want to assign to it (Optional. If not given, one is generated automatically)\n\n## Output\n\nStatic website of shorturls redirecting to your long urls\n\nOne can also go to shorturl/preview.html to see the long url it points to without getting redirected.\n\n# Installation\n\ndeecubes is compatible wit python3 only. It's recommended to install deecubes from pypi using pip\n\n```\npip install deecubes\n```\n\n# Deployment methods\n\nYou can use/deploy your own shorturl websites using deecubes in various ways given below and more:\n\n- Host website on github/gitlab etc. Run deecubes cli commands (given in next section) locally to generate shorturls in a git repository. Commit and upload.\n\n- Host website on github/gitlab etc. Create a 'source' branch in the website repository. Add a link to input directory from PC or directly through web interface and use a CI job (like Travis/CircleCI/Pipeline etc) to automatically generate shorturls using \"sync\" commands. https://shgl.in/ uses this method.\n\n- Create your own automation to host the output directory on any host (through APIs or mounted directories etc)\n\n# CLI Usage\n\n```\nusage: deecubes [-h] [-v] [-l LOGLEVEL]\n                [-a SHORTURL URL | -g URL | -d SHORTURL | -s] -r RAW_DATA_PATH\n                -o OUTPUT_PATH\n\noptional arguments:\n  -h, --help            show this help message and exit\n  -v, --version         show program's version number and exit\n  -l LOGLEVEL, --log LOGLEVEL\n                        Set log level. 0=\u003e Warning, 1=\u003eInfo, 2=\u003eDebug\n  -a SHORTURL URL, --add SHORTURL URL\n                        Add given shorturl for given url\n  -g URL, --generate URL\n                        Generate shorturl for given url\n  -d SHORTURL, --delete SHORTURL\n                        Delete given shorturl\n  -s, --sync            Sync raw data storage and html output\n\nrequired arguments:\n  -r RAW_DATA_PATH, --raw-data-path RAW_DATA_PATH\n                        Raw data storage path\n  -o OUTPUT_PATH, --output-path OUTPUT_PATH\n                        HTML output path\n\n```\n\nNotes:\n\n- Raw Path: A directory where deecubes stores raw information about urls. This can be empty directory if you are using add/generate commands for urls. Otherwise, you can add a .txt file here with the content being a long url. Then when, sync command is used, deecubes will add corresponding shorturl html files in output directory using the filename as the shorturl.\n\n- Output Path: Path where the static website is generated. This directory should be used for deployment.\n\n- Raw path and output path are mandatory to specify for all commands\n\n## Examples\n\nAdd a specific shorturl for a long url\n\n```\ndeecubes -r ./raw -o ./public -a github https://github.com/shantanugoel/\n```\n\nAdd a long url and deecubes will generate a shorturl on its own\n\n```\ndeecubes -r ./raw -o ./public -g https://github.com/shantanugoel/\n```\n\nAutomatically generate shorturls in output dir for any .txt files that were manually added to raw directory\n\n```\ndeecubes -r ./raw -o ./public --sync\n```\n\n# TODO\n\n- Add collision handling\n\n- Add google analytics\n\n- Add configurable templates\n\n- Suggestions?\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fshantanugoel%2Fdeecubes","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fshantanugoel%2Fdeecubes","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fshantanugoel%2Fdeecubes/lists"}