{"id":32172830,"url":"https://github.com/adobe/elixir-dumper","last_synced_at":"2026-02-18T22:02:10.568Z","repository":{"id":241570524,"uuid":"791943679","full_name":"adobe/elixir-dumper","owner":"adobe","description":"Take your data and dump it to the screen!","archived":false,"fork":false,"pushed_at":"2025-04-28T17:27:30.000Z","size":22210,"stargazers_count":37,"open_issues_count":1,"forks_count":0,"subscribers_count":5,"default_branch":"main","last_synced_at":"2025-10-21T18:44:59.681Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Elixir","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/adobe.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","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,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2024-04-25T17:09:38.000Z","updated_at":"2025-08-11T10:24:13.000Z","dependencies_parsed_at":"2024-06-25T18:12:31.048Z","dependency_job_id":"561c2acb-6752-4c5e-8f91-cfc8e0e32ec2","html_url":"https://github.com/adobe/elixir-dumper","commit_stats":null,"previous_names":["adobe/elixir-dumper"],"tags_count":8,"template":false,"template_full_name":null,"purl":"pkg:github/adobe/elixir-dumper","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/adobe%2Felixir-dumper","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/adobe%2Felixir-dumper/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/adobe%2Felixir-dumper/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/adobe%2Felixir-dumper/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/adobe","download_url":"https://codeload.github.com/adobe/elixir-dumper/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/adobe%2Felixir-dumper/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29596329,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-18T20:59:56.587Z","status":"ssl_error","status_checked_at":"2026-02-18T20:58:41.434Z","response_time":162,"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":[],"created_at":"2025-10-21T18:44:33.449Z","updated_at":"2026-02-18T22:02:10.553Z","avatar_url":"https://github.com/adobe.png","language":"Elixir","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![Hex.pm](https://img.shields.io/hexpm/v/dumper)](https://hex.pm/packages/dumper)\n[![Hexdocs.pm](https://img.shields.io/badge/docs-hexdocs.pm-purple)](https://hexdocs.pm/dumper)\n[![Github.com](https://github.com/adobe/elixir-dumper/actions/workflows/ci.yml/badge.svg)](https://github.com/adobe/elixir-dumper/actions)\n\n# Dumper\n\n_Takes your data and dumps it to the screen!_\n\nDumper uses reflection to find all your app's ecto schemas and provide routes to browse their data.  It's packaged as a Live Dashboard plugin for easy navigation.\n\n![dumper](assets/dumper.gif)\n\n## Requirements\nDumper only works with Phoenix 1.7+ applications that use Ecto.\n\n## About\nDumper aims to make it as easy as possible for everyone on a project to access and understand its data.\n\n- All ids can be linked, so it's an incredibly fast way to explore a data model against real data.\n- Because it's implemented with reflection, it automatically covers every schema module in your project.\n- Styling is kept consistent with the LiveDashboard theme so that data is front and center.\n- Associations are also shown for a given record, all on the same page.\n- Non-intrusive. No changes necessary to existing modules/files.\n- Read-only.  No accidentally deleting or editing data while browsing.\n- Shareable URLs. Having a shareable link to every record in your database is very useful for debugging. It gives everyone including non-technical teammates the ability to get a better understanding of your data model.\n\n## Installation and Usage\nAdd `dumper` to your list of dependencies in `mix.exs`:\n\n```elixir\ndef deps do\n  [\n    {:dumper, \"~\u003e 0.2.6\"}\n  ]\nend\n```\n\nInstall and configure [Phoenix Live Dashboard](https://hexdocs.pm/phoenix_live_dashboard) if you haven't already.  Then modify `router.ex` to include the `dumper` as a plugin:\n\n``` elixir\nlive_dashboard \"/dashboard\", additional_pages: [dumper: {Dumper.LiveDashboardPage, repo: MyApp.Repo}]\n```\n\nBy default, Dumper will auto-discover all Ecto schemas associated with the provided repo's `otp_app`.  You can override this behavior by explicitly passing an app as an option with `otp_app: :my_app`.\n\nYou can now run your web app, navigate to dumper tab within the live dashboard, and view all your data.\n\n## Customization\n\n### Config Module\nIt is *highly recommended* to customize the `dumper`.  To do so, you can optionally define a module that implements the `Dumper.Config` behavior.  Add it to the `live_dashboard` entry in your `router.ex` file:\n\n``` elixir\nlive_dashboard \"/dashboard\", additional_pages:\n  [dumper: {Dumper.LiveDashboardPage, repo: MyApp.Repo, config_module: MyApp.DumperConfig}]\n```\n\nHere's an example config module:\n\n``` elixir\ndefmodule MyApp.DumperConfig do\n  use Dumper.Config\n\n  @impl Dumper.Config\n  def ids_to_schema() do\n    %{\n      book_id: Library.Book,\n      author_id: Library.Author\n    }\n  end\n\n  def excluded_fields() do\n    %{\n      Library.Employee =\u003e [:salary, :email_address],\n      Library.Book =\u003e [:price]\n    }\n  end\n\n  def display(%{field: :last_name} = assigns) do\n    ~H|\u003cspan style=\"color: red\"\u003e\u003c%= @value %\u003e\u003c/span\u003e|\n  end\n\n  def custom_record_links(%Library.Book{} = book) do\n    [\n      {\"https://goodreads.com/search?q=#{book.title}\", \"Goodreads\"},\n      {~p\"/logging/#{book.id}\", \"Logs\"}\n    ]\n  end\nend\n\n```\n\nCommon customizations are using the `c:Dumper.Config.ids_to_schema/0` to turn id values into clickable links and using `c:Dumper.Config.custom_record_links/1` to provide extra links to useful information when viewing a specific record.\n\nTake a look a `c:Dumper.Config.ids_to_schema/0`, `c:Dumper.Config.allowed_fields/0`, `c:Dumper.Config.excluded_fields/0`, `c:Dumper.Config.display/1`, `c:Dumper.Config.additional_associations/1`, and `c:Dumper.Config.custom_record_links/1` for more information on how each optional callback lets you customize how your data is rendered.\n\n\n## Other notes\n\n### Rendering Embeds\nThe index page and association tables on the show page by default omit columns that are embeds.  This is purely for display purposes, as those values tend to take up a lot of vertical space.  This is currently not configurable, but may be in the future.\n\n### Redactions\nBy default, schema fields with `redact: true` are hidden and replaced with the text `redacted`.  If you're running the Dumper in a non-production environment or against dummy data, you may want to disregard the redacted fields.  To do that, you can add a `display/1` function head like the following:\n\n``` elixir\ndef display(%{redacted: true} = assigns), do: ~H|\u003c%= @value %\u003e|\n```\n\nYou can refine that down to a specific schema and/or field as well by pattern matching the assigns.\n\n### Security\nAs with LiveDashboard more broadly, it is highly recommended that you put the route behind some sort of [admin authentication](https://hexdocs.pm/phoenix_live_dashboard/Phoenix.LiveDashboard.html#module-extra-add-dashboard-access-on-all-environments-including-production) if you want to use `dumper` in production.\n\nThe `c:Dumper.Config.allowed_fields/0` and `c:Dumper.Config.excluded_fields/0`callbacks are another way to be explicit about what data is shown or hidden altogether.\n\nYou could also hide the plugin altogether by modifying the live_dashboard route.  For example, this would require a `:dumper` `enabled: true` config to be set in order to display the `dumper` tab in the live dashboard:\n\n``` elixir\nlive_dashboard \"/dashboard\",\n  additional_pages: [] ++ (if Application.get_env(:dumper, :enabled, false), do: [dumper: {Dumper.LiveDashboardPage, repo: MyApp.Repo}], else: [])\n```\n\nThis would allow you to configure showing or hiding the `dumper` based on environments.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fadobe%2Felixir-dumper","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fadobe%2Felixir-dumper","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fadobe%2Felixir-dumper/lists"}