{"id":41545641,"url":"https://github.com/ackerleytng/gowherene","last_synced_at":"2026-01-24T02:50:33.330Z","repository":{"id":90298607,"uuid":"115118064","full_name":"ackerleytng/gowherene","owner":"ackerleytng","description":"Helping Singaporeans plot recommendations since 2018","archived":false,"fork":false,"pushed_at":"2024-02-23T09:15:18.000Z","size":657,"stargazers_count":9,"open_issues_count":11,"forks_count":1,"subscribers_count":2,"default_branch":"master","last_synced_at":"2024-02-23T10:30:08.831Z","etag":null,"topics":["clojure","clojurescript","google-maps-api","public-service","utility-application","web-app"],"latest_commit_sha":null,"homepage":"https://gowherene.ackerleytng.com","language":"HTML","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/ackerleytng.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,"governance":null,"roadmap":null,"authors":null,"dei":null}},"created_at":"2017-12-22T13:33:06.000Z","updated_at":"2024-02-23T10:30:08.832Z","dependencies_parsed_at":null,"dependency_job_id":"d89b2d29-6473-405b-bf51-55f164828cb3","html_url":"https://github.com/ackerleytng/gowherene","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/ackerleytng/gowherene","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ackerleytng%2Fgowherene","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ackerleytng%2Fgowherene/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ackerleytng%2Fgowherene/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ackerleytng%2Fgowherene/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ackerleytng","download_url":"https://codeload.github.com/ackerleytng/gowherene/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ackerleytng%2Fgowherene/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28708640,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-23T23:51:44.727Z","status":"online","status_checked_at":"2026-01-24T02:00:06.909Z","response_time":89,"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":["clojure","clojurescript","google-maps-api","public-service","utility-application","web-app"],"created_at":"2026-01-24T02:50:30.430Z","updated_at":"2026-01-24T02:50:33.318Z","avatar_url":"https://github.com/ackerleytng.png","language":"HTML","funding_links":[],"categories":[],"sub_categories":[],"readme":"# gowherene\n\ngowherene is a webapp to help Singaporeans plot food recommendations, such as\nthesmartlocal's http://thesmartlocal.com/read/cheap-food-orchard, on a map.\n\nThese popular blogs do not have a map view for their recommendations, so I built\ngowherene to help visualise the geographical locations of the recommendations\nfor better decision making.\n\nSome carefully-tested recommendations pages are\n\n+ http://thesmartlocal.com/read/restaurants-with-no-gst\n+ http://thesmartlocal.com/read/singapore-cafes-with-no-gst\n+ https://sethlui.com/best-burgers-singapore/\n+ https://www.sassymamasg.com/the-ultimate-guide-to-local-breakfast-in-singapore/\n+ https://www.misstamchiak.com/local-breakfast-east-singapore/\n\ngowherene can also plot addresses, not just recommendations! Try:\n\n+ http://international.tiffany.com/jewelry-stores/store-list/singapore\n\n## Prerequisites\n\nYou will need at least version 1.10.1.727 of the Clojure CLI installed.\n\n## `data`\n\nWhile parsing a page to find address information,\nthe code often refers to `data` or `address-info`, a map of:\n\n| key                 | value                                                                                                      |\n| ------------------- | ---------------------------------------------------------------------------------------------------------- |\n| `:postal-code-loc`  | The loc (as in point in hickory) where the postal code was found, together with some address information   |\n| `:header-loc`       | The loc of the heuristically-determined header for this `:postal-code-loc`                                 |\n| `:place`            | The name of this place                                                                                     |\n| `:address`          | The address of this place                                                                                  |\n| `:latlng`           | The latitude and longitude of this place                                                                   |\n\n## Developing\n\n### Starting the backend\n\nIn emacs, do `cider-jack-in`, then at the `user\u003e` prompt, do\n\n```\nuser\u003e (def server (start-gowherene))\n... elided ...\n#'user/server\n```\n\nAnd then check that the backend is up with `curl`:\n\n```\ncurl -X GET 'http://localhost:3000/parse/?url=http://thesmartlocal.com/read/restaurants-with-no-gst' | jq\n```\n\n### Stopping the backend\n\n```\nuser\u003e (.stop server)\n```\n\n### Starting the figwheel-main dev server (frontend)\n\nDo `C-c M-J` and when prompted, enter `figwheel-main`. When asked for build, enter `dev`\n\nA browser tab should open, pointing to `http://localhost:9500`.\n\n## Production/deployment flow\n\nTo build for production\n\n```\nmake\n```\n\nThis should build both the backend and frontend.\n\n### Building in docker manually\n\n```shell\nDOCKER_BUILDKIT=1 docker build -t test .\n```\n\n### Testing out the backend\n\n```\nGOWHERENE_DEBUG=1 java -cp target/gowherene.jar clojure.main -m gowherene.core\n```\n\nThe above should start a server on port 3000.\n\nWith docker, do\n\n```shell\ndocker run --rm --publish 3000:3000 --env PORT=3000 --env GOOGLE_API_TOKEN=\u003ctoken\u003e --env GOWHERENE_DEBUG=1 -it test\n```\n\nTo query it,\n\n```\ncurl -vv -X GET 'http://localhost:3000/parse/?url=http://thesmartlocal.com/read/restaurants-with-no-gst' | jq\n```\n\n### Deploying backend\n\nPush to master, render.com will pick it up from GitHub and deploy it.\n\n### Deploying frontend\n\nGo to netlify, drag and drop `target/dist` to upload.\n\n## Backend environment variables\n\nIn `gowherene`, I am expecting the following environment variables to be in place.\n\n| key                 | value                                                          |\n|---------------------|----------------------------------------------------------------|\n| `:google-api-token` | API token for Google Maps geocoding API                        |\n| `:port`             | The port to run the server at (defaults to 3000)               |\n| `:gowherene-debug`  | Set to `true` to prevent auto redirecting to HTTPS on port 443 |\n\nFor development, I use a `.lein-env` file in the project directory, which looks like\n\n```\n{:google-api-token \"xxx\"\n :gowherene-debug true}\n```\n\n\u003e `.lein-env` works even without using leiningen because `environ` looks for that file\n\n## License\n\nCopyright © 2022 ackerleytng\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fackerleytng%2Fgowherene","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fackerleytng%2Fgowherene","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fackerleytng%2Fgowherene/lists"}