{"id":26437515,"url":"https://github.com/justincampbell/url-shorteners","last_synced_at":"2026-01-04T16:04:44.166Z","repository":{"id":8394228,"uuid":"9972206","full_name":"justincampbell/url-shorteners","owner":"justincampbell","description":null,"archived":false,"fork":false,"pushed_at":"2021-08-24T18:12:00.000Z","size":2,"stargazers_count":3,"open_issues_count":0,"forks_count":0,"subscribers_count":3,"default_branch":"master","last_synced_at":"2024-04-16T00:03:46.552Z","etag":null,"topics":["exploration","languages","url-shortener"],"latest_commit_sha":null,"homepage":null,"language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/justincampbell.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2013-05-10T01:39:18.000Z","updated_at":"2024-04-16T00:03:46.553Z","dependencies_parsed_at":"2022-07-21T14:32:18.377Z","dependency_job_id":null,"html_url":"https://github.com/justincampbell/url-shorteners","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/justincampbell%2Furl-shorteners","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/justincampbell%2Furl-shorteners/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/justincampbell%2Furl-shorteners/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/justincampbell%2Furl-shorteners/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/justincampbell","download_url":"https://codeload.github.com/justincampbell/url-shorteners/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":244183840,"owners_count":20412111,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":["exploration","languages","url-shortener"],"created_at":"2025-03-18T08:29:58.149Z","updated_at":"2026-01-04T16:04:44.085Z","avatar_url":"https://github.com/justincampbell.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"# URL Shorteners\n\n* [What?](#what)\n* [Requirements](#requirements)\n* [The URL Shortener](#the-url-shortener)\n* [API](#api)\n* [Implementations](#implementations)\n\n## What?\n\nI want to learn more languages. Mostly, I'm interested in:\n\n* Learning the basics and best practices of the language\n* How to structure a project, and development workflow\n* Testing, and tools that help a TDD cycle\n* Deployability to Heroku\n\n## Requirements\n\nThis is what I think the example project needs:\n\n* Uses HTTP\n* Has some sort of write workload\n* Requires storage/state that can remain in-memory\n* Straightforward to test\n* Benchmarkable, if I choose to do that at some point\n\n## The URL Shortener\n\nI need something interesting to build, but not too complex that it would take\na long amount of time or result in immense frustration. I think a URL shortener\nis a good compromise of the requirements above.\n\n## API\n\n### `GET /`\n\n`302 Redirect` to this page\n\n### `GET /shorten?url=[url]`\n\nCreate a new short URL, and respond with `201 Created` along with the path to\nthe token as the body (ex: `/abc123`).\n\nEach shorten request will create a new token, regardless if it already exists\nas another token (mostly for simplicity and performance).\n\nIdeally, we would URL-decode and validate the URL, but I'm not concerned with\nthis to start. For now, it should respond with `400 Bad Request` if the url is\nblank.\n\n### `GET /:token`\n\n`302 Redirect` to the full URL, or `404 Not Found` if the token was not found.\n\n## Implementations\n\n* [Clojure](https://github.com/justincampbell/url-shortener-clojure)\n* [CoffeeScript](https://github.com/justincampbell/url-shortener-coffeescript)\n* [Elixir](https://github.com/justincampbell/url-shortener-elixir)\n* [Go](https://github.com/justincampbell/url-shortener-go)\n* [gRPC (Ruby -\u003e Go)](https://github.com/justincampbell/url-shortener-grpc)\n* [Haskell](https://github.com/justincampbell/url-shortener-haskell)\n* [JavaScript](https://github.com/justincampbell/url-shortener-javascript)\n* [JavaScript (ES6)](https://github.com/justincampbell/url-shortener-javascript-es6)\n* [Python](https://github.com/justincampbell/url-shortener-python)\n* [Ruby](https://github.com/justincampbell/url-shortener-ruby)\n* [Scala](https://github.com/justincampbell/url-shortener-scala)\n\n### In-progress\n\n* [C](https://github.com/justincampbell/url-shortener-c)\n* [Erlang](https://github.com/justincampbell/url-shortener-erlang)\n* [Rust](https://github.com/justincampbell/url-shortener-rust)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjustincampbell%2Furl-shorteners","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjustincampbell%2Furl-shorteners","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjustincampbell%2Furl-shorteners/lists"}