{"id":18681876,"url":"https://github.com/gravityblast/matryoshka","last_synced_at":"2026-03-27T02:34:32.454Z","repository":{"id":61419118,"uuid":"91389844","full_name":"gravityblast/matryoshka","owner":"gravityblast","description":"an image transformation reverse proxy written in elixir","archived":false,"fork":false,"pushed_at":"2017-05-16T08:00:09.000Z","size":10,"stargazers_count":19,"open_issues_count":0,"forks_count":2,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-04-19T12:02:09.450Z","etag":null,"topics":["elixir","elixir-lang","image-reverse-proxy","reverse-proxy"],"latest_commit_sha":null,"homepage":null,"language":"Elixir","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/gravityblast.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-05-15T22:18:33.000Z","updated_at":"2023-09-01T08:53:11.000Z","dependencies_parsed_at":"2022-10-17T09:43:00.826Z","dependency_job_id":null,"html_url":"https://github.com/gravityblast/matryoshka","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/gravityblast/matryoshka","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gravityblast%2Fmatryoshka","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gravityblast%2Fmatryoshka/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gravityblast%2Fmatryoshka/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gravityblast%2Fmatryoshka/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/gravityblast","download_url":"https://codeload.github.com/gravityblast/matryoshka/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gravityblast%2Fmatryoshka/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31010447,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-27T02:33:22.146Z","status":"ssl_error","status_checked_at":"2026-03-27T02:33:21.763Z","response_time":164,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: 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":["elixir","elixir-lang","image-reverse-proxy","reverse-proxy"],"created_at":"2024-11-07T10:10:02.337Z","updated_at":"2026-03-27T02:34:32.415Z","avatar_url":"https://github.com/gravityblast.png","language":"Elixir","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Matryoshka\n\nAn image transformation reverse proxy written in Elixir.\n\nIt is meant to be used with a CDN in front of it, so that\nthe it processes each image only once during the first request.\n\nInternally it uses the `mogrify` command.\n\n## Transformations\n\nYou can use a plug-like syntax to specify all the transformations:\n\n```elixir\ndefmodule MyTransformations do\n  use Matryoshka.TransformationPlug\n\n  transformation Resize\n  transformation Rotate\n  transformation Strip\nend\n```\n\nEach transformation is just a behaviour with a transform function:\n\n```elixir\ndefmodule Resize do\n  alias Matryoshka.{Command}\n\n  def transform(%Command{} = cmd, opts) do\n    opts\n    |\u003e Map.get(\"size\", \"\")\n    |\u003e Integer.parse\n    |\u003e case do\n      {size, \"\"} -\u003e\n        cmd\n        |\u003e Command.add_option(\"-thumbnail\", \"#{size}x#{size}\")\n        |\u003e Command.add_option(\"-quality\", \"80\")\n      _ -\u003e\n        cmd\n    end\n  end\nend\n```\n\n## Usage\n\n```bash\nexport REMOTE_ROOT=\"https://s3.amazonaws.com/BUCKET_NAME\"\nmix run --no-halt\n```\n\n## TODO\n\nThe current repository contains an application that can be run with `mix run --no-halt`.\nThe plan is to change it so that it can be used as a simple library, and each one can just\nuse the `TransformationPlug` behaviour.\n\n* [ ] Write a TODO list\n\n## Author\n\n[Andrea Franz](http://gravityblast.com)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgravityblast%2Fmatryoshka","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgravityblast%2Fmatryoshka","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgravityblast%2Fmatryoshka/lists"}