Skip to content
A document head manager for React
Branch: master
Clone or download
Type Name Latest commit message Commit time
Failed to load latest commit information.
src Bundle helmet using rollup (#395) Dec 4, 2018
test Bundle helmet using rollup (#395) Dec 4, 2018
.babelrc Bundle helmet using rollup (#395) Dec 4, 2018
.editorconfig NPM Package updates and improved babel compiling (#179) Oct 29, 2016
.gitignore chore: add codecov (#251) Mar 21, 2017
.npmignore Bundle helmet using rollup (#395) Dec 4, 2018
.nvmrc NPM Package updates and improved babel compiling (#179) Oct 29, 2016
.travis.yml Update .travis.yml (#417) Nov 25, 2018 docs: Fixed CHANGELOG comparison link between 5.2.0 and 6.0.0-beta Jan 3, 2019 Create (#429) Dec 30, 2018 3.1.0 Apr 25, 2016
karma.config.js Release/6.0.0 beta (#421) Dec 7, 2018
package-lock.json Replace deepEqual with isEqual (#402) Nov 16, 2018
rollup.config.js Bundle helmet using rollup (#395) Dec 4, 2018
yarn.lock Release/6.0.0 beta (#421) Dec 7, 2018

React Helmet

npm Version Build Status Dependency Status PRs Welcome

This reusable React component will manage all of your changes to the document head.

Helmet takes plain HTML tags and outputs plain HTML tags. It's dead simple, and React beginner friendly.


import React from "react";
import {Helmet} from "react-helmet";

class Application extends React.Component {
  render () {
    return (
        <div className="application">
                <meta charSet="utf-8" />
                <title>My Title</title>
                <link rel="canonical" href="" />

Nested or latter components will override duplicate changes:

        <title>My Title</title>
        <meta name="description" content="Helmet application" />

            <title>Nested Title</title>
            <meta name="description" content="Nested component" />


    <title>Nested Title</title>
    <meta name="description" content="Nested component">

See below for a full reference guide.


  • Supports all valid head tags: title, base, meta, link, script, noscript, and style tags.
  • Supports attributes for body, html and title tags.
  • Supports server-side rendering.
  • Nested components override duplicate head changes.
  • Duplicate head changes are preserved when specified in the same component (support for tags like "apple-touch-icon").
  • Callback for tracking DOM changes.


Helmet 5 is fully backward-compatible with previous Helmet releases, so you can upgrade at any time without fear of breaking changes. We encourage you to update your code to our more semantic API, but please feel free to do so at your own pace.



yarn add react-helmet


npm install --save react-helmet

Server Usage

To use on the server, call Helmet.renderStatic() after ReactDOMServer.renderToString or ReactDOMServer.renderToStaticMarkup to get the head data for use in your prerender.

Because this component keeps track of mounted instances, you have to make sure to call renderStatic on server, or you'll get a memory leak.

ReactDOMServer.renderToString(<Handler />);
const helmet = Helmet.renderStatic();

This helmet instance contains the following properties:

  • base
  • bodyAttributes
  • htmlAttributes
  • link
  • meta
  • noscript
  • script
  • style
  • title

Each property contains toComponent() and toString() methods. Use whichever is appropriate for your environment. For attributes, use the JSX spread operator on the object returned by toComponent(). E.g:

As string output

const html = `
    <!doctype html>
    <html ${helmet.htmlAttributes.toString()}>
        <body ${helmet.bodyAttributes.toString()}>
            <div id="content">
                // React stuff here

As React components

function HTML () {
    const htmlAttrs = helmet.htmlAttributes.toComponent();
    const bodyAttrs = helmet.bodyAttributes.toComponent();

    return (
        <html {...htmlAttrs}>
            <body {...bodyAttrs}>
                <div id="content">
                    // React stuff here

Reference Guide

    {/* (optional) set to false to disable string encoding (server-only) */}

        (optional) Useful when you want titles to inherit from a template:

            titleTemplate="%s |"
            <title>Nested Title</title>


            <title>Nested Title |</title>
    titleTemplate=" - %s"

        (optional) used as a fallback when a template exists but a title is not defined

            defaultTitle="My Site"
            titleTemplate="My Site - %s"


            <title>My Site</title>
    defaultTitle="My Default Title"

    {/* (optional) callback that tracks DOM changes */}
    onChangeClientState={(newState, addedTags, removedTags) => console.log(newState, addedTags, removedTags)}
    {/* html attributes */}
    <html lang="en" amp />

    {/* body attributes */}
    <body className="root" />

    {/* title attributes and value */}
    <title itemProp="name" lang="en">My Plain Title or {`dynamic`} title</title>

    {/* base element */}
    <base target="_blank" href="" />

    {/* multiple meta elements */}
    <meta name="description" content="Helmet application" />
    <meta property="og:type" content="article" />

    {/* multiple link elements */}
    <link rel="canonical" href="" />
    <link rel="apple-touch-icon" href="" />
    <link rel="apple-touch-icon" sizes-"72x72" href="" />
    { => {
        <link rel="alternate" href="{locale}" hrefLang={locale} key={locale}/>

    {/* multiple script elements */}
    <script src="" type="text/javascript" />

    {/* inline script elements */}
    <script type="application/ld+json">{`
            "@context": ""

    {/* noscript elements */}
        <link rel="stylesheet" type="text/css" href="foo.css" />

    {/* inline style elements */}
    <style type="text/css">{`
        body {
            background-color: blue;

        p {
            font-size: 12px;

Contributing to this project

Please take a moment to review the guidelines for contributing.



You can’t perform that action at this time.