{"id":40990069,"url":"https://github.com/ichiban/jesi","last_synced_at":"2026-01-22T07:38:36.919Z","repository":{"id":57523528,"uuid":"75461646","full_name":"ichiban/jesi","owner":"ichiban","description":"Hypermedia API Accelerator","archived":false,"fork":false,"pushed_at":"2018-07-28T07:28:53.000Z","size":208,"stargazers_count":19,"open_issues_count":0,"forks_count":1,"subscribers_count":2,"default_branch":"master","last_synced_at":"2024-06-20T06:32:48.434Z","etag":null,"topics":["cache","hal","hypermedia","json","reverse-proxy","web-api"],"latest_commit_sha":null,"homepage":"","language":"Go","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/ichiban.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2016-12-03T08:22:16.000Z","updated_at":"2019-09-25T20:16:03.000Z","dependencies_parsed_at":"2022-08-28T11:12:29.450Z","dependency_job_id":null,"html_url":"https://github.com/ichiban/jesi","commit_stats":null,"previous_names":[],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/ichiban/jesi","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ichiban%2Fjesi","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ichiban%2Fjesi/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ichiban%2Fjesi/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ichiban%2Fjesi/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ichiban","download_url":"https://codeload.github.com/ichiban/jesi/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ichiban%2Fjesi/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28658107,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-22T01:17:37.254Z","status":"online","status_checked_at":"2026-01-22T02:00:07.137Z","response_time":144,"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":["cache","hal","hypermedia","json","reverse-proxy","web-api"],"created_at":"2026-01-22T07:38:36.834Z","updated_at":"2026-01-22T07:38:36.904Z","avatar_url":"https://github.com/ichiban.png","language":"Go","readme":"# Jesi - a hypermedia API accelerator\n\nJesi (stands for JSON Edge Side Include) is an HTTP reverse proxy that accelerates your web API by embedding \u0026 caching JSON representations.\n\n## Getting Started\n\nInstall Jesi from GitHub Releases (pick a binary for your platform):\n\n```sh\n$ curl -L https://github.com/ichiban/jesi/releases/download/v0.2.0/jesi-darwin-amd64 \u003e jesi\n$ chmod +x jesi\n```\n\nThen, run it with your backend server:\n\n```sh\n$ ./jesi -backend http://localhost:3000 -port 8080\n```\n \n## Features\n\n### Embedding\n\nJesi understands [JSON Hypertext Application Language aka HAL+JSON](http://tools.ietf.org/html/draft-kelly-json-hal) and can construct complex HAL+JSON documents out of simple HAL+JSON documents from the upstream server.\nBy supplying a query parameter `?with=\u003cedges\u003e` with dot separated edge names, it embeds HAL+JSON documents linked by `_links` as `_embeded`. (This functionality is also known as **zooming**)\n\nThis will decrease the number of round trips over the Internet which is crucial for speeding up web API backed applications.\n\n### Caching\n\nJesi implements HTTP Caching described in [RFC 7234](https://tools.ietf.org/html/rfc7234).\nEvery representation including but not limited to HAL+JSON documents is cached and served from the cache on behalf of the upstream server while it's fresh.\n\nCombined with embedding, the resulting HAL+JSON representation is constructed from cached representations and representations newly fetched from the upstream server so that it can maximize cache effectiveness.\n\nWhen Jesi cache reaches the memory limitation specified by `-max` command line option, it evicts some cached representations with LRU algorithm.\n\n## Example\n\nLet's consider an example of a movie database app. It has resources of a movie Pulp Fiction, roles Vincent Vega and Jules Winnfield, and actors John Travolta and Samuel L. Jackson.\n\n```json\n{\n  \"_links\": {\n    \"self\": {\"href\": \"/movies/1\"},\n    \"roles\": [{\"href\": \"/roles/1\"}, {\"href\": \"/roles/2\"}]\n  },\n  \"title\": \"Pulp Fiction\",\n  \"year\": 1994\n}\n```\n\n```json\n{\n  \"_links\": {\n    \"self\": {\"href\": \"/roles/1\"},\n    \"actor\": {\"href\": \"/actors/1\"},\n    \"movie\": {\"href\": \"/movies/1\"}\n  },\n  \"name\": \"Vincent Vega\"\n}\n```\n\n```json\n{\n  \"_links\": {\n    \"self\": {\"href\": \"/roles/2\"},\n    \"actor\": {\"href\": \"/actors/2\"},\n    \"movie\": {\"href\": \"/movies/1\"}\n  },\n  \"name\": \"Jules Winnfield\"\n}\n```\n\n```json\n{\n  \"_links\": {\n    \"self\": {\"href\": \"/actors/1\"},\n    \"roles\": [{\"href\": \"/roles/1\"}]\n  },\n  \"name\": \"John Travolta\"\n}\n```\n\n```json\n{\n  \"_links\": {\n    \"self\": {\"href\": \"/actors/2\"},\n    \"roles\": [{\"href\": \"/roles/2\"}]\n  },\n  \"name\": \"Samuel L. Jackson\"\n}\n```\n\nThey're connected by `_links` property - a movie has many roles and a role has exactly one actor.\n\n![Movies](movies.png)\n\nTo render a view for Pulp Fiction, it has to make requests for the movie `/movies/1` and also `/roles/1`, `/roles/2`, `/actors/1`, and `/actors/2` for the details.\nBy making a request `/movies/1?with=roles.actor`, Jesi responds with one big HAL+JSON document with the roles and actors embedded in the movie JSON.\n\n```json\n{\n  \"_links\": {\n    \"self\": {\"href\": \"/movies/1\"},\n    \"roles\": [{\"href\": \"/roles/1\"}, {\"href\": \"/roles/2\"}]\n  },\n  \"_embedded\": {\n    \"roles\": [\n      {\n        \"name\": \"Vincent Vega\",\n        \"_links\": {\n          \"self\": {\"href\": \"/roles/1\"},\n          \"actor\": {\"href\": \"/actors/1\"},\n          \"movie\": {\"href\": \"/movies/1\"}\n        },\n        \"_embedded\": {\n          \"actor\": {\n            \"name\": \"John Travolta\",\n            \"_links\": {\n              \"self\": {\"href\": \"/actors/1\"},\n              \"roles\": [{\"href\": \"/roles/1\"}]\n            }\n          }\n        }\n      },\n      {\n        \"name\": \"Jules Winnfield\",\n        \"_links\": {\n          \"self\": {\"href\": \"/roles/2\"},\n          \"actor\": {\"href\": \"/actors/2\"},\n          \"movie\": {\"href\": \"/movies/1\"}\n        },\n        \"_embedded\": {\n          \"actor\": {\n            \"name\": \"Samuel L. Jackson\",\n            \"_links\": {\n              \"self\": {\"href\": \"/actors/2\"},\n              \"roles\": [{\"href\": \"/roles/2\"}]\n            }\n          }\n        }\n      }\n    ]\n  },\n  \"title\": \"Pulp Fiction\",\n  \"year\": 1994\n}\n```\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fichiban%2Fjesi","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fichiban%2Fjesi","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fichiban%2Fjesi/lists"}