├── .env.test ├── .github ├── FUNDING.yml └── workflows │ └── docker-build.yaml ├── .gitignore ├── README.md ├── account ├── .dockerignore ├── .eslintcache ├── .gitignore ├── Dockerfile ├── notes.md ├── package.json ├── public │ ├── android-chrome-192x192.png │ ├── android-chrome-512x512.png │ ├── apple-touch-icon.png │ ├── favicon-16x16.png │ ├── favicon-32x32.png │ ├── favicon.ico │ ├── index.html │ ├── robots.txt │ └── site.webmanifest ├── server │ ├── config │ │ ├── express.js │ │ ├── passport-strategies │ │ │ ├── local.js │ │ │ └── twitter.js │ │ ├── passport.js │ │ └── secrets.js │ ├── controllers │ │ ├── systems.js │ │ └── users.js │ ├── index.js │ ├── models │ │ ├── system.js │ │ └── user.js │ └── public │ │ └── style │ │ └── style.css ├── src │ ├── App │ │ ├── App.js │ │ ├── Navigation.js │ │ └── Restricted.js │ ├── User │ │ ├── ConfirmEmail.js │ │ ├── Login.js │ │ ├── Profile.js │ │ ├── Register.js │ │ ├── ResetPassword.js │ │ ├── SendResetPassword.js │ │ ├── SentConfirmEmail.js │ │ ├── Terms.js │ │ ├── UserForm.js │ │ ├── WaitConfirmEmail.js │ │ ├── user-actions.js │ │ ├── user-constants.js │ │ └── user-reducer.js │ ├── features │ │ ├── api │ │ │ └── apiSlice.js │ │ └── user │ │ │ └── userSlice.js │ ├── index.js │ ├── query-string.js │ └── redux-router │ │ ├── configureStore.js │ │ └── reducers.js └── yarn.lock ├── admin ├── .dockerignore ├── .eslintcache ├── .gitignore ├── Dockerfile ├── notes.md ├── package-lock.json ├── package.json ├── public │ ├── android-chrome-192x192.png │ ├── android-chrome-512x512.png │ ├── apple-touch-icon.png │ ├── favicon-16x16.png │ ├── favicon-32x32.png │ ├── favicon.ico │ ├── index.html │ ├── robots.txt │ └── site.webmanifest ├── server │ ├── config │ │ ├── express.js │ │ ├── passport-strategies │ │ │ └── local.js │ │ ├── passport.js │ │ └── secrets.js │ ├── controllers │ │ ├── groups.js │ │ ├── systems.js │ │ └── talkgroups.js │ ├── index.js │ ├── models │ │ ├── group.js │ │ ├── system.js │ │ ├── system_stat.js │ │ ├── talkgroup.js │ │ └── user.js │ └── public │ │ └── style │ │ └── style.css ├── src │ ├── ActiveUsers │ │ └── ActiveUsers.js │ ├── AllSystems │ │ ├── AllSystems.js │ │ └── SystemRow.js │ ├── App │ │ ├── App.js │ │ ├── Navigation.js │ │ └── Restricted.js │ ├── Components │ │ ├── About.js │ │ └── Message.js │ ├── Group │ │ ├── GroupModal.js │ │ └── ListGroups.js │ ├── System │ │ ├── CallChart.js │ │ ├── CreateSystem.js │ │ ├── ErrorChart.js │ │ ├── ListSystems.js │ │ ├── ResponsiveCallChart.js │ │ ├── ResponsiveErrorChart.js │ │ ├── System.js │ │ ├── SystemCard.js │ │ ├── SystemForm.js │ │ └── UpdateSystem.js │ ├── Talkgroups │ │ └── ListTalkgroups.js │ ├── features │ │ ├── api │ │ │ └── apiSlice.js │ │ └── user │ │ │ └── userSlice.js │ ├── index.js │ └── redux-router │ │ └── configureStore.js └── yarn.lock ├── backend ├── .gitignore ├── Dockerfile ├── agents │ ├── honeycomb-tracing.js │ └── otel-tracing.js ├── config │ ├── config.json │ └── express.js ├── controllers │ ├── calls.js │ ├── events.js │ ├── groups.js │ ├── sources.js │ ├── stats.js │ ├── systems.js │ ├── talkgroups.js │ └── uploads.js ├── db.js ├── index.js ├── models │ ├── call.js │ ├── callSchema.js │ ├── event.js │ ├── frozenCall.js │ ├── frozenCallSchema.js │ ├── group.js │ ├── permission.js │ ├── podcast.js │ ├── star.js │ ├── system.js │ ├── systemSchema.js │ ├── system_stat.js │ ├── talkgroup.js │ ├── talkgroupSchema.js │ └── user.js ├── package-lock.json ├── package.json ├── public │ ├── css │ │ └── player.css │ ├── filler │ │ ├── 10silence.m4a │ │ ├── 30silence.m4a │ │ └── 60silence.m4a │ ├── img │ │ └── ajax-loader.gif │ ├── js │ │ └── admin.js │ ├── semantic-ui │ │ ├── components │ │ │ ├── accordion.css │ │ │ ├── accordion.js │ │ │ ├── accordion.min.css │ │ │ ├── accordion.min.js │ │ │ ├── ad.css │ │ │ ├── ad.min.css │ │ │ ├── api.js │ │ │ ├── api.min.js │ │ │ ├── breadcrumb.css │ │ │ ├── breadcrumb.min.css │ │ │ ├── button.css │ │ │ ├── button.min.css │ │ │ ├── card.css │ │ │ ├── card.min.css │ │ │ ├── checkbox.css │ │ │ ├── checkbox.js │ │ │ ├── checkbox.min.css │ │ │ ├── checkbox.min.js │ │ │ ├── colorize.js │ │ │ ├── colorize.min.js │ │ │ ├── comment.css │ │ │ ├── comment.min.css │ │ │ ├── container.css │ │ │ ├── container.min.css │ │ │ ├── dimmer.css │ │ │ ├── dimmer.js │ │ │ ├── dimmer.min.css │ │ │ ├── dimmer.min.js │ │ │ ├── divider.css │ │ │ ├── divider.min.css │ │ │ ├── dropdown.css │ │ │ ├── dropdown.js │ │ │ ├── dropdown.min.css │ │ │ ├── dropdown.min.js │ │ │ ├── embed.css │ │ │ ├── embed.js │ │ │ ├── embed.min.css │ │ │ ├── embed.min.js │ │ │ ├── feed.css │ │ │ ├── feed.min.css │ │ │ ├── flag.css │ │ │ ├── flag.min.css │ │ │ ├── form.css │ │ │ ├── form.js │ │ │ ├── form.min.css │ │ │ ├── form.min.js │ │ │ ├── grid.css │ │ │ ├── grid.min.css │ │ │ ├── header.css │ │ │ ├── header.min.css │ │ │ ├── icon.css │ │ │ ├── icon.min.css │ │ │ ├── image.css │ │ │ ├── image.min.css │ │ │ ├── input.css │ │ │ ├── input.min.css │ │ │ ├── item.css │ │ │ ├── item.min.css │ │ │ ├── label.css │ │ │ ├── label.min.css │ │ │ ├── list.css │ │ │ ├── list.min.css │ │ │ ├── loader.css │ │ │ ├── loader.min.css │ │ │ ├── menu.css │ │ │ ├── menu.min.css │ │ │ ├── message.css │ │ │ ├── message.min.css │ │ │ ├── modal.css │ │ │ ├── modal.js │ │ │ ├── modal.min.css │ │ │ ├── modal.min.js │ │ │ ├── nag.css │ │ │ ├── nag.js │ │ │ ├── nag.min.css │ │ │ ├── nag.min.js │ │ │ ├── popup.css │ │ │ ├── popup.js │ │ │ ├── popup.min.css │ │ │ ├── popup.min.js │ │ │ ├── progress.css │ │ │ ├── progress.js │ │ │ ├── progress.min.css │ │ │ ├── progress.min.js │ │ │ ├── rail.css │ │ │ ├── rail.min.css │ │ │ ├── rating.css │ │ │ ├── rating.js │ │ │ ├── rating.min.css │ │ │ ├── rating.min.js │ │ │ ├── reset.css │ │ │ ├── reset.min.css │ │ │ ├── reveal.css │ │ │ ├── reveal.min.css │ │ │ ├── search.css │ │ │ ├── search.js │ │ │ ├── search.min.css │ │ │ ├── search.min.js │ │ │ ├── segment.css │ │ │ ├── segment.min.css │ │ │ ├── shape.css │ │ │ ├── shape.js │ │ │ ├── shape.min.css │ │ │ ├── shape.min.js │ │ │ ├── sidebar.css │ │ │ ├── sidebar.js │ │ │ ├── sidebar.min.css │ │ │ ├── sidebar.min.js │ │ │ ├── site.css │ │ │ ├── site.js │ │ │ ├── site.min.css │ │ │ ├── site.min.js │ │ │ ├── state.js │ │ │ ├── state.min.js │ │ │ ├── statistic.css │ │ │ ├── statistic.min.css │ │ │ ├── step.css │ │ │ ├── step.min.css │ │ │ ├── sticky.css │ │ │ ├── sticky.js │ │ │ ├── sticky.min.css │ │ │ ├── sticky.min.js │ │ │ ├── tab.css │ │ │ ├── tab.js │ │ │ ├── tab.min.css │ │ │ ├── tab.min.js │ │ │ ├── table.css │ │ │ ├── table.min.css │ │ │ ├── transition.css │ │ │ ├── transition.js │ │ │ ├── transition.min.css │ │ │ ├── transition.min.js │ │ │ ├── video.css │ │ │ ├── video.js │ │ │ ├── video.min.css │ │ │ ├── video.min.js │ │ │ ├── visibility.js │ │ │ ├── visibility.min.js │ │ │ ├── visit.js │ │ │ └── visit.min.js │ │ ├── semantic.css │ │ ├── semantic.js │ │ ├── semantic.min.css │ │ └── semantic.min.js │ └── skin │ │ ├── blue.monday │ │ ├── css │ │ │ ├── jplayer.blue.monday.css │ │ │ └── jplayer.blue.monday.min.css │ │ ├── image │ │ │ ├── jplayer.blue.monday.jpg │ │ │ ├── jplayer.blue.monday.seeking.gif │ │ │ └── jplayer.blue.monday.video.play.png │ │ └── mustache │ │ │ ├── jplayer.blue.monday.audio.playlist.html │ │ │ ├── jplayer.blue.monday.audio.single.html │ │ │ ├── jplayer.blue.monday.audio.stream.html │ │ │ ├── jplayer.blue.monday.video.playlist.html │ │ │ └── jplayer.blue.monday.video.single.html │ │ └── pink.flag │ │ ├── css │ │ ├── jplayer.pink.flag.css │ │ └── jplayer.pink.flag.min.css │ │ ├── image │ │ ├── jplayer.pink.flag.jpg │ │ ├── jplayer.pink.flag.seeking.gif │ │ └── jplayer.pink.flag.video.play.png │ │ └── mustache │ │ ├── jplayer.pink.flag.audio.playlist.html │ │ ├── jplayer.pink.flag.audio.single.html │ │ ├── jplayer.pink.flag.audio.stream.html │ │ ├── jplayer.pink.flag.video.playlist.html │ │ └── jplayer.pink.flag.video.single.html ├── sys_stats.js └── test │ └── spec.js ├── certbot-compose.yml ├── data ├── log │ ├── nginx │ │ └── .gitignore │ └── syslog │ │ └── .gitignore ├── media │ └── .gitignore └── upload │ └── .gitignore ├── docker-compose.yml ├── docker-prod.sh ├── docker-test.sh ├── frontend ├── .dockerignore ├── .eslintcache ├── .gitignore ├── .not-env ├── Dockerfile ├── env-example ├── notes.md ├── package-lock.json ├── package.json ├── public │ ├── android-chrome-192x192.png │ ├── android-chrome-512x512.png │ ├── app-terms.html │ ├── apple-touch-icon.png │ ├── favicon-16x16.png │ ├── favicon-32x32.png │ ├── favicon.ico │ ├── index.html │ ├── podcast │ │ ├── channel_icon.png │ │ └── cover.png │ ├── privacy.html │ ├── radio-400x400.jpg │ ├── robots.txt │ ├── silence.m4a │ └── site.webmanifest ├── server │ ├── card.ejs │ ├── config │ │ ├── express.js │ │ └── secrets.js │ ├── db.js │ ├── env.ejs │ └── index.js ├── src │ ├── About │ │ ├── AboutComponent.js │ │ └── Terms.js │ ├── Call │ │ ├── Activity.js │ │ ├── ActivityChart.js │ │ ├── BetterActivityChart.js │ │ ├── CallInfo.js │ │ ├── CallPlayer.css │ │ ├── CallPlayer.js │ │ ├── Calls.js │ │ └── components │ │ │ ├── CalendarModal.css │ │ │ ├── CalendarModal.js │ │ │ ├── CallInfo.js │ │ │ ├── CallInfoPane.js │ │ │ ├── CallItem.js │ │ │ ├── CallLinks.js │ │ │ ├── FilterModal.css │ │ │ ├── FilterModal.js │ │ │ ├── GroupModal.js │ │ │ ├── ListCalls.js │ │ │ ├── MediaPlayer.css │ │ │ ├── MediaPlayer.js │ │ │ ├── PlaylistBuilder.js │ │ │ └── PlaylistItem.js │ ├── Common │ │ ├── NavBar.js │ │ └── SupportModal.js │ ├── Event │ │ ├── EventCallInfo.js │ │ ├── EventCallItem.js │ │ ├── EventPlayer.js │ │ ├── ListEventCalls.js │ │ ├── ListEvents.js │ │ └── ViewEvent.js │ ├── Main │ │ ├── Main.css │ │ └── Main.js │ ├── System │ │ ├── ContactModal.js │ │ ├── InternationList.js │ │ ├── ListSystems.js │ │ ├── StateLinkList.js │ │ ├── SystemCard.js │ │ ├── SystemsByState.js │ │ └── TrendingList.js │ ├── app.js │ ├── features │ │ ├── api │ │ │ └── apiSlice.js │ │ ├── callPlayer │ │ │ └── callPlayerSlice.js │ │ ├── calls │ │ │ └── callsSlice.js │ │ ├── group │ │ │ └── groupSlice.js │ │ └── systems │ │ │ └── systemsSlice.js │ ├── index.js │ ├── query-string.js │ ├── redux-router │ │ └── configureStore.js │ ├── resources │ │ ├── DidactGothic-Regular.ttf │ │ └── logo.png │ └── tracking.js └── yarn.lock ├── local-dev-with-minio.MD ├── mongo ├── Dockerfile ├── clean.js ├── crontab ├── errors.js ├── init_test_db.js ├── permissions.js ├── remove_old_systems.js ├── remove_tg.js ├── totals.js └── upgrade_db_admin.js ├── nginx-proxy ├── Dockerfile ├── cert │ └── vhosts │ │ └── site.template ├── nginx.conf ├── prod │ └── vhosts │ │ └── site.template ├── proxy.conf └── test │ └── vhosts │ └── site.template ├── node_modules ├── .package-lock.json └── .yarn-integrity ├── package-lock.json ├── prod.env.example ├── rebuild.sh ├── test-compose.yml ├── test.env.example └── yarn.lock /.env.test: -------------------------------------------------------------------------------- 1 | MEDIA=/Users/luke/Testing/media 2 | DATA=/Users/luke/Testing/data 3 | MAILJET_KEY="4d2a0f6deb20a7890afee2daf595c22d" 4 | MAILJET_SECRET="fb74f682d68bf6b05ab626c0ac93a6da" 5 | GOOGLE_ANALYTICS="UA-45563211-1" 6 | STAGE=test 7 | TAG=1.7 8 | DOMAIN_NAME="openmhz.test" 9 | PROTOCOL="http://" 10 | 11 | 12 | REACT_APP_BACKEND_SERVER="${PROTOCOL}api.${DOMAIN_NAME}" 13 | REACT_APP_FRONTEND_SERVER="${PROTOCOL}${DOMAIN_NAME}" 14 | REACT_APP_ACCOUNT_SERVER="${PROTOCOL}account.${DOMAIN_NAME}" 15 | REACT_APP_ADMIN_SERVER="${PROTOCOL}admin.${DOMAIN_NAME}" 16 | REACT_APP_COOKIE_DOMAIN=".${DOMAIN_NAME}" 17 | REACT_APP_ADMIN_EMAIL=luke@robotastic.com 18 | REACT_APP_SITE_NAME=OpenMHz 19 | REACT_APP_ARCHIVE_DAYS=30 20 | STRIPE_PUBLISHABLE_KEY="" 21 | STRIPE_SECRET_KEY="sk_test_S5kfQwdyRDgKtu9FQYpPh3B3" 22 | BACKEND_SERVER="${PROTOCOL}api.${DOMAIN_NAME}" 23 | FRONTEND_SERVER="${PROTOCOL}${DOMAIN_NAME}" 24 | ADMIN_SERVER="${PROTOCOL}admin.${DOMAIN_NAME}" 25 | ACCOUNT_SERVER="${PROTOCOL}account.${DOMAIN_NAME}" 26 | COOKIE_DOMAIN=".${DOMAIN_NAME}" 27 | SITE_NAME="OpenMHz" 28 | ADMIN_EMAIL="luke@robotastic.com" 29 | S3_PROFILE='wasabi-account' 30 | S3_ENPOINT='s3.us-west-1.wasabisys.com' 31 | FREE_PLAN=0 32 | PRO_PLAN=10 33 | FREE_PLAN_PRICE=0 34 | PRO_PLAN_PRICE=15 35 | FREE_PLAN_ARCHIVE=7 36 | PRO_PLAN_ARCHIVE=30 -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: robotastic 4 | patreon: # Replace with a single Patreon username 5 | open_collective: # Replace with a single Open Collective username 6 | ko_fi: # Replace with a single Ko-fi username 7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel 8 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry 9 | liberapay: # Replace with a single Liberapay username 10 | issuehunt: # Replace with a single IssueHunt username 11 | otechie: # Replace with a single Otechie username 12 | custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] 13 | -------------------------------------------------------------------------------- /.github/workflows/docker-build.yaml: -------------------------------------------------------------------------------- 1 | name: Container Processing 2 | 3 | on: 4 | push: 5 | branches: [ "master" ] 6 | 7 | env: 8 | # Setting an environment variable with the value of a configuration variable 9 | REACT_APP_GOOGLE_ANALYTICS: ${{ vars.REACT_APP_GOOGLE_ANALYTICS}} 10 | REACT_APP_BACKEND_SERVER: ${{ vars.REACT_APP_BACKEND_SERVER}} 11 | REACT_APP_FRONTEND_SERVER: ${{ vars.REACT_APP_FRONTEND_SERVER}} 12 | REACT_APP_ADMIN_SERVER: ${{ vars.REACT_APP_ADMIN_SERVER}} 13 | REACT_APP_ACCOUNT_SERVER: ${{ vars.REACT_APP_ACCOUNT_SERVER}} 14 | REACT_APP_COOKIE_DOMAIN: ${{ vars.REACT_APP_COOKIE_DOMAIN}} 15 | REACT_APP_ADMIN_EMAIL: ${{ vars.REACT_APP_ADMIN_EMAIL}} 16 | REACT_APP_SITE_NAME: ${{ vars.REACT_APP_SITE_NAME}} 17 | STAGE: ${{ vars.STAGE}} 18 | 19 | jobs: 20 | push_to_registry: 21 | strategy: 22 | matrix: 23 | service: [account, admin, backend, frontend, mongo, nginx-proxy] 24 | name: Push Docker image to DockerHub 25 | runs-on: ubuntu-latest 26 | steps: 27 | - name: Checkout repository 28 | uses: actions/checkout@v4 29 | 30 | - name: Set up Docker buildx 31 | id: buildx 32 | uses: docker/setup-buildx-action@v3 33 | with: 34 | version: latest 35 | 36 | - name: Log in to DockerHub 37 | uses: docker/login-action@v3 38 | with: 39 | username: ${{ vars.DOCKER_USERNAME }} 40 | password: ${{ secrets.DOCKER_TOKEN }} 41 | 42 | - name: Build and push Docker image 43 | uses: docker/build-push-action@v5 44 | with: 45 | context: ${{ matrix.service }} 46 | platforms: linux/arm64,linux/amd64 47 | push: true 48 | tags: ${{ vars.DOCKER_NAMESPACE }}/trunk-server-${{ matrix.service }}:latest 49 | build-args: STAGE=${{vars.STAGE}} -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | prod.env 3 | test.env 4 | account/.eslintcache 5 | account/.eslintcache 6 | admin/.eslintcache 7 | frontend/.eslintcache 8 | admin/.eslintcache 9 | data/* 10 | -------------------------------------------------------------------------------- /account/.dockerignore: -------------------------------------------------------------------------------- 1 | /node_modules 2 | /build -------------------------------------------------------------------------------- /account/.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | 8 | # testing 9 | /coverage 10 | 11 | # production 12 | /build 13 | 14 | # misc 15 | .DS_Store 16 | .env.local 17 | .env.development.local 18 | .env.test.local 19 | .env.production.local 20 | 21 | npm-debug.log* 22 | yarn-debug.log* 23 | yarn-error.log* 24 | -------------------------------------------------------------------------------- /account/Dockerfile: -------------------------------------------------------------------------------- 1 | # build environment 2 | FROM node:19-alpine3.16 as build 3 | WORKDIR /app 4 | ENV PATH /app/node_modules/.bin:$PATH 5 | ARG REACT_APP_BACKEND_SERVER 6 | ARG REACT_APP_ADMIN_SERVER 7 | ARG REACT_APP_ACCOUNT_SERVER 8 | ARG REACT_APP_FRONTEND_SERVER 9 | ARG REACT_APP_SITE_NAME 10 | ARG REACT_APP_ADMIN_EMAIL 11 | ARG NODE_ENV 12 | COPY package.json ./ 13 | RUN npm install --include=dev 14 | COPY . ./ 15 | RUN npm run build 16 | RUN env 17 | 18 | # production environment 19 | FROM node:19-alpine3.16 20 | RUN mkdir -p /app/public 21 | COPY ./package.json /tmp 22 | RUN cd /tmp && npm install 23 | RUN cp -a /tmp/node_modules /app 24 | RUN env 25 | RUN npm install -g nodemon 26 | WORKDIR /app 27 | COPY server /app 28 | COPY --from=build /app/build /app/public 29 | CMD ["node", "index.js"] -------------------------------------------------------------------------------- /account/notes.md: -------------------------------------------------------------------------------- 1 | 2 | ## Base 3 | start using `npx create-react-app account --template redux` 4 | 5 | ## Packages used: 6 | - [connected-react-router](https://github.com/supasate/connected-react-router): Synchronize router state with redux store through 7 | - [Redux Thunk](https://github.com/reduxjs/redux-thunk): lets you do AJAX calls 8 | - [axios](https://github.com/axios/axios) - library for doing HTTP requests 9 | - [react-router-dom](https://reactrouter.com/web/guides/quick-start) - Adds routes to React 10 | - [Semantic UI](https://react.semantic-ui.com/usage) - The UI frontend 11 | -------------------------------------------------------------------------------- /account/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "account", 3 | "version": "0.1.0", 4 | "private": true, 5 | "devDependencies": { 6 | "@reduxjs/toolkit": "^1.1.0", 7 | "@testing-library/jest-dom": "^5.16.5", 8 | "@testing-library/react": "^14.0.0", 9 | "@testing-library/user-event": "^14.4.3", 10 | "axios": "1.3.4", 11 | "react": "^18.2.0", 12 | "react-dom": "^18.2.0", 13 | "react-redux": "^8.0.5", 14 | "react-router-dom": "6.9.0", 15 | "react-scripts": "5.0.1", 16 | "redux-thunk": "2.4.2", 17 | "semantic-ui-css": "2.5.0", 18 | "semantic-ui-react": "2.1.4" 19 | }, 20 | "scripts": { 21 | "start": "react-scripts start", 22 | "build": "react-scripts build", 23 | "test": "react-scripts test", 24 | "eject": "react-scripts eject" 25 | }, 26 | "eslintConfig": { 27 | "extends": "react-app" 28 | }, 29 | "browserslist": { 30 | "production": [ 31 | ">0.2%", 32 | "not dead", 33 | "not op_mini all" 34 | ], 35 | "development": [ 36 | "last 1 chrome version", 37 | "last 1 firefox version", 38 | "last 1 safari version" 39 | ] 40 | }, 41 | "dependencies": { 42 | "bcrypt": "5.1.0", 43 | "connect-mongo": "5.0.0", 44 | "express": "4.18.2", 45 | "express-session": "1.17.3", 46 | "mongoose": "7.0.3", 47 | "node-mailjet": "6.0.2", 48 | "passport": "0.6.0", 49 | "passport-local": "1.0.0", 50 | "passport-twitter": "1.0.4" 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /account/public/android-chrome-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openmhz/trunk-server/4ff3038068dae77ea8069f68fdab598673cfa4a2/account/public/android-chrome-192x192.png -------------------------------------------------------------------------------- /account/public/android-chrome-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openmhz/trunk-server/4ff3038068dae77ea8069f68fdab598673cfa4a2/account/public/android-chrome-512x512.png -------------------------------------------------------------------------------- /account/public/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openmhz/trunk-server/4ff3038068dae77ea8069f68fdab598673cfa4a2/account/public/apple-touch-icon.png -------------------------------------------------------------------------------- /account/public/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openmhz/trunk-server/4ff3038068dae77ea8069f68fdab598673cfa4a2/account/public/favicon-16x16.png -------------------------------------------------------------------------------- /account/public/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openmhz/trunk-server/4ff3038068dae77ea8069f68fdab598673cfa4a2/account/public/favicon-32x32.png -------------------------------------------------------------------------------- /account/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openmhz/trunk-server/4ff3038068dae77ea8069f68fdab598673cfa4a2/account/public/favicon.ico -------------------------------------------------------------------------------- /account/public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 | 5 | 6 | 7 | 8 | 12 | 13 | 17 | 18 | 27 |You have successfully confirmed you email address.
47 | 48 | 53 |{confirmMessage.message}
61 |Creating an account on OpenMHz is the first step in sharing radio system recordings using Trunk Recorder.
36 |After creating an account, head over here to learn more about Trunk Recorder
37 |- Luke
38 |
15 | We sent an email to the address you gave us: {email}
16 | Please click on the link in the email to verify the email address.
17 |
23 | We sent an email to the address you gave us: {email}
24 |
25 | Please click on the link in the email to verify the email address.
26 |
So, you have waited a bit and haven't gotten anything?
29 |...and you checked your spam folder?
30 |Well, click below.
31 | 36 |{process.env.REACT_APP_SITE_NAME} makes it easy to share and archive recordings from Trunk Recorder. 11 | Sharing access to these radio systems allows for other members of your community to follow local events. 12 | Raising awareness of what our local fire, police and EMS have to go through everyday should 13 | lead to greater appreciation for all the work they do that goes largely unseen.
14 |Each of the radio systems comes from different contributers around the country. The different 15 | systems may come and go as new ones are added and taken down. {process.env.REACT_APP_SITE_NAME} only maintains the archive that 16 | is available online.
17 | 18 |{props.message}
11 |37 | Record the your community's radio systems and share them! All it 38 | takes is a spare computer and a cheap SDR. The software you need, 39 | along with an explanation of how to set it up, is available{" "} 40 | here. 41 |
42 |43 | After you have the Trunk Recorder software up and running, come 44 | back here and sign-up for an account so you can share your 45 | recordings 46 |
47 |- Luke
48 |If OpenMHz brings you joy, think about becoming a supporter! It will cover hosting costs and help keep me focused on development.
25 | 26 |