Merge branch 'staging'

This commit is contained in:
Will Freeman
2025-11-04 20:38:19 -07:00
9 changed files with 62 additions and 165 deletions

View File

@@ -39,6 +39,9 @@
</p>
<ul>
<li>
In November 2025, <a target="_blank" href="https://www.404media.co/flock-logins-exposed-in-malware-infections-senator-asks-ftc-to-investigate-the-company/">a security researcher found Flock logins for sale on Russian hacking forums</a>, since Flock negligently doesn't require multifactor authentication, an alleged violation of federal law and industry standard security practices.
</li>
<li>
In January 2025, Motorola Solutions' ALPR system was <a href="https://www.404media.co/researcher-turns-insecure-license-plate-cameras-into-open-source-surveillance-tool/" target="_blank">found to have a critical security flaw</a> that allowed anyone to access live data from their cameras. Data includes <b>license plate numbers, make, model, color, and timestamps</b>. A <b>live feed</b> of both cameras (color and infrared) was also available to stream using a web browser.
</li>
@@ -110,11 +113,11 @@
<v-expansion-panel>
<v-expansion-panel-title class="font-weight-bold">
ALPR Errors Create Dangerous Police Interactions
ALPR Usage Leads to Dangerous Police Encounters
</v-expansion-panel-title>
<v-expansion-panel-text>
<p>
ALPR misread errors have led to dangerous police encounters, including pulling guns on innocent drivers. Here are just a few examples:
The negligent use of ALPRs has led to dangerous police encounters, including pulling guns on innocent drivers. Here are just a few examples:
</p>
<ul>
<li>
@@ -129,6 +132,9 @@
<li>
<a href="https://www.ktvu.com/news/privacy-advocate-sues-coco-sheriffs-deputies-after-license-plate-readers-target-his-car-stolen" target="_blank">Privacy advocate sues CoCo sheriff's deputies after license plate readers target his car stolen</a>
</li>
<li>
<a target="_blank" href="https://denverite.com/2025/10/27/bow-mar-flock-cameras-accusation/">A Denver woman had to prove her innocence</a> after incompetent detectives relied on Flock cameras to pin a $25 package theft on her <b>(video)</b>.
</li>
</ul>
</v-expansion-panel-text>
</v-expansion-panel>

View File

