diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..6299e0c
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,14 @@
+.DS_Store
+*.swp
+*.swo
+node_modules
+!test/webpack/node_modules/@folio/app2/node_modules/
+!test/webpack/node_modules/
+npm-debug.log
+static
+README.html
+OVERVIEW.html
+yarn.lock
+yarn-error.log
+artifacts
+dist
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..ea018de
--- /dev/null
+++ b/README.md
@@ -0,0 +1,20 @@
+# Stripes Webpack
+
+Copyright (C) 2017-2021 The Open Library Foundation
+
+This software is distributed under the terms of the Apache License,
+Version 2.0. See the file "[LICENSE](LICENSE)" for more information.
+
+
+## Introduction
+
+Stripes Webpack contains webpack config files used for building and serving Folio bundles via [stripes-cli](https://github.com/folio-org/stripes-cli).
+
+
+## Additional information
+
+See project [STRIPES](https://issues.folio.org/browse/STRIPES)
+at the [FOLIO issue tracker](https://dev.folio.org/guidelines/issue-tracker/).
+
+Other FOLIO Developer documentation is at [dev.folio.org](https://dev.folio.org/)
+
diff --git a/default-assets/branding.js b/default-assets/branding.js
new file mode 100644
index 0000000..74ac6d9
--- /dev/null
+++ b/default-assets/branding.js
@@ -0,0 +1,12 @@
+// These default branding values are used when no branding is present in stripes.config.js
+// Default src are prefixed with '@folio/stripes-core' so they can be imported
+// and processed through the webpack loaders from the stripes-core in use.
+module.exports = {
+ logo: {
+ src: `${__dirname}/folio-logo.svg`,
+ alt: 'FOLIO',
+ },
+ favicon: {
+ src: `${__dirname}/favicon.svg`,
+ },
+};
diff --git a/default-assets/favicon.svg b/default-assets/favicon.svg
new file mode 100644
index 0000000..6ce61fc
--- /dev/null
+++ b/default-assets/favicon.svg
@@ -0,0 +1 @@
+
diff --git a/default-assets/folio-logo.svg b/default-assets/folio-logo.svg
new file mode 100644
index 0000000..ddd2390
--- /dev/null
+++ b/default-assets/folio-logo.svg
@@ -0,0 +1 @@
+
diff --git a/index.html b/index.html
new file mode 100644
index 0000000..c83d00b
--- /dev/null
+++ b/index.html
@@ -0,0 +1,12 @@
+
+
+
+
+ FOLIO
+
+
+
+
+
+
+
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..80a2007
--- /dev/null
+++ b/package.json
@@ -0,0 +1,83 @@
+{
+ "name": "@folio/stripes-webpack",
+ "version": "1.0.0",
+ "description": "The webpack config for stripes",
+ "license": "Apache-2.0",
+ "publishConfig": {
+ "registry": "https://repository.folio.org/repository/npm-folio/"
+ },
+ "scripts": {
+ "test": "mocha --opts test/mocha.opts './test/webpack/**/*.js'"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ },
+ "dependencies": {
+ "@babel/core": "^7.8.0",
+ "@babel/plugin-proposal-class-properties": "^7.0.0",
+ "@babel/plugin-proposal-decorators": "^7.0.0",
+ "@babel/plugin-proposal-export-namespace-from": "^7.0.0",
+ "@babel/plugin-proposal-function-sent": "^7.0.0",
+ "@babel/plugin-proposal-numeric-separator": "^7.0.0",
+ "@babel/plugin-proposal-throw-expressions": "^7.0.0",
+ "@babel/plugin-syntax-import-meta": "^7.0.0",
+ "@babel/preset-env": "^7.0.0",
+ "@babel/preset-flow": "^7.7.4",
+ "@babel/preset-react": "^7.7.4",
+ "@babel/preset-typescript": "^7.7.7",
+ "@babel/register": "^7.0.0",
+ "@bigtest/mirage": "^0.0.1",
+ "@hot-loader/react-dom": "^16.8.6",
+ "add-asset-html-webpack-plugin": "^3.1.3",
+ "autoprefixer": "^9.1.1",
+ "awesome-typescript-loader": "^5.2.0",
+ "babel-loader": "^8.0.0",
+ "babel-plugin-lodash": "^3.3.4",
+ "babel-plugin-remove-jsx-attributes": "^0.0.2",
+ "commander": "^2.9.0",
+ "connect-history-api-fallback": "^1.3.0",
+ "core-js": "^3.6.1",
+ "css-loader": "^1.0.0",
+ "debug": "^4.0.1",
+ "duplicate-package-checker-webpack-plugin": "^3.0.0",
+ "express": "^4.14.0",
+ "favicons-webpack-plugin": "^3.0.1",
+ "file-loader": "^1.1.11",
+ "handlebars-loader": "^1.7.1",
+ "hard-source-webpack-plugin": "^0.12.0",
+ "html-webpack-plugin": "^4.0.0-beta.10",
+ "lodash-webpack-plugin": "^0.11.5",
+ "mini-css-extract-plugin": "^0.4.0",
+ "optimize-css-assets-webpack-plugin": "^5.0.0",
+ "postcss": "^7.0.2",
+ "postcss-calc": "^6.0.0",
+ "postcss-color-function": "^4.0.0",
+ "postcss-custom-media": "^6.0.0",
+ "postcss-custom-properties": "^10.0.0",
+ "postcss-import": "^12.0.0",
+ "postcss-loader": "^3.0.0",
+ "postcss-media-minmax": "^3.0.0",
+ "postcss-nesting": "^6.0.0",
+ "postcss-url": "^8.0.0",
+ "regenerator-runtime": "^0.13.3",
+ "rimraf": "^2.5.4",
+ "rtl-detect": "^1.0.2",
+ "semver": "^7.1.3",
+ "serialize-javascript": "^5.0.0",
+ "style-loader": "^1.0.0",
+ "svgo": "^1.2.2",
+ "svgo-loader": "^2.2.1",
+ "tapable": "^1.0.0",
+ "typescript": "^2.8.1",
+ "use-deep-compare": "^1.1.0",
+ "uuid": "^3.0.0",
+ "webpack": "^4.10.2",
+ "webpack-dev-middleware": "^3.1.3",
+ "webpack-hot-middleware": "^2.22.2",
+ "webpack-virtual-modules": "^0.1.10"
+ },
+ "devDependencies": {
+ "mocha": "^6.1.3",
+ "mocha-junit-reporter": "^1.17.0"
+ }
+}
diff --git a/stripes.js b/stripes.js
new file mode 100755
index 0000000..a6884bf
--- /dev/null
+++ b/stripes.js
@@ -0,0 +1,67 @@
+#!/usr/bin/env node
+
+/* eslint-disable no-console */
+
+const commander = require('commander');
+const path = require('path');
+const stripes = require('./webpack/stripes-node-api');
+const packageJSON = require('./package.json');
+
+commander.version(packageJSON.version);
+
+// Display error to the console and exit
+function processError(err) {
+ if (err) {
+ console.error(err);
+ }
+ process.exit(1);
+}
+
+// Display webpack output to the console
+function processStats(stats) {
+ console.log(stats.toString({
+ chunks: false,
+ colors: true,
+ }));
+ // Check for webpack compile errors and exit
+ if (stats.hasErrors()) {
+ processError();
+ }
+}
+
+commander
+ .command('dev')
+ .option('--port [port]', 'Port')
+ .option('--host [host]', 'Host')
+ .option('--cache', 'Use HardSourceWebpackPlugin cache')
+ .option('--devtool [devtool]', 'Use another value for devtool instead of "inline-source-map"')
+ .arguments('')
+ .description('Launch a webpack-dev-server')
+ .action((stripesConfigFile, options) => {
+ // eslint-disable-next-line global-require,import/no-dynamic-require
+ const stripesConfig = require(path.resolve(stripesConfigFile));
+ stripes.serve(stripesConfig, options);
+ });
+
+commander
+ .command('build')
+ .option('--publicPath [publicPath]', 'publicPath')
+ .option('--sourcemap', 'include sourcemaps in build')
+ .option('--no-minify', 'do not minify JavaScript')
+ .arguments('