{"id":13747290,"url":"https://github.com/stimulusreflex/futurism","last_synced_at":"2025-10-22T03:07:40.841Z","repository":{"id":39685512,"uuid":"278320564","full_name":"stimulusreflex/futurism","owner":"stimulusreflex","description":"Lazy-load Rails partials via CableReady","archived":false,"fork":false,"pushed_at":"2024-10-28T19:18:16.000Z","size":607,"stargazers_count":407,"open_issues_count":13,"forks_count":19,"subscribers_count":7,"default_branch":"master","last_synced_at":"2024-10-28T20:24:34.889Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Ruby","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/stimulusreflex.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":".github/FUNDING.yml","license":"MIT-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},"funding":{"github":"julianrubisch"}},"created_at":"2020-07-09T09:25:49.000Z","updated_at":"2024-10-28T19:18:13.000Z","dependencies_parsed_at":"2023-12-05T09:26:24.569Z","dependency_job_id":"7acdf1f4-6702-4c66-b005-88c6c502b391","html_url":"https://github.com/stimulusreflex/futurism","commit_stats":{"total_commits":426,"total_committers":19,"mean_commits":22.42105263157895,"dds":0.5422535211267605,"last_synced_commit":"45ddffa7a5d899e86baaca83e7e83979885a0231"},"previous_names":["julianrubisch/futurism"],"tags_count":42,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stimulusreflex%2Ffuturism","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stimulusreflex%2Ffuturism/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stimulusreflex%2Ffuturism/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stimulusreflex%2Ffuturism/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/stimulusreflex","download_url":"https://codeload.github.com/stimulusreflex/futurism/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":224609085,"owners_count":17339785,"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":[],"created_at":"2024-08-03T06:01:24.032Z","updated_at":"2025-10-22T03:07:35.797Z","avatar_url":"https://github.com/stimulusreflex.png","language":"Ruby","funding_links":["https://github.com/sponsors/julianrubisch"],"categories":["Ruby"],"sub_categories":[],"readme":"# Futurism\n[![Twitter follow](https://img.shields.io/twitter/follow/julian_rubisch?style=social)](https://twitter.com/julian_rubisch)\n\u003c!-- ALL-CONTRIBUTORS-BADGE:START - Do not remove or modify this section --\u003e\n[![All Contributors](https://img.shields.io/badge/all_contributors-15-orange.svg?style=flat-square)](#contributors-)\n\u003c!-- ALL-CONTRIBUTORS-BADGE:END --\u003e\nLazy-load Rails partials via CableReady\n\n:rotating_light: *BREAKING CHANGE: With v1.0, futurism has been transferred to the [stimulusreflex](https://github.com/stimulusreflex) organization. Please update your npm package to `@stimulus_reflex/futurism` accordingly* :rotating_light:\n\n\u003cimg src=\"https://user-images.githubusercontent.com/4352208/88374198-9e6f3500-cd99-11ea-804b-0216ed320eff.jpg\" alt=\"birmingham-museums-trust-GrvC6MI-z4w-unsplash\" width=\"50%\" align=\"center\"/\u003e\n\u003cspan\u003ePhoto by \u003ca href=\"https://unsplash.com/@birminghammuseumstrust?utm_source=unsplash\u0026amp;utm_medium=referral\u0026amp;utm_content=creditCopyText\"\u003eBirmingham Museums Trust\u003c/a\u003e on \u003ca href=\"https://unsplash.com/s/photos/futurism?utm_source=unsplash\u0026amp;utm_medium=referral\u0026amp;utm_content=creditCopyText\"\u003eUnsplash\u003c/a\u003e\u003c/span\u003e\n\n## Table of Contents\n\n- [Table of Contents](#table-of-contents)\n- [Facts](#facts)\n  - [Browser Support](#browser-support)\n- [Usage](#usage)\n- [API](#api)\n  - [Resource](#resource)\n  - [Explicit Partial](#explicit-partial)\n  - [HTML Options](#html-options)\n  - [Eager Loading](#eager-loading)\n  - [Bypassing](#bypassing)\n  - [Broadcast Partials Individually](#broadcast-partials-individually)\n  - [Contextual Placeholder Arguments](#contextual-placeholder-arguments)\n- [Events](#events)\n- [Instrumentation](#instrumentation)\n- [Installation](#installation)\n  - [Manual Installation](#manual-installation)\n- [Authentication](#authentication)\n- [Testing](#testing)\n- [Gotchas](#gotchas)\n- [Contributing](#contributing)\n- [License](#license)\n- [Contributors](#contributors)\n\n## Facts\n- only one dependency: CableReady\n- bundle size (without CableReady) is around [~2.46kB](https://bundlephobia.com/result?p=@stimulus_reflex/futurism@0.7.2)\n\n### Browser Support\n\n- Chrome v67+ (v54+ via Polyfill)\n- Firefox v63+\n- Edge v79+\n- Safari v10.1+ via Polyfill\n- iOS Safari \u0026 Chrome v10.3+ via Polyfill\n\n[Caniuse](https://www.caniuse.com/#search=custom%20elements)\n\n## Usage\nwith a helper in your template\n\n```erb\n\u003c%= futurize @posts, extends: :div do %\u003e\n  \u003c!-- placeholder --\u003e\n\u003c% end %\u003e\n```\n\ncustom `\u003cfuturism-element\u003e`s (in the form of a `\u003cdiv\u003e` or a `\u003ctr is=\"futurism-table-row\"\u003e` are rendered. Those custom elements have an `IntersectionObserver` attached that will send a signed global id to an ActionCable channel (`FuturismChannel`) which will then replace the placeholders with the actual resource partial.\n\nWith that method, you could lazy load every class that has to_partial_path defined (ActiveModel has by default).\n\nYou can pass the placeholder as a block:\n\n```erb\n\u003c%= futurize @posts, extends: :tr do %\u003e\n  \u003ctd class=\"placeholder\"\u003e\u003c/td\u003e\n\u003c% end %\u003e\n```\n\n![aa601dec1930151f71dbf0d6b02b61c9](https://user-images.githubusercontent.com/4352208/87131629-f768a480-c294-11ea-89a9-ea0a76ee06ef.gif)\n\nYou can also omit the placeholder, which falls back to [eager loading](#eager-loading).\n\n## API\n\nCurrently there are two ways to call `futurize`, designed to wrap `render`'s behavior:\n\n### Resource\n\nYou can pass a single `ActiveRecord` or an `ActiveRecord::Relation` to `futurize`, just as you would call `render`:\n\n```erb\n\u003c%= futurize @posts, extends: :tr do %\u003e\n  \u003ctd class=\"placeholder\"\u003e\u003c/td\u003e\n\u003c% end %\u003e\n```\n\n#### Partial Path\n\nRemember that you can override the partial path in you models, like so:\n\n```rb\nclass Post \u003c ApplicationRecord\n  def to_partial_path\n    \"home/post\"\n  end\nend\n```\n\nThat way you get maximal flexibility when just specifying a single resource.\n\n### Explicit Partial\n\nCall `futurize` with a `partial` keyword:\n\n```erb\n\u003c%= futurize partial: \"items/card\", locals: {card: @card}, extends: :div do %\u003e\n  \u003cdiv class=\"spinner\"\u003e\u003c/div\u003e\n\u003c% end %\u003e\n```\n\nYou can also use the shorthand syntax:\n\n```erb\n\u003c%= futurize \"items/card\", card: @card, extends: :div do %\u003e\n  \u003cdiv class=\"spinner\"\u003e\u003c/div\u003e\n\u003c% end %\u003e\n```\n\n#### Collections\n\nCollection rendering is also possible:\n\n```erb\n\u003c%= futurize partial: \"items/card\", collection: @cards, extends: :div do %\u003e\n  \u003cdiv class=\"spinner\"\u003e\u003c/div\u003e\n\u003c% end %\u003e\n```\n\n#### Specifying Controller to Render\n\nYou can also pass in the controller that will be used to render the partial.\n\n```erb\n\u003c%= futurize partial: \"items/card\", collection: @cards, controller: MyController, extends: :div do %\u003e\n  \u003cdiv class=\"spinner\"\u003e\u003c/div\u003e\n\u003c% end %\u003e\n```\n\nBy default (i.e. not passing in a value), futurize will use `ApplicationController`, but you may override by setting the Futurism default controller in an initializer, for example `config/initializers/futurism.rb`.\n\n```ruby\nFuturism.default_controller = \"MyController\" # to avoid the controller from trying to autoload at boot, provide as a string\n```\n\n### HTML Options\n\nYou can pass a hash of attribute/value pairs which will be mixed into the HTML markup for the placeholder element. This is important for layouts that require elements to have dimensionality. For example, many scripts calculate size based on element height and width. This option ensures that your elements have integrity, even if they are gone before you see them.\n\n```erb\n\u003c%= futurize @posts, extends: :tr, html_options: {style: \"width: 50px; height: 50px;\"} do %\u003e\n  \u003ctd class=\"placeholder\"\u003e\u003c/td\u003e\n\u003c% end %\u003e\n```\n\nThis will output the following:\n\n```html\n\u003ctr style=\"width: 50px; height: 50px;\"\u003e\n  \u003ctd class=\"placeholder\"\u003e\u003c/td\u003e\n\u003c/tr\u003e\n```\n\n### Eager Loading\nIt may sound surprising to support eager loading in a lazy loading library :joy:, but there's a quite simple use case:\n\nSuppose you have some hidden interactive portion of your page, like a tab or dropdown. You don't want its content to block the initial page load, but once that is done, you occasionally don't want to wait for the element to become visible and trigger the `IntersectionObserver`, you want to lazy load its contents right after it's added to the DOM.\n\nFuturism makes that dead simple:\n\n```erb\n\u003c%= futurize 'some_tab', eager: true, extends: :tr do %\u003e\n  \u003cdiv class=\"placeholder\"\u003c/td\u003e\n\u003c% end %\u003e\n```\n\n### Bypassing\n\nIn some rare cases, e.g. when combined with CableReady's async `updates_for` mechanism, you'll want to bypass futurism entirely and fall back to native `rendering`. You can do this by passing an `unless` option:\n\n```erb\n\u003c%= futurize 'some_tab', unless: bypass_futurism?, extends: :tr do %\u003e\n  \u003cdiv class=\"placeholder\"\u003c/td\u003e\n\u003c% end %\u003e\n```\n\nInternally, this works the same as [bypassing futurism in tests](#testing)\n\n\n### Broadcast Partials Individually\nFuturism's default behavior is to `broadcast` partials as they are generated in batches: \n\nOn the client side, `IntersectionObserver` events are triggered in a debounced fashion, so several `render`s are performed on the server for each of those events. By default, futurism will group those to a single `broadcast` call (to save server CPU time).\n\nFor collections, however, you can opt into individual broadcasts by specifying `broadcast_each: true` in your helper usage:\n\n```erb\n\u003c%= futurize @posts, broadcast_each: true, extends: :tr do %\u003e\n  \u003cdiv class=\"placeholder\"\u003c/td\u003e\n\u003c% end %\u003e\n```\n\n### Contextual Placeholder Arguments\n\nFor individual models or arbitrary collections, you can pass `record` and `index` to the placeholder block as arguments:\n\n```erb\n\u003c%= futurize @post, extends: :div do |post| %\u003e\n  \u003cdiv\u003e\u003c%= post.title %\u003e\u003c/div\u003e\n\u003c% end %\u003e\n```\n\n```erb\n\u003c%= futurize @posts, extends: :tr do |post, index| %\u003e\n  \u003ctd\u003e\u003c%= index + 1 %\u003e\u003c/td\u003e\u003ctd\u003e\u003c%= post.title %\u003e\u003c/td\u003e\n\u003c% end %\u003e\n```\n\n```erb\n\u003c%= futurize partial: \"users/user\", collection: users, extends: \"tr\" do |user, index| %\u003e\n  \u003ctd\u003e\u003c%= index + 1 %\u003e\u003c/td\u003e\u003ctd\u003e\u003c%= user.name %\u003e\u003c/td\u003e\n\u003c% end \u003e\n```\n\n## Events\n\nOnce your futurize element has been rendered, the `futurism:appeared` custom event will be called.\n\n## Instrumentation\n\nFuturism includes support for instrumenting rendering events.\n\nTo enable ActiveSupport notifications, use the `instrumentation` option:\n\n```ruby\nFuturism.instrumentation = true\n```\n\nThen subscribe to the `render.futurism` event:\n\n```ruby\nActiveSupport::Notifications.subscribe(\"render.futurism\") do |*args|\n  event = ActiveSupport::Notifications::Event.new(*args)\n  event.name                 # =\u003e \"render.futurism\"\n  event.payload[:channel]    # =\u003e \"Futurism::Channel\" # ActionCable channel to broadcast\n  event.payload[:controller] # =\u003e \"posts\"             # The controller that invokes `futurize` call\n  event.payload[:action]     # =\u003e \"show\"              # The action that invokes `futurize` call\n  event.payload[:partial]    # =\u003e \"posts/card\"        # The partial that was rendered\nend\n```\n\nThis is useful for performance monitoring, specifically for tracking the source of `futurize` calls.\n\n## Installation\nAdd this line to your application's Gemfile:\n\n```ruby\ngem 'futurism'\n```\n\nAnd then execute:\n```bash\n$ bundle\n```\n\nTo copy over the javascript files to your application, run\n\n```bash\n$ bin/rails futurism:install\n```\n\n**! Note that the installer will run `yarn add @stimulus_reflex/futurism` for you !**\n\n### Manual Installation\nAfter `bundle`, install the Javascript library:\n\nThere are a few ways to install the Futurism JavaScript client, depending on your application setup.\n\n#### ESBuild / Webpacker\n\n```sh\nyarn add @stimulus_reflex/futurism\n```\n\n#### Import maps:\n\n```ruby\n# config/importmap.rb\n# ...\npin '@stimulus_reflex/futurism', to: 'futurism.min.js', preload: true\n```\n\n#### Rails Asset pipeline (Sprockets):\n\n```html+erb\n\u003c!-- app/views/layouts/application.html.erb --\u003e\n\u003c%= javascript_include_tag \"futurism.umd.min.js\", \"data-turbo-track\": \"reload\" %\u003e\n```\n\nIn your `app/javascript/channels/index.js`, add the following\n\n```js\nimport * as Futurism from '@stimulus_reflex/futurism'\n\nimport consumer from './consumer'\n\nFuturism.initializeElements()\nFuturism.createSubscription(consumer)\n```\n\n## Authentication\nFor authentication, you can rely on ActionCable identifiers, for example, if you use Devise:\n\n```ruby\nmodule ApplicationCable\n  class Connection \u003c ActionCable::Connection::Base\n    identified_by :current_user\n\n    def connect\n      self.current_user = env[\"warden\"].user || reject_unauthorized_connection\n    end\n  end\nend\n```\n\nThe [Stimulus Reflex Docs](https://docs.stimulusreflex.com/authentication) have an excellent section about all sorts of authentication.\n\n## Testing\nIn Rails system tests there is a chance that flaky errors will occur due to Capybara not waiting for the placeholder elements to be replaced. To overcome this, add the flag\n\n```ruby\nFuturism.skip_in_test = true\n```\n\nto an initializer, for example `config/initializers/futurism.rb`.\n\n## Gotchas\n\n### ActiveStorage URLs aren't correct in development\n\nOut of the box, Rails will prefix generated urls with `http://example.org` rather than `http://localhost`, much like ActionMailer. To amend this, add\n\n```ruby\n  # config/environments/development.rb\n  config.action_controller.default_url_options = {host: \"localhost\", port: 3000}\n\n  # config/environments/production.rb\n  config.action_controller.default_url_options = {host: \"mysite.com\"}\n```\n\nto your environments.\n\n### Choosing the parent for Futurism::Channel\n\nBy default Futurism::CHannel will inherit from ApplicationCable::Channel, you can change this by setting\n\n```ruby\nFuturism.configure do |config|\n  config.parent_channel = \"CustomFuturismChannel\"\nend\n\n```\nin config/initializers.\n\n## Contributing\n\n### Get local environment setup\n\nBelow are a set of instructions that may help you get a local development environment working\n\n```shell\n# Get the gem/npm package source locally\ngit clone futurism\ncd futurism/javascript\nyarn install # install all of the npm package's dependencies\nyarn link # set the local machine's futurism npm package's lookup to this local path\n\n# Setup a sample project, use the information below directly or use your own project\ngit clone https://github.com/leastbad/stimulus_reflex_harness.git\ncd stimulus_reflex_harness\ngit checkout futurism\n# Edit Gemfile to point point to local gem (e.g. `gem \"futurism\", path: \"../futurism\"`)\n# yarn link @stimulus_reflex/futurism\n\n\n# Do your work, Submit PR, Profit!\n\n\n# To stop using your local version of futurism\n# change your Gemfile back to the published (e.g. `gem \"futurism\"`)\ncd path/to/futurism/javascript\n# Stop using the local npm package\nyarn unlink\n\n# Instruct your project to reinstall the published version of the npm package\ncd path/to/project\nyarn install --force\n```\n\n### 📦 Releasing\n\n1. Make sure that you run `yarn` and `bundle` to pick up the latest.\n2. Bump version number at `lib/futurism/version.rb`. Pre-release versions use `.preN`\n3. Run `rake build` and `yarn build`\n4. Commit and push changes to github `git commit -m \"Bump version to x.x.x\"`\n5. Run `rake release`\n6. Run `yarn publish --no-git-tag-version`\n7. Yarn will prompt you for the new version. Pre-release versions use `-preN`\n8. Commit and push changes to GitHub\n9. Create a new release on GitHub ([here](https://github.com/stimulusreflex/futurism/releases)) and generate the changelog for the stable release for it\n\n## License\nThe gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n\u003c!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section --\u003e\n\u003c!-- prettier-ignore-start --\u003e\n\u003c!-- markdownlint-disable --\u003e\n\u003ctable\u003e\n  \u003ctr\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"http://www.julianrubisch.at\"\u003e\u003cimg src=\"https://avatars0.githubusercontent.com/u/4352208?v=4?s=100\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eJulian Rubisch\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/stimulusreflex/futurism/commits?author=julianrubisch\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/darkrubyist\"\u003e\u003cimg src=\"https://avatars2.githubusercontent.com/u/11207292?v=4?s=100\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003edarkrubyist\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/stimulusreflex/futurism/commits?author=darkrubyist\" title=\"Code\"\u003e💻\u003c/a\u003e \u003ca href=\"https://github.com/stimulusreflex/futurism/commits?author=darkrubyist\" title=\"Documentation\"\u003e📖\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://ParamagicDev.github.io/portfolio\"\u003e\u003cimg src=\"https://avatars2.githubusercontent.com/u/26425882?v=4?s=100\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eKonnor Rogers\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/stimulusreflex/futurism/commits?author=ParamagicDev\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://www.andrewm.codes\"\u003e\u003cimg src=\"https://avatars1.githubusercontent.com/u/18423853?v=4?s=100\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eAndrew Mason\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"#maintenance-andrewmcodes\" title=\"Maintenance\"\u003e🚧\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"http://gorails.com\"\u003e\u003cimg src=\"https://avatars1.githubusercontent.com/u/67093?v=4?s=100\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eChris Oliver\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/stimulusreflex/futurism/commits?author=excid3\" title=\"Code\"\u003e💻\u003c/a\u003e \u003ca href=\"https://github.com/stimulusreflex/futurism/pulls?q=is%3Apr+reviewed-by%3Aexcid3\" title=\"Reviewed Pull Requests\"\u003e👀\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/leastbad\"\u003e\u003cimg src=\"https://avatars2.githubusercontent.com/u/38150464?v=4?s=100\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eleastbad\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/stimulusreflex/futurism/commits?author=leastbad\" title=\"Code\"\u003e💻\u003c/a\u003e \u003ca href=\"https://github.com/stimulusreflex/futurism/pulls?q=is%3Apr+reviewed-by%3Aleastbad\" title=\"Reviewed Pull Requests\"\u003e👀\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"http://code.digimonkey.com\"\u003e\u003cimg src=\"https://avatars0.githubusercontent.com/u/74207?v=4?s=100\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eM. E. Patterson\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/stimulusreflex/futurism/issues?q=author%3Amepatterson\" title=\"Bug reports\"\u003e🐛\u003c/a\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"http://fractaledmind.com\"\u003e\u003cimg src=\"https://avatars3.githubusercontent.com/u/5077225?v=4?s=100\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eStephen Margheim\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/stimulusreflex/futurism/commits?author=fractaledmind\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"http://hass.codes\"\u003e\u003cimg src=\"https://avatars2.githubusercontent.com/u/1064205?v=4?s=100\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eHassanin Ahmed\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/stimulusreflex/futurism/commits?author=sas1ni69\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://marcoroth.dev\"\u003e\u003cimg src=\"https://avatars2.githubusercontent.com/u/6411752?v=4?s=100\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eMarco Roth\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/stimulusreflex/futurism/commits?author=marcoroth\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://viedit.com\"\u003e\u003cimg src=\"https://avatars1.githubusercontent.com/u/49990587?v=4?s=100\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eViedit com\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/stimulusreflex/futurism/commits?author=vieditcom\" title=\"Documentation\"\u003e📖\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"http://scottbarrow.ca\"\u003e\u003cimg src=\"https://avatars2.githubusercontent.com/u/5571736?v=4?s=100\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eScott Barrow\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/stimulusreflex/futurism/commits?author=scottbarrow\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"http://domchristie.co.uk\"\u003e\u003cimg src=\"https://avatars0.githubusercontent.com/u/111734?v=4?s=100\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eDom Christie\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/stimulusreflex/futurism/pulls?q=is%3Apr+reviewed-by%3Adomchristie\" title=\"Reviewed Pull Requests\"\u003e👀\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"http://www.rickychilcott.com\"\u003e\u003cimg src=\"https://avatars1.githubusercontent.com/u/445759?v=4?s=100\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eRicky Chilcott\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/stimulusreflex/futurism/pulls?q=is%3Apr+reviewed-by%3Arickychilcott\" title=\"Reviewed Pull Requests\"\u003e👀\u003c/a\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/mansakondo\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/47113995?v=4?s=100\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003emansakondo\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/stimulusreflex/futurism/commits?author=mansakondo\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\n\u003c!-- markdownlint-restore --\u003e\n\u003c!-- prettier-ignore-end --\u003e\n\n\u003c!-- ALL-CONTRIBUTORS-LIST:END --\u003e\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstimulusreflex%2Ffuturism","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fstimulusreflex%2Ffuturism","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstimulusreflex%2Ffuturism/lists"}