An error has occurred

{{terminalError}}

Pi Day Flash Sale

Subscribe and save 25% to unlock the missing piece of the pie this year – unlimited access to emerging technology news, insights & trends. Cancel anytime.

  • Monthly Digital

    $8 / month
    Subscribe now
    • Unlimited access to our website
    • 6 new digital issues each year
    • Exclusive access to the magazine archives
    • 10% discount on all events + access to our new event series, Roundtables
  • Annual Digital + Print

    $120 $90 / year
    Subscribe now
    • 6 print + digital issues each year
    • Unlimited access to our website and app
    • Exclusive access to the magazine archives
    • 10% discount on all events + access to our new event series, Roundtables
  • Annual Digital

    $80 $60 / year
    Subscribe now
    • Unlimited access to our website
    • 6 new digital issues each year
    • Exclusive access to the magazine archives
    • 10% discount on all events + access to our new event series, Roundtables

Other subscription options

Why subscribe to MIT Technology Review?

  • Exclusive access to expert insights

    Get access to credible insights with MIT that can't be found anywhere else.

  • Decipher the complexity of the world

    Understand the complex science and technology shaping our future.

  • Indulge your curiosity

    Be inspired by a wide range of technology topics that have the potential to change our lives.

const targetAnchorsClass = "a.card__button"; const capturedAngularElementId = "landing-page-new-custom-field"; changeAnchorParams(targetAnchorsClass, capturedAngularElementId); function changeAnchorParams(anchorClass, angularId) { const domElement = document.getElementById(angularId); const ngElement = angular.element(domElement); ngElement.scope().$watchCollection("params", (newParams, oldParams) => { if (newParams.url === oldParams.url) return; const userUrl = newParams.url; const paramsToReplace = new URL(userUrl).searchParams; if (0 === [...paramsToReplace.keys()].length) return; const anchorsToChange = document.querySelectorAll(anchorClass); if (0 === anchorsToChange.length) return; anchorsToChange.forEach((anchor) => { const anchorHref = new URL(anchor.href); const anchorSearchParams = anchorHref.searchParams; [...paramsToReplace.keys()].forEach((param) => { if (!param.startsWith("utm_") && !param.startsWith("itm_")) return; if (anchorSearchParams.has(param)) return; anchorSearchParams.set(param, paramsToReplace.get(param)); }); const newAnchorHref = anchorHref.toString(); anchor.href = decodeURIComponent(newAnchorHref); }); }); }