diff --git a/addon/helpers/parcel-box-image.js b/addon/helpers/parcel-box-image.js
new file mode 100644
index 000000000..5d28d8f53
--- /dev/null
+++ b/addon/helpers/parcel-box-image.js
@@ -0,0 +1,16 @@
+import { helper } from '@ember/component/helper';
+
+// Each URL is written out in full so a production build's fingerprinting
+// (broccoli-asset-rev) rewrites it to the hashed file name. An interpolated
+// path such as `boxes/${size}.png` is never rewritten, so it misses the
+// fingerprinted file and the server answers with the console's index.html.
+const PARCEL_BOX_IMAGES = {
+ small: '/engines-dist/images/boxes/small.png',
+ medium: '/engines-dist/images/boxes/medium.png',
+ large: '/engines-dist/images/boxes/large.png',
+ 'x-large': '/engines-dist/images/boxes/x-large.png',
+};
+
+export default helper(function parcelBoxImage([size]) {
+ return PARCEL_BOX_IMAGES[size] ?? PARCEL_BOX_IMAGES.medium;
+});
diff --git a/app/helpers/parcel-box-image.js b/app/helpers/parcel-box-image.js
new file mode 100644
index 000000000..debc6410a
--- /dev/null
+++ b/app/helpers/parcel-box-image.js
@@ -0,0 +1 @@
+export { default } from '@fleetbase/fleetops-engine/helpers/parcel-box-image';
diff --git a/tests/integration/helpers/parcel-box-image-test.js b/tests/integration/helpers/parcel-box-image-test.js
new file mode 100644
index 000000000..306222e8f
--- /dev/null
+++ b/tests/integration/helpers/parcel-box-image-test.js
@@ -0,0 +1,22 @@
+import { module, test } from 'qunit';
+import { setupRenderingTest } from 'dummy/tests/helpers';
+import { render } from '@ember/test-helpers';
+import { hbs } from 'ember-cli-htmlbars';
+
+module('Integration | Helper | parcel-box-image', function (hooks) {
+ setupRenderingTest(hooks);
+
+ test('it returns the box image for each parcel size', async function (assert) {
+ for (const size of ['small', 'medium', 'large', 'x-large']) {
+ this.set('size', size);
+ await render(hbs`{{parcel-box-image this.size}}`);
+ assert.dom().hasText(`/engines-dist/images/boxes/${size}.png`);
+ }
+ });
+
+ test('it falls back to the medium box for an unknown size', async function (assert) {
+ this.set('size', 'oversized');
+ await render(hbs`{{parcel-box-image this.size}}`);
+ assert.dom().hasText('/engines-dist/images/boxes/medium.png');
+ });
+});