diff --git a/frontend/.env b/frontend/.env
new file mode 100644
index 0000000..f536405
--- /dev/null
+++ b/frontend/.env
@@ -0,0 +1,8 @@
+REACT_APP_BACKEND_SERVER=https://api.openmhz.com
+REACT_APP_FRONTEND_SERVER=https://openmhz.com
+REACT_APP_SOCKET_SERVER=wss://api.openmhz.com
+REACT_APP_SITE_NAME=OpenMHz
+REACT_APP_PRO_PLAN=1
+REACT_APP_FREE_PLAN=0
+REACT_APP_PRO_PLAN_ARCHIVE=30
+REACT_APP_FREE_PLAN_ARCHIVE=7
diff --git a/frontend/.eslintcache b/frontend/.eslintcache
index d0571d3..e7a807f 100644
--- a/frontend/.eslintcache
+++ b/frontend/.eslintcache
@@ -1 +1 @@
-[{"/Users/luke/Projects/OpenMHz/trunk-server-public/frontend/src/index.js":"1","/Users/luke/Projects/OpenMHz/trunk-server-public/frontend/src/features/counter/Counter.js":"2","/Users/luke/Projects/OpenMHz/trunk-server-public/frontend/src/App.js":"3","/Users/luke/Projects/OpenMHz/trunk-server-public/frontend/src/app/reducers.js":"4","/Users/luke/Projects/OpenMHz/trunk-server-public/frontend/src/features/counter/counterSlice.js":"5","/Users/luke/Projects/OpenMHz/trunk-server-public/frontend/src/app/configureStore.js":"6"},{"size":824,"mtime":1609425644251,"results":"7","hashOfConfig":"8"},{"size":1626,"mtime":499162500000,"results":"9","hashOfConfig":"8"},{"size":1463,"mtime":499162500000,"results":"10","hashOfConfig":"8"},{"size":375,"mtime":1609425733654,"results":"11","hashOfConfig":"8"},{"size":1551,"mtime":499162500000,"results":"12","hashOfConfig":"8"},{"size":759,"mtime":1609425817988,"results":"13","hashOfConfig":"8"},{"filePath":"14","messages":"15","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},"1du4mf8",{"filePath":"16","messages":"17","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18","messages":"19","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20","messages":"21","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22","messages":"23","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24","messages":"25","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},"/Users/luke/Projects/OpenMHz/trunk-server-public/frontend/src/index.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/frontend/src/features/counter/Counter.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/frontend/src/App.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/frontend/src/app/reducers.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/frontend/src/features/counter/counterSlice.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/frontend/src/app/configureStore.js",[]]
\ No newline at end of file
+[{"/Users/luke/Projects/OpenMHz/trunk-server-public/frontend/src/index.js":"1","/Users/luke/Projects/OpenMHz/trunk-server-public/frontend/src/features/counter/Counter.js":"2","/Users/luke/Projects/OpenMHz/trunk-server-public/frontend/src/features/counter/counterSlice.js":"3","/Users/luke/Projects/OpenMHz/trunk-server-public/frontend/src/System/SystemCard.js":"4","/Users/luke/Projects/OpenMHz/trunk-server-public/frontend/src/System/system-actions.js":"5","/Users/luke/Projects/OpenMHz/trunk-server-public/frontend/src/System/system-constants.js":"6","/Users/luke/Projects/OpenMHz/trunk-server-public/frontend/src/Main/Main.js":"7","/Users/luke/Projects/OpenMHz/trunk-server-public/frontend/src/System/system-reducer.js":"8","/Users/luke/Projects/OpenMHz/trunk-server-public/frontend/src/System/ListSystems.js":"9","/Users/luke/Projects/OpenMHz/trunk-server-public/frontend/src/redux-router/reducers.js":"10"},{"size":910,"mtime":1609515100233,"results":"11","hashOfConfig":"12"},{"size":1626,"mtime":499162500000,"results":"13","hashOfConfig":"12"},{"size":1551,"mtime":499162500000,"results":"14","hashOfConfig":"12"},{"size":2045,"mtime":1609520570000,"results":"15","hashOfConfig":"12"},{"size":1789,"mtime":1609517296613,"results":"16","hashOfConfig":"12"},{"size":157,"mtime":1545362103913,"results":"17","hashOfConfig":"12"},{"size":11040,"mtime":1609520223847,"results":"18","hashOfConfig":"12"},{"size":1576,"mtime":1609520031487,"results":"19","hashOfConfig":"12"},{"size":1547,"mtime":1609520315634,"results":"20","hashOfConfig":"12"},{"size":363,"mtime":1609510513079,"results":"21","hashOfConfig":"12"},{"filePath":"22","messages":"23","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},"1du4mf8",{"filePath":"24","messages":"25","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26","messages":"27","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28","messages":"29","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30","messages":"31","errorCount":0,"warningCount":2,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"32","messages":"33","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34","messages":"35","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36","messages":"37","errorCount":0,"warningCount":11,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"38","messages":"39","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40","messages":"41","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},"/Users/luke/Projects/OpenMHz/trunk-server-public/frontend/src/index.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/frontend/src/features/counter/Counter.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/frontend/src/features/counter/counterSlice.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/frontend/src/System/SystemCard.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/frontend/src/System/system-actions.js",["42","43"],"/Users/luke/Projects/OpenMHz/trunk-server-public/frontend/src/System/system-constants.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/frontend/src/Main/Main.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/frontend/src/System/system-reducer.js",["44","45","46","47","48","49","50","51","52","53","54"],"/Users/luke/Projects/OpenMHz/trunk-server-public/frontend/src/System/ListSystems.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/frontend/src/redux-router/reducers.js",[],{"ruleId":"55","severity":1,"message":"56","line":6,"column":7,"nodeType":"57","messageId":"58","endLine":6,"endColumn":30},{"ruleId":"55","severity":1,"message":"59","line":23,"column":10,"nodeType":"57","messageId":"58","endLine":23,"endColumn":25},{"ruleId":"55","severity":1,"message":"60","line":2,"column":3,"nodeType":"57","messageId":"58","endLine":2,"endColumn":16},{"ruleId":"55","severity":1,"message":"61","line":3,"column":3,"nodeType":"57","messageId":"58","endLine":3,"endColumn":24},{"ruleId":"55","severity":1,"message":"62","line":4,"column":3,"nodeType":"57","messageId":"58","endLine":4,"endColumn":22},{"ruleId":"55","severity":1,"message":"63","line":5,"column":3,"nodeType":"57","messageId":"58","endLine":5,"endColumn":16},{"ruleId":"55","severity":1,"message":"64","line":6,"column":3,"nodeType":"57","messageId":"58","endLine":6,"endColumn":24},{"ruleId":"55","severity":1,"message":"65","line":7,"column":3,"nodeType":"57","messageId":"58","endLine":7,"endColumn":22},{"ruleId":"55","severity":1,"message":"66","line":8,"column":3,"nodeType":"57","messageId":"58","endLine":8,"endColumn":16},{"ruleId":"55","severity":1,"message":"67","line":9,"column":3,"nodeType":"57","messageId":"58","endLine":9,"endColumn":24},{"ruleId":"55","severity":1,"message":"68","line":10,"column":3,"nodeType":"57","messageId":"58","endLine":10,"endColumn":22},{"ruleId":"55","severity":1,"message":"69","line":16,"column":10,"nodeType":"57","messageId":"58","endLine":16,"endColumn":22},{"ruleId":"55","severity":1,"message":"70","line":22,"column":10,"nodeType":"57","messageId":"58","endLine":22,"endColumn":29},"no-unused-vars","'FETCH_SUCCESS_STATISTIC' is assigned a value but never used.","Identifier","unusedVar","'makeUserRequest' is defined but never used.","'CREATE_SYSTEM' is defined but never used.","'CREATE_SUCCESS_SYSTEM' is defined but never used.","'CREATE_ERROR_SYSTEM' is defined but never used.","'UPDATE_SYSTEM' is defined but never used.","'UPDATE_SUCCESS_SYSTEM' is defined but never used.","'UPDATE_ERROR_SYSTEM' is defined but never used.","'DELETE_SYSTEM' is defined but never used.","'DELETE_SUCCESS_SYSTEM' is defined but never used.","'DELETE_ERROR_SYSTEM' is defined but never used.","'updateObject' is defined but never used.","'updateObjectInArray' is defined but never used."]
\ No newline at end of file
diff --git a/frontend/env-example b/frontend/env-example
new file mode 100644
index 0000000..f536405
--- /dev/null
+++ b/frontend/env-example
@@ -0,0 +1,8 @@
+REACT_APP_BACKEND_SERVER=https://api.openmhz.com
+REACT_APP_FRONTEND_SERVER=https://openmhz.com
+REACT_APP_SOCKET_SERVER=wss://api.openmhz.com
+REACT_APP_SITE_NAME=OpenMHz
+REACT_APP_PRO_PLAN=1
+REACT_APP_FREE_PLAN=0
+REACT_APP_PRO_PLAN_ARCHIVE=30
+REACT_APP_FREE_PLAN_ARCHIVE=7
diff --git a/frontend/notes.md b/frontend/notes.md
index e69de29..1ed2345 100644
--- a/frontend/notes.md
+++ b/frontend/notes.md
@@ -0,0 +1,12 @@
+## Elements Used
+- Create React App
+- Redux
+- Redux Router
+- [Redux Thunk](https://github.com/reduxjs/redux-thunk): lets you do AJAX calls
+- [connected-react-router](https://github.com/supasate/connected-react-router): Synchronize router state with redux store through uni-directional flow (i.e. history -> store -> router -> components). Basically, if you go back the redux store will update... I think
+- [axios](https://github.com/axios/axios) - library for doing HTTP requests
+- [@artsy/fresnel](https://github.com/artsy/fresnel) - Handles media requests for responsive designs and works server side too. https://github.com/Semantic-Org/Semantic-UI-React/pull/4008
+
+
+## Environment Variables
+CRA lets you sub in env variables into both HTML and JS: https://create-react-app.dev/docs/adding-custom-environment-variables/
\ No newline at end of file
diff --git a/frontend/package.json b/frontend/package.json
index d794de8..7075e46 100644
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -3,19 +3,21 @@
"version": "0.1.0",
"private": true,
"dependencies": {
+ "@artsy/fresnel": "1.3.1",
"@reduxjs/toolkit": "^1.1.0",
"@testing-library/jest-dom": "^4.2.4",
"@testing-library/react": "^9.3.2",
"@testing-library/user-event": "^7.1.2",
- "bootstrap": "4.5.3",
+ "axios": "0.21.1",
"connected-react-router": "6.8.0",
"react": "^17.0.1",
- "react-bootstrap": "1.4.0",
"react-dom": "^17.0.1",
"react-redux": "^7.1.3",
"react-router-dom": "5.2.0",
"react-scripts": "4.0.1",
- "redux-thunk": "2.3.0"
+ "redux-thunk": "2.3.0",
+ "semantic-ui-css": "2.4.1",
+ "semantic-ui-react": "2.0.1"
},
"scripts": {
"start": "react-scripts start",
diff --git a/frontend/public/index.html b/frontend/public/index.html
index 430b58f..cf3a044 100644
--- a/frontend/public/index.html
+++ b/frontend/public/index.html
@@ -24,6 +24,10 @@
work correctly both with client-side routing and a non-root public URL.
Learn how to configure a non-root public URL by running `npm run build`.
-->
+
+
+ Missed a call? Not a problem, everything is archived!
+
+
+
+
+
+
+
+
+ Don't just scan, hear it all!
+
+
+ Most large cities use trunked radio systems to get the most use out of their assigned radio spectrum. With trunked systems, the transmission are constantly hopping to different frequencies. Using a cheap Software Defined Radio (SDR), it is possible capture all of the transmission on a system.
+ Instead of scanning to a single frequency, SDR capturea wide swathes of spectrum, covering all of the frequencies a system could use.
+
+
+ Get Involved
+
+
+ Want to record your local radio system?
+
+
+ Join us! Record a local radio system and share it with the world. If you have a spare computer, it is easy to get started. With a $25 SDR or two, you can capture an entire system.
+ It does take a little bit of work to get things setup, but we are here to help and answer questions.
+