{"id":27947895,"url":"https://github.com/luckyframework/breeze","last_synced_at":"2026-03-04T07:32:41.890Z","repository":{"id":39648269,"uuid":"340789753","full_name":"luckyframework/breeze","owner":"luckyframework","description":"A development dashboard for Lucky Apps","archived":false,"fork":false,"pushed_at":"2025-06-05T21:59:47.000Z","size":127,"stargazers_count":21,"open_issues_count":12,"forks_count":1,"subscribers_count":6,"default_branch":"main","last_synced_at":"2025-06-05T22:31:43.594Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Crystal","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/luckyframework.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,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2021-02-21T01:11:09.000Z","updated_at":"2024-11-16T18:37:09.000Z","dependencies_parsed_at":"2025-05-07T14:44:49.812Z","dependency_job_id":null,"html_url":"https://github.com/luckyframework/breeze","commit_stats":null,"previous_names":[],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/luckyframework/breeze","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/luckyframework%2Fbreeze","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/luckyframework%2Fbreeze/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/luckyframework%2Fbreeze/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/luckyframework%2Fbreeze/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/luckyframework","download_url":"https://codeload.github.com/luckyframework/breeze/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/luckyframework%2Fbreeze/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30075431,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-04T05:31:57.858Z","status":"ssl_error","status_checked_at":"2026-03-04T05:31:38.462Z","response_time":59,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5: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-05-07T14:38:46.800Z","updated_at":"2026-03-04T07:32:41.849Z","avatar_url":"https://github.com/luckyframework.png","language":"Crystal","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 💨 Breeze\n\nBreeze is a development dashboard for [Lucky Framework](https://luckyframework.org/) that helps you to debug and fine-tune your application.\n\n## Screenshots\n\n| Easy debug logs | View your app requests |\n|-----------------|-----------------|\n| \u003cimg src=\"https://drive.google.com/uc?id=1K6SEJVzzx-DDfPz6LOX-9X72c-NMgtAf\" width=\"300\" /\u003e | \u003cimg src=\"https://drive.google.com/uc?id=1uUlq8kGyIcf_Ug6_7ScA8oL6xQlUDrGd\" width=\"300\" /\u003e |\n\n| Overview of a request | See queries |\n|-----------------------|-------------|\n| \u003cimg src=\"https://drive.google.com/uc?id=1oGFpbM5HbXgDkY92-TNA8zV6pePuH_yL\" width=\"300\" /\u003e | \u003cimg src=\"https://drive.google.com/uc?id=1RV5nQoIoHPULjeCXsS2kHkCxn8BLYs6c\" width=\"300\" /\u003e |\n\n| Create extensions | Preview emails |\n|-------------------|----------------|\n| \u003cimg src=\"https://drive.google.com/uc?id=1_dXug1TLn8R01Ky2SD_69m4EqmK4gLeq\" width=\"300\" /\u003e | \u003cimg src=\"https://drive.google.com/uc?id=1NXPIRLv9BAFpw6YAOFVqyuZU_w_eYHfJ\" width=\"300\" /\u003e |\n\n\n## Installation\n\n1. Add the dependency to your `shard.yml`:\n```yaml\ndependencies:\n  breeze:\n    github: luckyframework/breeze\n```\n2. Run `shards install`\n3. Add the require to your `src/shards.cr`:\n```crystal\nrequire \"avram\"\nrequire \"lucky\"\n# ...\n# Add this line here\nrequire \"breeze\"\n```\n4. Add the tasks to your `tasks.cr`:\n```crystal\n# ...\nrequire \"./src/app\"\nrequire \"lucky_task\"\n\n# Add this line here\nrequire \"breeze/tasks\"\n\n#...\nLuckyTask::Runner.run\n```\n5. Add the spec helpers to your `spec/spec_helper.cr`:\n```crystal\nrequire \"spec\"\nrequire \"lucky_flow\"\nrequire \"../src/app\"\n# ...\nrequire \"breeze/spec_helpers\"\n\nrequire \"./setup/**\"\n```\n6. Run `lucky breeze.install`\n7. Run `lucky db.migrate`\n\n## Usage\n\nBoot your app locally (`lucky dev`), then open your app in the browser and start using your app.\nWhen you're ready to check out Breeze, look at your development log. You'll see logs similar to this:\n\n```\n▸ Debug at http://localhost:5000/breeze/requests/6\n```\n\nYou can visit a specific request, or just go to `/breeze/requests` to browse.\n\n## Configuration\n\nYou breeze configuration will be located in `config/breeze.cr`. This file was added for you when you ran `lucky breeze.install`.\n\n```crystal\n# config/breeze.cr\n\nBreeze.configure do |settings|\n  # The database to store the request info\n  settings.database = AppDatabase\n\n  # Enable Breeze only for this environment\n  settings.enabled = LuckyEnv.development?\nend\n\n# Configuration settings for Actions\nBreeze::ActionHelpers.configure do |settings|\n  # This setting is optional\n  settings.skip_pipes_if = -\u003e(context : HTTP::Server::Context) {\n    context.request.resource.starts_with?(\"/admin\")\n  }\nend\n```\n\n* `database` - This is the `Avram::Database` your models inherit from. By default, it's `AppDatabase`.\n* `enabled` - When set to `false`, you won't be able to visit any of the breeze pages. This is enabled for development by default.\n* `skip_pipes_if` - Breeze will store the request and response for every action in your app. If there's some actions you don't want to store, you can skip these by matching the request path or resource. You could also skip certain content types, or whatever else you want.\n\n## Breeze Extensions\n\nBreeze comes with a [Carbon](https://github.com/luckyframework/carbon) extension that allows you to preview your emails right in the browser.\n\nIf you develop a Breeze extension, let us know and we will list it here!\n\n### Installing BreezeCarbon\n\n1. Add the require to your `src/shards.cr` right below your `require \"breeze\"`:\n```crystal\nrequire \"breeze\"\nrequire \"breeze/extensions/breeze_carbon\"\n```\n2. Add your Email preview class to `src/emails/previews.cr`:\n```crystal\nclass Emails::Previews \u003c Carbon::EmailPreviews\n  def previews : Array(Carbon::Email)\n    [\n      WelcomeEmail.new(UserQuery.first),\n      PasswordResetRequestEmail.new(UserQuery.first),\n    ] of Carbon::Email\n  end\nend\n```\n3. Add the `BreezeCarbon` config to `config/breeze.cr`:\n```crystal\nBreezeCarbon.configure do |settings|\n\n  # Set this to the name of your preview class\n  settings.email_previews = Emails::Previews\nend\nBreeze.register BreezeCarbon\n```\n\n### Using BreezeCarbon\n\nJust visit `/breeze/emails` in your browser, and you'll see your emails. Click the `HTML` button to see the HTML version of your email, or the `TEXT` to see the plain text version.\n\n### Configuring BreezeCarbon\n\n`BreezeCarbon` requires setting the `email_previews` setting to the name of your email preview class.\nYour email preview class should inherit from `Carbon::EmailPreviews`, and define an instance method `previews` which returns an `Array(Carbon::Email)`.\n\n\n## Extending Breeze\n\n1. Create your new extension module (e.g. `module MyBreezeExt`), and add `extend Breeze::Extension`\n2. Define your navbar link method in your module:\n```crystal\ndef self.navbar_link : Breeze::NavbarLink\n  Breeze::NavbarLink.new(\n    link_text: \"Breeze Ext\",\n    link_to: MyBreezeExt::Index.path\n  )\nend\n```\n3. Create your actions, and pages like a standard Lucky app. Actions inherit from `Breeze::BreezeAction`. Pages inherit from `Breeze::BreezeLayout`.\n4. Lucky apps that include Breeze and your extension will need to add `Breeze.register MyBreezeExt`.\n\nFor more examples on creating a Breeze extension, look at the `BreezeCarbon` extension in `src/extensions/breeze_carbon.cr`\n\n## Development\n\nInstall shards `shards install`, and start making changes. Be sure to run [`ameba`](https://github.com/crystal-ameba/ameba), and the crystal formatter `crystal tool format spec src`.\n\nRead through the issues for things you can work on. If you have an idea, feel free to open a new issue!\n\n## Contributing\n\n1. Fork it (\u003chttps://github.com/luckyframework/breeze/fork\u003e)\n2. Create your feature branch (`git checkout -b my-new-feature`)\n3. Commit your changes (`git commit -am 'Add some feature'`)\n4. Push to the branch (`git push origin my-new-feature`)\n5. Create a new Pull Request\n\n## Contributors\n\n- [Jeremy Woertink](https://github.com/jwoertink) - creator and maintainer\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fluckyframework%2Fbreeze","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fluckyframework%2Fbreeze","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fluckyframework%2Fbreeze/lists"}