diff --git a/app/router.js b/app/router.js
index bc9ff74b0..83ee06ef7 100644
--- a/app/router.js
+++ b/app/router.js
@@ -52,6 +52,8 @@ Router.map(function () {
this.route('payment-sent');
});
+ this.route('not-found', { path: '/*path' });
+
this.route('releases', function () {
this.route('beta');
this.route('canary');
diff --git a/app/routes/not-found.js b/app/routes/not-found.js
new file mode 100644
index 000000000..969fad2bb
--- /dev/null
+++ b/app/routes/not-found.js
@@ -0,0 +1,14 @@
+import Route from '@ember/routing/route';
+import { inject as service } from '@ember/service';
+
+export default class NotFoundRoute extends Route {
+ @service fastboot;
+
+ beforeModel() {
+ if (!this.fastboot.isFastBoot) {
+ return;
+ }
+
+ this.fastboot.response.statusCode = 404;
+ }
+}
diff --git a/app/templates/not-found.hbs b/app/templates/not-found.hbs
new file mode 100644
index 000000000..4cbaa2901
--- /dev/null
+++ b/app/templates/not-found.hbs
@@ -0,0 +1,6 @@
+{{page-title "Page Not Found"}}
+
+
+
Page Not Found
+
We couldn't find what you were looking for.
+
\ No newline at end of file
diff --git a/tests/acceptance/not-found-test.js b/tests/acceptance/not-found-test.js
new file mode 100644
index 000000000..0eb8807b7
--- /dev/null
+++ b/tests/acceptance/not-found-test.js
@@ -0,0 +1,32 @@
+import { visit } from '@ember/test-helpers';
+import percySnapshot from '@percy/ember';
+import { a11yAudit } from 'ember-a11y-testing/test-support';
+import { setupMirage } from 'ember-cli-mirage/test-support';
+import { setupApplicationTest } from 'ember-qunit';
+import loadDefaultScenario from 'ember-website/mirage/scenarios/default';
+import { setupPageTitleTest } from 'ember-website/tests/helpers/page-title';
+import { module, test } from 'qunit';
+
+module('Acceptance | not found', function (hooks) {
+ setupApplicationTest(hooks);
+ setupMirage(hooks);
+ setupPageTitleTest(hooks);
+
+ hooks.beforeEach(function () {
+ loadDefaultScenario(this.server);
+ });
+
+ test('Percy snapshot', async function (assert) {
+ await visit('/foo-bar-baz');
+ await percySnapshot(assert);
+
+ assert.ok(true);
+ });
+
+ test('Accessibility audit', async function (assert) {
+ await visit('/foo-bar-baz');
+ await a11yAudit();
+
+ assert.hasPageTitle('Page Not Found - Ember.js');
+ });
+});
diff --git a/tests/unit/routes/not-found-test.js b/tests/unit/routes/not-found-test.js
new file mode 100644
index 000000000..bbac05b01
--- /dev/null
+++ b/tests/unit/routes/not-found-test.js
@@ -0,0 +1,12 @@
+import { setupTest } from 'ember-qunit';
+import { module, test } from 'qunit';
+
+module('Unit | Route | not-found', function (hooks) {
+ setupTest(hooks);
+
+ test('it exists', function (assert) {
+ const route = this.owner.lookup('route:not-found');
+
+ assert.ok(route);
+ });
+});