@@ -1,5 +1,16 @@
<template>
<v-expansion-panels multiple :model-value :readonly="showAll">
<v-expansion-panel>
<v-expansion-panel-title class="font-weight-bold">
Are ALPRs a necessary tool for police?
</v-expansion-panel-title>
<v-expansion-panel-text>
<p>
No. Police have always had methods to obtain location information for suspects of crimes. These methods used to require establishing probable cause and obtaining a search warrant, which provides oversight and accountability as required by the 4th Amendment. ALPRs, on the other hand, collect location data on all of us, and they are searched without any warrants or oversight.
</p>
</v-expansion-panel-text>
</v-expansion-panel>
<v-expansion-panel>
<v-expansion-panel-title class="font-weight-bold">
Why should I care if I have nothing to hide?
@@ -86,7 +97,10 @@
</v-expansion-panel-title>
<v-expansion-panel-text>
<p>
Absolutely not. Flock has been caught <i>several times</i> lying on the record. For example, their CEO was interviewed by Denver 9News, and <a href="https://youtu.be/aMfO7D-f7U0?si=23FNwA91zVTwxb02&t=898" target="_blank">he claimed that Flock had no federal contracts.</a> However, a couple weeks later, <a href="https://www.9news.com/article/news/local/flock-federal-immigration-agents-access-tracking-data/73-a8aee742-56d4-4a57-b5bb-0373286dfef8" target="_blank">9News discovered</a> that Border Patrol actually <i>did</i> have access to search Flock's systems. Flock described the data sharing agreement as "one-to-one", meaning an agency would have to accept the data sharing request from Border Patrol.
Absolutely not. In November 2025, <a target="_blank" href="https://www.404media.co/flock-logins-exposed-in-malware-infections-senator-asks-ftc-to-investigate-the-company/">a security researcher found Flock logins for sale on Russian hacking forums</a>, since Flock negligently doesn't require multifactor authentication, an alleged violation of federal law and industry standard security practices.
</p>
<p>
Flock has also been caught <i>several times</i> lying on the record. For example, their CEO was interviewed by Denver 9News, and <a href="https://youtu.be/aMfO7D-f7U0?si=23FNwA91zVTwxb02&t=898" target="_blank">he claimed that Flock had no federal contracts.</a> However, a couple weeks later, <a href="https://www.9news.com/article/news/local/flock-federal-immigration-agents-access-tracking-data/73-a8aee742-56d4-4a57-b5bb-0373286dfef8" target="_blank">9News discovered</a> that Border Patrol actually <i>did</i> have access to search Flock's systems. Flock described the data sharing agreement as "one-to-one", meaning an agency would have to accept the data sharing request from Border Patrol.
</p>
<p>
Doubtful of this claim, we filed <a href="https://www.muckrock.com/foi/boulder-172/boulder-alpr-audits-187797/" target="_blank">a public records request</a> with the Boulder Police Department in Colorado, and we found that "U.S. Border Patrol" was searching over 6,000 agencies, consistent with the number of agencies on the national network at the time. Either every agency on the national network happily accepted Border Patrol's request to their data, or Flock was lying on the record yet again.
@@ -100,13 +114,10 @@
</v-expansion-panel-title>
<v-expansion-panel-text>
<p>
Several cities in the US have killed contracts for ALPRs, such as <a target="_blank" href="https://www.denver7.com/news/local-news/denver-city-council-rejects-contract-expansion-for-license-plate-recognition-cameras-in-the-city">Denver</a> and <a target="_blank" href="http://eff.org/deeplinks/2025/06/victory-austin-organizers-cancel-citys-flock-alpr-contract">Austin</a>. An effective strategy is to raise concerns in your community, build a group of advocates, and petition the city council not to extend the contract. This can be done through public comment at meetings and is most effective when there is a large enough group of concerned residents.
Several cities in the US have killed contracts for ALPRs, such as <a target="_blank" href="https://www.denver7.com/news/local-news/denver-city-council-rejects-contract-expansion-for-license-plate-recognition-cameras-in-the-city">Denver</a> and <a target="_blank" href="http://eff.org/deeplinks/2025/06/victory-austin-organizers-cancel-citys-flock-alpr-contract">Austin</a>. An effective strategy is to raise concerns in your community, build a group of advocates, and petition the city council not to extend the contract.
</p>
<p>
<a target="_blank" href="https://youtu.be/YjaH_1Ia6NA">
<v-icon start>mdi-youtube</v-icon>
Watch Denver's talking points by Councilmember Sarah Parady
</a>
For more info, please see our <router-link to="/council">city council page</router-link> and join our Discord for support.
</p>
</v-expansion-panel-text>
</v-expansion-panel>
@@ -114,7 +125,6 @@
</template>
<script setup lang="ts">
import QuotedSource from '@/components/QuotedSource.vue';
import { ref, onMounted, watch } from 'vue';
const props = defineProps({

View File

@@ -102,7 +102,7 @@ interface SimilarProject {
const similarProjects: SimilarProject[] = [
{
name: "Have I Been Flocked?",
description: "A tool to check if your license plate has been searched in Flock's system.",
description: "See if your license plate has been searched in Flock's system, as well as disturbing trends in Flock usage.",
url: "https://haveibeenflocked.com",
imageUrl: "/similar-projects/hibf.webp"
},

View File

@@ -1,71 +0,0 @@
import { ref, readonly } from 'vue';
interface FeatureFlags {
iosApp: {
enabled: boolean;
appUrl: string;
};
}
const flags = ref<FeatureFlags | null>(null);
const isLoading = ref(false);
const error = ref<string | null>(null);
let fetchPromise: Promise<void> | null = null;
async function fetchFeatureFlags(): Promise<void> {
if (flags.value !== null) {
// Already loaded
return;
}
if (fetchPromise) {
// Already fetching, wait for the existing promise
return fetchPromise;
}
fetchPromise = (async () => {
try {
isLoading.value = true;
error.value = null;
const response = await fetch('https://cdn.deflock.me/config/flags.json');
if (!response.ok) {
throw new Error(`Failed to fetch feature flags: ${response.status}`);
}
const data = await response.json();
flags.value = data;
} catch (err) {
error.value = err instanceof Error ? err.message : 'Unknown error';
console.warn('Failed to load feature flags, using defaults:', error.value);
// Fallback to default values
flags.value = {
iosApp: {
enabled: false,
appUrl: ''
}
};
} finally {
isLoading.value = false;
}
})();
return fetchPromise;
}
export function useFeatureFlags() {
// Auto-fetch on first use
if (!fetchPromise) {
fetchFeatureFlags();
}
return {
flags: readonly(flags),
isLoading: readonly(isLoading),
error: readonly(error),
refresh: fetchFeatureFlags
};
}

View File

@@ -7,7 +7,7 @@
<v-container class="mb-16">
<!-- Introduction Section -->
<v-row class="mb-12">
<v-row>
<v-col cols="12" md="10" lg="8" class="mx-auto">
<div class="text-center mb-8">
<v-icon size="64" color="var(--df-blue)" class="mb-4">mdi-account-voice</v-icon>
@@ -20,6 +20,31 @@
</v-col>
</v-row>
<!-- Talking Points -->
<v-row class="mb-8">
<v-col cols="12" md="10" lg="8" class="mx-auto">
<v-card
class="pa-4"
elevation="2"
rounded="lg"
hover
href="https://consumerrights.wiki/w/Common_Questions,_Arguments,_%26_Responses_when_discussing_Flock_Surveillance"
target="_blank"
>
<div class="d-flex align-center justify-space-between">
<div class="d-flex align-center">
<v-icon color="primary" class="mr-3 align-self-center">mdi-comment-alert</v-icon>
<div>
<h4 class="text-h6 font-weight-bold mb-1">Talking Points</h4>
<p class="text-body-2 mb-0">Common questions, arguments & responses for discussing surveillance</p>
</div>
</div>
<v-icon color="primary" class="align-self-center">mdi-open-in-new</v-icon>
</div>
</v-card>
</v-col>
</v-row>
<!-- Step 1: One-on-One Meetings -->
<v-row class="mb-12">
<v-col cols="12" md="10" lg="8" class="mx-auto">

View File

@@ -40,8 +40,7 @@
<span v-if="appLinks.android">Get on Android</span>
<span v-else>Android Coming Soon</span>
</v-btn>
<!-- Documentation Link -->
<v-btn
size="large"
variant="text"
@@ -231,11 +230,8 @@
<script setup lang="ts">
import Footer from '@/components/layout/Footer.vue';
import { useFeatureFlags } from '@/composables/useFeatureFlags';
import { ref, computed } from 'vue';
const { flags } = useFeatureFlags();
interface Feature {
id: number;
title: string;
@@ -269,10 +265,10 @@ interface PrivacyPrinciple {
description: string;
}
const appLinks = computed(() => ({
const appLinks = {
android: 'https://play.google.com/store/apps/details?id=me.deflock.deflockapp',
ios: flags.value?.iosApp.enabled ? flags.value.iosApp.appUrl : undefined,
}));
ios: undefined,
}
// App features
const features: Feature[] = [
@@ -492,17 +488,6 @@ const visibleScreenshots = computed(() =>
color: white !important;
}
.doc-btn {
color: white !important;
opacity: 0.9;
transition: all 0.3s ease;
}
.doc-btn:hover {
opacity: 1;
transform: translateY(-2px);
}
.hero-image {
display: flex;
justify-content: center;

View File

@@ -37,7 +37,7 @@
<h2 class="display-2 mb-4">The Dangers of ALPRs</h2>
<p class="px-6">
ALPRs are a serious risk to your privacy and civil liberties. These systems continuously record people's movements, often without a warrant, probable cause, or even reasonable suspicion. Your driving history is rarely confined to the town or city where the cameras are installed. It's typically shared with <router-link to="/what-is-an-alpr#faq-transparency">thousands of other agencies nationwide (secretly)</router-link>. Once the data is out of your community, you have no control over how it's used or what rules apply. And once this kind of tracking infrastructure exists, there are no guarantees it will only be used against criminals.
ALPRs are a serious risk to your privacy and civil liberties. These systems continuously record people's movements without a warrant, probable cause, or even reasonable suspicion. Your driving history is rarely confined to the town or city where the cameras are installed. It's typically shared with <router-link to="/what-is-an-alpr#faq-transparency">thousands of other agencies nationwide (secretly)</router-link>. Once the data is out of your community, you have no control over how it's used or what rules apply.
</p>
<p class="px-6 pt-6">
Learn more about how Flock, the most popular ALPR vendor<sup>1</sup>, is being used in your community on the independent site:
@@ -47,7 +47,7 @@
</a>.
</p>
<footer class="serif text-grey-darken-2 mt-4">
<small><sup>[1]</sup> This claim is based on an OSM Overpass API query conducted on 7/21/2025</small>
<small><sup>[1]</sup> This claim is based on an OSM Overpass API query conducted on 11/04/2025</small>
</footer>
<v-row class="align-center mt-4">

View File

@@ -28,52 +28,6 @@
</v-row>
<v-row justify="center">
<!-- App Card - shown first when enabled -->
<v-col
v-if="isIosAppEnabled"
cols="12"
md="5"
class="pa-4"
>
<div class="app-card-container">
<v-card
class="mx-auto h-100 d-flex flex-column"
elevation="4"
hover
to="/app"
>
<v-card-item class="bg-green-darken-3">
<v-card-title class="text-h5 font-weight-bold text-white">
DeFlock App
</v-card-title>
<v-card-subtitle class="pt-2">
for iOS and Android
</v-card-subtitle>
</v-card-item>
<v-img cover :aspect-ratio="1.5" class="mx-auto mt-5" src="/app-screenshots/df-app.webp" style="width: 90%; border-radius: 8px;" />
<v-card-text class="text-body-1">
<p class="mb-4 sans-serif">The <b>DeFlock App</b> provides a simple mobile interface that's easy to use while walking around.</p>
</v-card-text>
<v-card-actions class="pa-4">
<v-btn
block
color="green-darken-2"
variant="elevated"
size="large"
to="/app"
>
Download App
<v-icon icon="mdi-arrow-right" end></v-icon>
</v-btn>
</v-card-actions>
</v-card>
</div>
</v-col>
<!-- Legacy Editor Card -->
<v-col cols="12" md="5" class="pa-4">
<v-card
class="mx-auto h-100 d-flex flex-column"
@@ -111,17 +65,12 @@
</v-card>
</v-col>
<!-- App Card - shown second when disabled (with coming soon banner) -->
<v-col
v-if="!isIosAppEnabled"
cols="12"
md="5"
class="pa-4"
>
<v-col cols="12" md="5" class="pa-4">
<div class="app-card-container">
<v-card
class="mx-auto h-100 d-flex flex-column app-card-disabled"
elevation="4"
:class="{ 'card-disabled': true }"
>
<v-card-item class="bg-green-darken-3">
<v-card-title class="text-h5 font-weight-bold text-white">
@@ -172,13 +121,6 @@
<script setup lang="ts">
import ALPRVerificationDialog from '@/components/ALPRVerificationDialog.vue';
import { useFeatureFlags } from '@/composables/useFeatureFlags';
import { computed } from 'vue';
const { flags } = useFeatureFlags();
// Computed properties for iOS app state
const isIosAppEnabled = computed(() => flags.value?.iosApp.enabled ?? false);
</script>
<style scoped>
@@ -196,7 +138,7 @@ const isIosAppEnabled = computed(() => flags.value?.iosApp.enabled ?? false);
position: relative;
}
.app-card-disabled {
.card-disabled {
opacity: 0.7;
pointer-events: none;
cursor: not-allowed;

View File

@@ -41,7 +41,7 @@
<v-divider class="my-12" />
<SimilarProjects />
<SimilarProjects id="similar" />
</v-container>
<Footer />
</template>