{"id":13396141,"url":"https://github.com/tighten/ziggy","last_synced_at":"2025-05-12T05:34:17.169Z","repository":{"id":37428717,"uuid":"99160927","full_name":"tighten/ziggy","owner":"tighten","description":"Use your Laravel routes in JavaScript.","archived":false,"fork":false,"pushed_at":"2025-04-23T18:44:53.000Z","size":3146,"stargazers_count":4125,"open_issues_count":15,"forks_count":256,"subscribers_count":41,"default_branch":"2.x","last_synced_at":"2025-05-12T02:51:13.610Z","etag":null,"topics":["javascript","laravel","routes","ziggy"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","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/tighten.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","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":"2017-08-02T21:07:04.000Z","updated_at":"2025-05-12T00:17:13.000Z","dependencies_parsed_at":"2024-06-16T05:33:01.260Z","dependency_job_id":"4d2ebd29-e0d5-486c-b098-512fcf744d0d","html_url":"https://github.com/tighten/ziggy","commit_stats":{"total_commits":529,"total_committers":79,"mean_commits":6.69620253164557,"dds":0.6502835538752363,"last_synced_commit":"abd6854d29f892f9ac80a5837acc0d91e8412365"},"previous_names":["tightenco/ziggy"],"tags_count":89,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tighten%2Fziggy","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tighten%2Fziggy/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tighten%2Fziggy/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tighten%2Fziggy/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/tighten","download_url":"https://codeload.github.com/tighten/ziggy/tar.gz/refs/heads/2.x","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":253672736,"owners_count":21945483,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":["javascript","laravel","routes","ziggy"],"created_at":"2024-07-30T18:00:41.206Z","updated_at":"2025-05-12T05:34:17.118Z","avatar_url":"https://github.com/tighten.png","language":"JavaScript","funding_links":[],"categories":["Popular Packages","JavaScript"],"sub_categories":[],"readme":"![Ziggy - Use your Laravel routes in JavaScript](https://raw.githubusercontent.com/tighten/ziggy/main/ziggy-banner.png)\n\n# Ziggy – Use your Laravel routes in JavaScript\n\n[![GitHub Actions Status](https://img.shields.io/github/actions/workflow/status/tighten/ziggy/test.yml?branch=main\u0026style=flat)](https://github.com/tighten/ziggy/actions?query=workflow:Tests+branch:main)\n[![Latest Version on Packagist](https://img.shields.io/packagist/v/tightenco/ziggy.svg?style=flat)](https://packagist.org/packages/tightenco/ziggy)\n[![Downloads on Packagist](https://img.shields.io/packagist/dt/tightenco/ziggy.svg?style=flat)](https://packagist.org/packages/tightenco/ziggy)\n[![Latest Version on NPM](https://img.shields.io/npm/v/ziggy-js.svg?style=flat)](https://npmjs.com/package/ziggy-js)\n[![Downloads on NPM](https://img.shields.io/npm/dt/ziggy-js.svg?style=flat)](https://npmjs.com/package/ziggy-js)\n\nZiggy provides a JavaScript `route()` function that works like Laravel's, making it a breeze to use your named Laravel routes in JavaScript.\n\n- [**Installation**](#installation)\n- [**Usage**](#usage)\n    - [`route()` function](#route-function)\n    - [`Router` class](#router-class)\n    - [Route-model binding](#route-model-binding)\n    - [TypeScript](#typescript)\n- [**JavaScript frameworks**](#javascript-frameworks)\n    - [Generating and importing Ziggy's configuration](#generating-and-importing-ziggys-configuration)\n    - [Importing the `route()` function](#importing-the-route-function)\n    - [Vue](#vue)\n    - [React](#react)\n    - [SPAs or separate repos](#spas-or-separate-repos)\n- [**Filtering Routes**](#filtering-routes)\n    - [Including/excluding routes](#includingexcluding-routes)\n    - [Filtering with groups](#filtering-with-groups)\n- [**Other**](#other)\n- [**Contributing**](#contributing)\n\n## Installation\n\nInstall Ziggy in your Laravel app with Composer:\n\n```bash\ncomposer require tightenco/ziggy\n```\n\nAdd the `@routes` Blade directive to your main layout (_before_ your application's JavaScript), and the `route()` helper function will be available globally!\n\n\u003e By default, the output of the `@routes` Blade directive includes a list of all your application's routes and their parameters. This route list is included in the HTML of the page and can be viewed by end users. To configure which routes are included in this list, or to show and hide different routes on different pages, see [Filtering Routes](#filtering-routes).\n\n## Usage\n\n### `route()` function\n\nZiggy's `route()` function works like [Laravel's `route()` helper](https://laravel.com/docs/helpers#method-route)—you can pass it the name of a route, and the parameters you want to pass to the route, and it will generate a URL.\n\n#### Basic usage\n\n```php\nRoute::get('posts', fn (Request $request) =\u003e /* ... */)-\u003ename('posts.index');\n```\n\n```js\nroute('posts.index'); // 'https://ziggy.test/posts'\n```\n\n#### Parameters\n\n```php\nRoute::get('posts/{post}', fn (Post $post) =\u003e /* ... */)-\u003ename('posts.show');\n```\n\n```js\nroute('posts.show', 1);           // 'https://ziggy.test/posts/1'\nroute('posts.show', [1]);         // 'https://ziggy.test/posts/1'\nroute('posts.show', { post: 1 }); // 'https://ziggy.test/posts/1'\n```\n\n#### Multiple parameters\n\n```php\nRoute::get('venues/{venue}/events/{event}', fn (Venue $venue, Event $event) =\u003e /* ... */)\n    -\u003ename('venues.events.show');\n```\n\n```js\nroute('venues.events.show', [1, 2]);                 // 'https://ziggy.test/venues/1/events/2'\nroute('venues.events.show', { venue: 1, event: 2 }); // 'https://ziggy.test/venues/1/events/2'\n```\n\n#### Query parameters\n\nZiggy adds arguments that don't match any named route parameters as query parameters:\n\n```php\nRoute::get('venues/{venue}/events/{event}', fn (Venue $venue, Event $event) =\u003e /* ... */)\n    -\u003ename('venues.events.show');\n```\n\n```js\nroute('venues.events.show', {\n    venue: 1,\n    event: 2,\n    page: 5,\n    count: 10,\n});\n// 'https://ziggy.test/venues/1/events/2?page=5\u0026count=10'\n```\n\nIf you need to pass a query parameter with the same name as a route parameter, nest it under the special `_query` key:\n\n```js\nroute('venues.events.show', {\n    venue: 1,\n    event: 2,\n    _query: {\n        event: 3,\n        page: 5,\n    },\n});\n// 'https://ziggy.test/venues/1/events/2?event=3\u0026page=5'\n```\n\nLike Laravel, Ziggy automatically encodes boolean query parameters as integers in the query string:\n\n```js\nroute('venues.events.show', {\n    venue: 1,\n    event: 2,\n    _query: {\n        draft: false,\n        overdue: true,\n    },\n});\n// 'https://ziggy.test/venues/1/events/2?draft=0\u0026overdue=1'\n```\n\n#### Default parameter values\n\nZiggy supports default route parameter values ([Laravel docs](https://laravel.com/docs/urls#default-values)).\n\n```php\nRoute::get('{locale}/posts/{post}', fn (Post $post) =\u003e /* ... */)-\u003ename('posts.show');\n```\n\n```php\n// app/Http/Middleware/SetLocale.php\n\nURL::defaults(['locale' =\u003e $request-\u003euser()-\u003elocale ?? 'de']);\n```\n\n```js\nroute('posts.show', 1); // 'https://ziggy.test/de/posts/1'\n```\n\n#### Examples\n\nHTTP request with `axios`:\n\n```js\nconst post = { id: 1, title: 'Ziggy Stardust' };\n\nreturn axios.get(route('posts.show', post)).then((response) =\u003e response.data);\n```\n\n### `Router` class\n\nCalling Ziggy's `route()` function with no arguments will return an instance of its JavaScript `Router` class, which has some other useful properties and methods.\n\n#### Check the current route: `route().current()`\n\n```js\n// Laravel route called 'events.index' with URI '/events'\n// Current window URL is https://ziggy.test/events\n\nroute().current();               // 'events.index'\nroute().current('events.index'); // true\nroute().current('events.*');     // true\nroute().current('events.show');  // false\n```\n\n`route().current()` optionally accepts parameters as its second argument, and will check that their values also match in the current URL:\n\n```js\n// Laravel route called 'venues.events.show' with URI '/venues/{venue}/events/{event}'\n// Current window URL is https://myapp.com/venues/1/events/2?hosts=all\n\nroute().current('venues.events.show', { venue: 1 });           // true\nroute().current('venues.events.show', { venue: 1, event: 2 }); // true\nroute().current('venues.events.show', { hosts: 'all' });       // true\nroute().current('venues.events.show', { venue: 6 });           // false\n```\n\n#### Check if a route exists: `route().has()`\n\n```js\n// Laravel app has only one named route, 'home'\n\nroute().has('home');   // true\nroute().has('orders'); // false\n```\n\n#### Retrieve the current route params: `route().params`\n\n```js\n// Laravel route called 'venues.events.show' with URI '/venues/{venue}/events/{event}'\n// Current window URL is https://myapp.com/venues/1/events/2?hosts=all\n\nroute().params; // { venue: '1', event: '2', hosts: 'all' }\n```\n\n\u003e Note: parameter values retrieved with `route().params` will always be returned as strings.\n\n### Route-model binding\n\nZiggy supports Laravel's [route-model binding](https://laravel.com/docs/routing#route-model-binding), and can even recognize custom route key names. If you pass `route()` a JavaScript object as a route parameter, Ziggy will use the registered route-model binding keys for that route to find the correct parameter value inside the object. If no route-model binding keys are explicitly registered for a parameter, Ziggy will use the object's `id` key.\n\n```php\n// app/Models/Post.php\n\nclass Post extends Model\n{\n    public function getRouteKeyName()\n    {\n        return 'slug';\n    }\n}\n```\n\n```php\nRoute::get('blog/{post}', function (Post $post) {\n    return view('posts.show', ['post' =\u003e $post]);\n})-\u003ename('posts.show');\n```\n\n```js\nconst post = {\n    id: 3,\n    title: 'Introducing Ziggy v1',\n    slug: 'introducing-ziggy-v1',\n    date: '2020-10-23T20:59:24.359278Z',\n};\n\n// Ziggy knows that this route uses the 'slug' route-model binding key:\n\nroute('posts.show', post); // 'https://ziggy.test/blog/introducing-ziggy-v1'\n```\n\nZiggy also supports [custom keys](https://laravel.com/docs/routing#customizing-the-key) for scoped bindings declared directly in a route definition:\n\n```php\nRoute::get('authors/{author}/photos/{photo:uuid}', fn (Author $author, Photo $photo) =\u003e /* ... */)\n    -\u003ename('authors.photos.show');\n```\n\n```js\nconst photo = {\n    uuid: '714b19e8-ac5e-4dab-99ba-34dc6fdd24a5',\n    filename: 'sunset.jpg',\n}\n\nroute('authors.photos.show', [{ id: 1, name: 'Ansel' }, photo]);\n// 'https://ziggy.test/authors/1/photos/714b19e8-ac5e-4dab-99ba-34dc6fdd24a5'\n```\n\n### TypeScript\n\nZiggy includes TypeScript type definitions, and an Artisan command that can generate additional type definitions to enable route name and parameter autocompletion.\n\nTo generate route types, run the `ziggy:generate` command with the `--types` or `--types-only` option:\n\n```bash\nphp artisan ziggy:generate --types\n```\n\nTo make your IDE aware that Ziggy's `route()` helper is available globally, and to type it correctly, add a declaration like this in a `.d.ts` file somewhere in your project:\n\n```ts\nimport { route as routeFn } from 'ziggy-js';\n\ndeclare global {\n    var route: typeof routeFn;\n}\n```\n\nIf you don't have Ziggy's NPM package installed, add the following to your `jsconfig.json` or `tsconfig.json` to load Ziggy's types from your vendor directory:\n\n```json\n{\n    \"compilerOptions\": {\n        \"paths\": {\n            \"ziggy-js\": [\"./vendor/tightenco/ziggy\"]\n        }\n    }\n}\n```\n\n## JavaScript frameworks\n\n\u003e [!NOTE]\n\u003e Many applications don't need the additional setup described here—the `@routes` Blade directive makes Ziggy's `route()` function and config available globally, including within bundled JavaScript files.\n\nIf you are not using the `@routes` Blade directive, you can import Ziggy's `route()` function and configuration directly into JavaScript/TypeScript files.\n\n### Generating and importing Ziggy's configuration\n\nZiggy provides an Artisan command to output its config and routes to a file:\n\n```bash\nphp artisan ziggy:generate\n```\n\nThis command places your configuration in `resources/js/ziggy.js` by default, but you can customize this path by passing an argument to the Artisan command or setting the `ziggy.output.path` config value.\n\nThe file `ziggy:generate` creates looks something like this:\n\n```js\n// resources/js/ziggy.js\n\nconst Ziggy = {\n    url: 'https://ziggy.test',\n    port: null,\n    routes: {\n        home: {\n            uri: '/',\n            methods: [ 'GET', 'HEAD'],\n            domain: null,\n        },\n        login: {\n            uri: 'login',\n            methods: ['GET', 'HEAD'],\n            domain: null,\n        },\n    },\n};\n\nexport { Ziggy };\n```\n\n### Importing the `route()` function\n\nYou can import Ziggy like any other JavaScript library. Without the `@routes` Blade directive Ziggy's config is not available globally, so it must be passed to the `route()` function manually:\n\n```js\nimport { route } from '../../vendor/tightenco/ziggy';\nimport { Ziggy } from './ziggy.js';\n\nroute('home', undefined, undefined, Ziggy);\n```\n\nTo simplify importing the `route()` function, you can create an alias to the vendor path:\n\n```js\n// vite.config.js\n\nexport default defineConfig({\n    resolve: {\n        alias: {\n            'ziggy-js': path.resolve('vendor/tightenco/ziggy'),\n        },\n    },\n});\n```\n\nNow your imports can be shortened to:\n\n```js\nimport { route } from 'ziggy-js';\n```\n\n### Vue\n\nZiggy includes a Vue plugin to make it easy to use the `route()` helper throughout your Vue app:\n\n```js\nimport { createApp } from 'vue';\nimport { ZiggyVue } from 'ziggy-js';\nimport App from './App.vue';\n\ncreateApp(App).use(ZiggyVue);\n```\n\nNow you can use the `route()` function anywhere in your Vue components and templates:\n\n```vue\n\u003ca class=\"nav-link\" :href=\"route('home')\"\u003eHome\u003c/a\u003e\n```\n\nWith `\u003cscript setup\u003e` in Vue 3 you can use `inject` to make the `route()` function available in your component script:\n\n```vue\n\u003cscript setup\u003e\nimport { inject } from 'vue';\n\nconst route = inject('route');\n\u003c/script\u003e\n```\n\nIf you are not using the `@routes` Blade directive, import Ziggy's configuration too and pass it to `.use()`:\n\n```js\nimport { createApp } from 'vue';\nimport { ZiggyVue } from 'ziggy-js';\nimport { Ziggy } from './ziggy.js';\nimport App from './App.vue';\n\ncreateApp(App).use(ZiggyVue, Ziggy);\n```\n\nIf you're using TypeScript, you may need to add the following declaration to a `.d.ts` file in your project to avoid type errors when using the `route()` function in your Vue component templates:\n\n```ts\ndeclare module 'vue' {\n    interface ComponentCustomProperties {\n        route: typeof routeFn;\n    }\n}\n```\n\n### React\n\nZiggy includes a `useRoute()` hook to make it easy to use the `route()` helper in your React app:\n\n```jsx\nimport React from 'react';\nimport { useRoute } from 'ziggy-js';\n\nexport default function PostsLink() {\n    const route = useRoute();\n\n    return \u003ca href={route('posts.index')}\u003ePosts\u003c/a\u003e;\n}\n```\n\nIf you are not using the `@routes` Blade directive, import Ziggy's configuration too and pass it to `useRoute()`:\n\n```jsx\nimport React from 'react';\nimport { useRoute } from 'ziggy-js';\nimport { Ziggy } from './ziggy.js';\n\nexport default function PostsLink() {\n    const route = useRoute(Ziggy);\n\n    return \u003ca href={route('posts.index')}\u003ePosts\u003c/a\u003e;\n}\n```\n\nYou can also make the `Ziggy` config object available globally, so you can call `useRoute()` without passing Ziggy's configuration to it every time:\n\n```js\n// app.js\nimport { Ziggy } from './ziggy.js';\nglobalThis.Ziggy = Ziggy;\n```\n\n### SPAs or separate repos\n\nZiggy's `route()` function is available as an NPM package, for use in JavaScript projects managed separately from their Laravel backend (i.e. without Composer or a `vendor` directory). You can install the NPM package with `npm install ziggy-js`.\n\nTo make your routes available on the frontend for this function to use, you can either run `php artisan ziggy:generate` and add the generated config file to your frontend project, or you can return Ziggy's config as JSON from an endpoint in your Laravel API (see [Retrieving Ziggy's config from an API endpoint](#retrieving-ziggys-config-from-an-api-endpoint) below for an example of how to set this up).\n\n## Filtering Routes\n\nZiggy supports filtering the list of routes it outputs, which is useful if you have certain routes that you don't want to be included and visible in your HTML source.\n\n\u003e [!IMPORTANT]\n\u003e Hiding routes from Ziggy's output is not a replacement for thorough authentication and authorization. Routes that should not be accessibly publicly should be protected by authentication whether they're filtered out of Ziggy's output or not.\n\n### Including/excluding routes\n\nTo set up route filtering, create a config file in your Laravel app at `config/ziggy.php` and add **either** an `only` or `except` key containing an array of route name patterns.\n\n\u003e Note: You have to choose one or the other. Setting both `only` and `except` will disable filtering altogether and return all named routes.\n\n```php\n// config/ziggy.php\n\nreturn [\n    'only' =\u003e ['home', 'posts.index', 'posts.show'],\n];\n```\n\nYou can use asterisks as wildcards in route filters. In the example below, `admin.*` will exclude routes named `admin.login`, `admin.register`, etc.:\n\n```php\n// config/ziggy.php\n\nreturn [\n    'except' =\u003e ['_debugbar.*', 'horizon.*', 'admin.*'],\n];\n```\n\n### Filtering with groups\n\nYou can also define groups of routes that you want make available in different places in your app, using a `groups` key in your config file:\n\n```php\n// config/ziggy.php\n\nreturn [\n    'groups' =\u003e [\n        'admin' =\u003e ['admin.*', 'users.*'],\n        'author' =\u003e ['posts.*'],\n    ],\n];\n```\n\nThen, you can expose a specific group by passing the group name into the `@routes` Blade directive:\n\n```blade\n{{-- authors.blade.php --}}\n\n@routes('author')\n```\n\nTo expose multiple groups you can pass an array of group names:\n\n```blade\n{{-- admin.blade.php --}}\n\n@routes(['admin', 'author'])\n```\n\n\u003e Note: Passing group names to the `@routes` directive will always take precedence over your other `only` or `except` settings.\n\n## Other\n\n### TLS/SSL termination and trusted proxies\n\n\u003c!-- Or: What to do if your app is served over `https` but Ziggy's `route()` helper generates `http` URLs --\u003e\n\nIf your application is using [TLS/SSL termination](https://en.wikipedia.org/wiki/TLS_termination_proxy) or is behind a load balancer or proxy, or if it's hosted on a service that is, Ziggy may generate URLs with a scheme of `http` instead of `https`, even if your app URL uses `https`. To fix this, set up your Laravel app's trusted proxies according to the documentation on [Configuring Trusted Proxies](https://laravel.com/docs/requests#configuring-trusted-proxies).\n\n### Using `@routes` with a Content Security Policy\n\nA [Content Security Policy](https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP) (CSP) may block inline scripts, including those output by Ziggy's `@routes` Blade directive. If you have a CSP and are using a nonce to flag safe inline scripts, you can pass the nonce to the `@routes` directive and it will be added to Ziggy's script tag:\n\n```php\n@routes(nonce: 'your-nonce-here')\n```\n\n### Disabling the `route()` helper\n\nIf you only want to use the `@routes` directive to make Ziggy's configuration available in JavaScript, but don't need the `route()` helper function, set the `ziggy.skip-route-function` config to `true`.\n\n### Retrieving Ziggy's config from an API endpoint\n\nIf you need to retrieve Ziggy's config from your Laravel backend over the network, you can create a route that looks something like this:\n\n```php\n// routes/api.php\n\nuse Tighten\\Ziggy\\Ziggy;\n\nRoute::get('ziggy', fn () =\u003e response()-\u003ejson(new Ziggy));\n```\n\n### Re-generating the routes file when your app routes change\n\nIf you are generating your Ziggy config as a file by running `php artisan ziggy:generate`, you may want to re-run that command when your app's route files change. The example below is a Laravel Mix plugin, but similar functionality could be achieved without Mix. Huge thanks to [Nuno Rodrigues](https://github.com/nacr) for [the idea and a sample implementation](https://github.com/tighten/ziggy/issues/321#issuecomment-689150082). See [#655](https://github.com/tighten/ziggy/pull/655/files#diff-4aeb78f813e14842fcf95bdace9ced23b8a6eed60b23c165eaa52e8db2f97b61) or [vite-plugin-ziggy](https://github.com/aniftyco/vite-plugin-ziggy) for Vite examples.\n\n\u003cdetails\u003e\n\u003csummary\u003eLaravel Mix plugin example\u003c/summary\u003e\n\u003cp\u003e\u003c/p\u003e\n\n```js\nconst mix = require('laravel-mix');\nconst { exec } = require('child_process');\n\nmix.extend('ziggy', new class {\n    register(config = {}) {\n        this.watch = config.watch ?? ['routes/**/*.php'];\n        this.path = config.path ?? '';\n        this.enabled = config.enabled ?? !Mix.inProduction();\n    }\n\n    boot() {\n        if (!this.enabled) return;\n\n        const command = () =\u003e exec(\n            `php artisan ziggy:generate ${this.path}`,\n            (error, stdout, stderr) =\u003e console.log(stdout)\n        );\n\n        command();\n\n        if (Mix.isWatching() \u0026\u0026 this.watch) {\n            ((require('chokidar')).watch(this.watch))\n                .on('change', (path) =\u003e {\n                    console.log(`${path} changed...`);\n                    command();\n                });\n        };\n    }\n}());\n\nmix.js('resources/js/app.js', 'public/js')\n    .postCss('resources/css/app.css', 'public/css', [])\n    .ziggy();\n```\n\u003c/details\u003e\n\n## Contributing\n\nTo get started contributing to Ziggy, check out [the contribution guide](CONTRIBUTING.md).\n\n## Credits\n\n- [Daniel Coulbourne](https://twitter.com/DCoulbourne)\n- [Jake Bathman](https://twitter.com/jakebathman)\n- [Matt Stauffer](https://twitter.com/stauffermatt)\n- [Jacob Baker-Kretzmar](https://twitter.com/bakerkretzmar)\n- [All contributors](https://github.com/tighten/ziggy/contributors)\n\nThanks to [Caleb Porzio](http://twitter.com/calebporzio), [Adam Wathan](http://twitter.com/adamwathan), and [Jeffrey Way](http://twitter.com/jeffrey_way) for help solidifying the idea.\n\n## Security\n\nPlease review our [security policy](../../security/policy) on how to report security vulnerabilities.\n\n## License\n\nZiggy is open-source software released under the MIT license. See [LICENSE](LICENSE) for more information.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftighten%2Fziggy","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftighten%2Fziggy","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftighten%2Fziggy/lists"}