diff --git a/docker-compose.yml b/docker-compose.yml index a506997..c79fe34 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -7,16 +7,3 @@ services: - 8080 #restart: always stdin_open: true - - nginx: - image: nginx:latest - ports: - - "80:80" - - "443:443" - volumes: - - ./nginx.conf:/etc/nginx/nginx.conf - - /etc/letsencrypt:/etc/letsencrypt - environment: - - SSL_CERTIFICATE=/etc/letsencrypt/live/deflock.me/fullchain.pem - - SSL_CERTIFICATE_KEY=/etc/letsencrypt/live/deflock.me/privkey.pem - restart: always diff --git a/nginx.conf b/nginx.conf index 05eff84..0ec883e 100644 --- a/nginx.conf +++ b/nginx.conf @@ -24,10 +24,6 @@ http { location / { return 301 https://$host$request_uri; } - - location /.well-known/acme-challenge/ { - root /var/www/certbot; - } } server { diff --git a/shotgun/.bsp/sbt.json b/shotgun/.bsp/sbt.json index c5b0993..b7bca3d 100644 --- a/shotgun/.bsp/sbt.json +++ b/shotgun/.bsp/sbt.json @@ -1 +1 @@ -{"name":"sbt","version":"1.9.1","bspVersion":"2.1.0-M1","languages":["scala"],"argv":["/Users/willfreeman/Library/Java/JavaVirtualMachines/corretto-11.0.19/Contents/Home/bin/java","-Xms100m","-Xmx100m","-classpath","/Users/willfreeman/Library/Application Support/JetBrains/IdeaIC2024.1/plugins/Scala/launcher/sbt-launch.jar","-Dsbt.script=/Users/willfreeman/Library/Application%20Support/Coursier/bin/sbt","xsbt.boot.Boot","-bsp"]} \ No newline at end of file +{"name":"sbt","version":"1.9.1","bspVersion":"2.1.0-M1","languages":["scala"],"argv":["/Users/willfreeman/Library/Caches/Coursier/arc/https/github.com/adoptium/temurin17-binaries/releases/download/jdk-17.0.10%252B7/OpenJDK17U-jdk_x64_mac_hotspot_17.0.10_7.tar.gz/jdk-17.0.10+7/Contents/Home/bin/java","-Xms100m","-Xmx100m","-classpath","/Users/willfreeman/Library/Caches/Coursier/arc/https/github.com/sbt/sbt/releases/download/v1.8.2/sbt-1.8.2.zip/sbt/bin/sbt-launch.jar","-Dsbt.script=/Users/willfreeman/Library/Caches/Coursier/arc/https/github.com/sbt/sbt/releases/download/v1.8.2/sbt-1.8.2.zip/sbt/bin/sbt","xsbt.boot.Boot","-bsp"]} \ No newline at end of file diff --git a/shotgun/src/main/scala/me/deflock/shotgun/ShotgunServer.scala b/shotgun/src/main/scala/me/deflock/shotgun/ShotgunServer.scala index 07ef9de..9b6f88e 100644 --- a/shotgun/src/main/scala/me/deflock/shotgun/ShotgunServer.scala +++ b/shotgun/src/main/scala/me/deflock/shotgun/ShotgunServer.scala @@ -70,9 +70,12 @@ object ShotgunServer { ) } - val spaRoutes = pathSingleSlash { + val spaRoutes = pathEndOrSingleSlash { getFromFile("../webapp/dist/index.html") - } ~ getFromDirectory("../webapp/dist") + } ~ getFromDirectory("../webapp/dist") ~ + path(Remaining) { _ => + getFromFile("../webapp/dist/index.html") + } val routes = handleRejections(rejectionHandler) { cors(corsSettings) { diff --git a/webapp/index.html b/webapp/index.html index a888544..068572c 100644 --- a/webapp/index.html +++ b/webapp/index.html @@ -2,9 +2,12 @@ - + + + + - Vite App + DeFlock - ALPR Database
diff --git a/webapp/public/android-chrome-192x192.png b/webapp/public/android-chrome-192x192.png new file mode 100644 index 0000000..fe6a494 Binary files /dev/null and b/webapp/public/android-chrome-192x192.png differ diff --git a/webapp/public/android-chrome-512x512.png b/webapp/public/android-chrome-512x512.png new file mode 100644 index 0000000..d08d0c6 Binary files /dev/null and b/webapp/public/android-chrome-512x512.png differ diff --git a/webapp/public/apple-touch-icon.png b/webapp/public/apple-touch-icon.png new file mode 100644 index 0000000..d3ad6e0 Binary files /dev/null and b/webapp/public/apple-touch-icon.png differ diff --git a/webapp/public/deflock-logo.svg b/webapp/public/deflock-logo.svg index cab51c3..8aa9dc7 100644 --- a/webapp/public/deflock-logo.svg +++ b/webapp/public/deflock-logo.svg @@ -2,16 +2,23 @@ - de + + + + + + - + + - + + - + + - ock diff --git a/webapp/public/deflock-poster.pdf b/webapp/public/deflock-poster.pdf new file mode 100644 index 0000000..49ca882 Binary files /dev/null and b/webapp/public/deflock-poster.pdf differ diff --git a/webapp/public/favicon-16x16.png b/webapp/public/favicon-16x16.png new file mode 100644 index 0000000..f0d4118 Binary files /dev/null and b/webapp/public/favicon-16x16.png differ diff --git a/webapp/public/favicon-32x32.png b/webapp/public/favicon-32x32.png new file mode 100644 index 0000000..801f9a7 Binary files /dev/null and b/webapp/public/favicon-32x32.png differ diff --git a/webapp/public/favicon.ico b/webapp/public/favicon.ico index df36fcf..df01067 100644 Binary files a/webapp/public/favicon.ico and b/webapp/public/favicon.ico differ diff --git a/webapp/public/site.webmanifest b/webapp/public/site.webmanifest new file mode 100644 index 0000000..45dc8a2 --- /dev/null +++ b/webapp/public/site.webmanifest @@ -0,0 +1 @@ +{"name":"","short_name":"","icons":[{"src":"/android-chrome-192x192.png","sizes":"192x192","type":"image/png"},{"src":"/android-chrome-512x512.png","sizes":"512x512","type":"image/png"}],"theme_color":"#ffffff","background_color":"#ffffff","display":"standalone"} \ No newline at end of file diff --git a/webapp/src/App.vue b/webapp/src/App.vue index bed4061..a2de0d3 100644 --- a/webapp/src/App.vue +++ b/webapp/src/App.vue @@ -6,7 +6,9 @@ const items = [ { title: 'Map', icon: 'mdi-map', to: '/' }, { title: 'What is an ALPR?', icon: 'mdi-cctv', to: '/what-is-an-alpr' }, { title: 'Report an ALPR', icon: 'mdi-map-marker-plus', to: '/report' }, + { title: 'Feature Roadmap', icon: 'mdi-road-variant', to: '/roadmap' }, { title: 'About', icon: 'mdi-information', to: '/about' }, + { title: 'Contact', icon: 'mdi-email', to: '/contact' }, ] const drawer = ref(false) diff --git a/webapp/src/router/index.ts b/webapp/src/router/index.ts index e81f285..fd79288 100644 --- a/webapp/src/router/index.ts +++ b/webapp/src/router/index.ts @@ -3,6 +3,15 @@ import HomeView from '../views/HomeView.vue' const router = createRouter({ history: createWebHistory(import.meta.env.BASE_URL), + scrollBehavior(to, from, savedPosition) { + if (to.hash) { + return { + el: to.hash, + behavior: 'smooth', + } + } + return { top: 0 } + }, routes: [ { path: '/', @@ -27,6 +36,16 @@ const router = createRouter({ name: 'report', component: () => import('../views/ReportView.vue') }, + { + path: '/contact', + name: 'contact', + component: () => import('../views/ContactView.vue') + }, + { + path: '/roadmap', + name: 'roadmap', + component: () => import('../views/RoadmapView.vue') + } ] }) diff --git a/webapp/src/views/AboutView.vue b/webapp/src/views/AboutView.vue index d04929d..ea10f51 100644 --- a/webapp/src/views/AboutView.vue +++ b/webapp/src/views/AboutView.vue @@ -1,19 +1,53 @@ diff --git a/webapp/src/views/ContactView.vue b/webapp/src/views/ContactView.vue new file mode 100644 index 0000000..ebb1cb9 --- /dev/null +++ b/webapp/src/views/ContactView.vue @@ -0,0 +1,14 @@ + + + diff --git a/webapp/src/views/ReportView.vue b/webapp/src/views/ReportView.vue index 2a88ca6..7657a02 100644 --- a/webapp/src/views/ReportView.vue +++ b/webapp/src/views/ReportView.vue @@ -1,5 +1,15 @@ diff --git a/webapp/src/views/WhatIsAnALPRView.vue b/webapp/src/views/WhatIsAnALPRView.vue index 64f29c6..f163cda 100644 --- a/webapp/src/views/WhatIsAnALPRView.vue +++ b/webapp/src/views/WhatIsAnALPRView.vue @@ -6,37 +6,68 @@

What is an ALPR

- An Automated License Plate Reader (ALPR) is a technology that uses cameras and image processing to automatically read vehicle license plates. These cameras can be mounted on police cars, fixed on utility poles, or even positioned on private properties, capturing images of passing vehicles. ALPR systems extract plate numbers, record the time and location of the vehicle, and often cross-reference that information with databases for law enforcement or private monitoring purposes. This data can be used for a range of reasons, from catching stolen vehicles to tracking the movement of specific cars. -

-

- The primary use of ALPRs is surveillance—they gather data that can help create a detailed record of where a vehicle has been over time. This has raised privacy concerns since the vast majority of drivers are not involved in any crime, yet their movements are being documented. + Automated License Plate Readers (ALPRs) are cameras that capture images of all passing license plates, storing details like the car's location, date, and time. These cameras collect data on millions of vehicles—regardless of whether the driver is suspected of a crime. While these systems can be useful for tracking stolen cars or wanted individuals, they are mostly used to track the movements of innocent people.

-

What is NOT an ALPR

+

For a detailed explanation of how ALPRs are a threat to privacy, see this ACLU article on them.

+ +

Why Should You Be Concerned

+

+ ALPRs can invade your privacy and violate civil liberties in several key ways: +

+ +
+

Mass Surveillance

+

Your daily movements are tracked and logged, often indefinitely. This creates a detailed record of your daily activities. This information can be used to infer personal details about your life.

+ +

Data Sharing

+

ALPR data is often shared with other agencies, including federal law enforcement. This can lead to the creation of a massive database of innocent people's movements.

+ +

Chilling Effect on Freedoms

+

The knowledge that you are being watched can have a chilling effect on your freedom of speech and association. People may avoid attending protests or political events for fear of being tracked.

+ +

Potential for Abuse

+

Law enforcement officers or other individuals with access could misuse this data, for example, tracking ex-partners, political rivals, or targeting specific communities without oversight.

+
+ +

What They Look Like

+ +

+ The most common brand of ALPRs in the US is Flock Safety. They are easy to spot because they almost all look the same. They are usually mounted on a standalone black pole with a solar panel on top. The cameras are often placed near intersections or on main roads at the edge of a city or town. +

+ +

Not All Cameras are ALPRs

Not all cameras near roads are ALPRs. Many people mistakenly assume that every traffic camera or intersection camera is an ALPR, but that's not true. Here are some things ALPRs are not:

-

Traffic Cameras

-
- -

Standard traffic cameras typically capture live video or images of intersections to monitor traffic flow and manage signals. They do not specifically focus on reading license plates or storing data long-term.

-
+
+

Traffic Cameras

+
+ +

Standard traffic cameras typically capture live video or images of intersections to monitor traffic flow and manage signals. They do not specifically focus on reading license plates or storing data long-term.

+
-

Red Light Cameras/Speed Cameras

-
- -

These cameras are set up to capture violations, such as running a red light or speeding. They may record plate numbers when a violation is detected, but they do not perform continuous surveillance or collect location data over time.

-
+

Red Light Cameras/Speed Cameras

+
+ +

These cameras are set up to capture violations, such as running a red light or speeding. They may record plate numbers when a violation is detected, but they do not perform continuous surveillance or collect location data over time.

+
-

Security Cameras

-
- -

Cameras used by businesses or homeowners for security purposes may capture vehicles incidentally, but they are not specifically designed to automatically read and record license plates.

+

Security Cameras

+
+ +

Cameras used by businesses or homeowners for security purposes may capture vehicles incidentally, but they are not specifically designed to automatically read and record license plates.

+
+ +