├── lib ├── clientUtils.js ├── utils.js ├── cleanupService.js ├── sse.js ├── agentchat-utils.ts ├── version.js └── notifications.js ├── .eslintrc.json ├── 1024.png ├── 180.png ├── 192.png ├── 512.png ├── Images ├── 1.png ├── 2.png ├── 3.png ├── 4.png ├── 5.png ├── db.jpg ├── Hero.jpg ├── dash.jpg ├── push.jpg ├── tags.jpg ├── tpms.jpg ├── alert.JPG ├── apikey.png ├── hero2.png ├── viewer.jpg ├── app_icon.png ├── blueiris.png ├── insights.jpg └── liveview.jpg ├── app ├── 1024.png ├── 180.png ├── 192.png ├── 512.png ├── favicon.ico ├── apple-icon.png ├── fonts │ ├── GeistVF.woff │ └── GeistMonoVF.woff ├── page.jsx ├── api │ ├── check-update │ │ └── route.js │ ├── health-check │ │ └── route.js │ ├── _startup.js │ ├── verify-key │ │ └── route.js │ ├── mqtt │ │ └── brokers │ │ │ ├── route.js │ │ │ └── [id] │ │ │ └── route.js │ ├── notifications │ │ └── test │ │ │ └── route.js │ ├── verify-session │ │ └── route.js │ ├── sse │ │ └── route.js │ └── verify-whitelist │ │ └── route.js ├── training │ ├── page.jsx │ └── TrainingControl.jsx ├── backfill │ ├── page.jsx │ └── BackfillButton.jsx ├── download │ └── page.jsx ├── flagged │ └── page.jsx ├── settings │ └── page.jsx ├── manifest.js ├── dashboard │ ├── page.jsx │ ├── CameraSelect.jsx │ └── TimeSelect.jsx ├── database │ └── page.jsx ├── logs │ ├── LogMessage.jsx │ └── page.jsx ├── images │ └── [...path] │ │ └── route.js ├── known_plates │ └── page.jsx ├── components │ └── ui │ │ └── tooltip.jsx ├── notifications │ └── page.jsx ├── update │ └── BackfillButton.jsx ├── live_feed │ ├── viewer │ │ └── page.jsx │ └── page.jsx ├── globals.css ├── favicon.svg └── help │ └── page.jsx ├── public ├── 1024.png ├── 180.png ├── 512.png ├── alpr.jpg ├── icon.png ├── fallback.jpg ├── placeholder.jpg ├── test-plate.jpg ├── license-plate.ico ├── icon512_maskable.png ├── icon512_rounded.png ├── splash_screens │ ├── 10.2__iPad_portrait.png │ ├── 10.2__iPad_landscape.png │ ├── iPhone_16_Pro_portrait.png │ ├── 10.5__iPad_Air_landscape.png │ ├── 10.5__iPad_Air_portrait.png │ ├── 10.9__iPad_Air_landscape.png │ ├── 10.9__iPad_Air_portrait.png │ ├── 11__iPad_Pro_M4_portrait.png │ ├── 12.9__iPad_Pro_landscape.png │ ├── 12.9__iPad_Pro_portrait.png │ ├── 13__iPad_Pro_M4_portrait.png │ ├── 8.3__iPad_Mini_landscape.png │ ├── 8.3__iPad_Mini_portrait.png │ ├── iPhone_16_Pro_landscape.png │ ├── 11__iPad_Pro_M4_landscape.png │ ├── 13__iPad_Pro_M4_landscape.png │ ├── iPhone_16_Pro_Max_landscape.png │ ├── iPhone_16_Pro_Max_portrait.png │ ├── iPhone_11__iPhone_XR_portrait.png │ ├── iPhone_11__iPhone_XR_landscape.png │ ├── 11__iPad_Pro__10.5__iPad_Pro_portrait.png │ ├── 11__iPad_Pro__10.5__iPad_Pro_landscape.png │ ├── iPhone_11_Pro_Max__iPhone_XS_Max_landscape.png │ ├── iPhone_11_Pro_Max__iPhone_XS_Max_portrait.png │ ├── 4__iPhone_SE__iPod_touch_5th_generation_and_later_landscape.png │ ├── 4__iPhone_SE__iPod_touch_5th_generation_and_later_portrait.png │ ├── iPhone_16__iPhone_15_Pro__iPhone_15__iPhone_14_Pro_portrait.png │ ├── iPhone_14_Plus__iPhone_13_Pro_Max__iPhone_12_Pro_Max_landscape.png │ ├── iPhone_14_Plus__iPhone_13_Pro_Max__iPhone_12_Pro_Max_portrait.png │ ├── iPhone_16__iPhone_15_Pro__iPhone_15__iPhone_14_Pro_landscape.png │ ├── 9.7__iPad_Pro__7.9__iPad_mini__9.7__iPad_Air__9.7__iPad_portrait.png │ ├── iPhone_8__iPhone_7__iPhone_6s__iPhone_6__4.7__iPhone_SE_portrait.png │ ├── 9.7__iPad_Pro__7.9__iPad_mini__9.7__iPad_Air__9.7__iPad_landscape.png │ ├── iPhone_8__iPhone_7__iPhone_6s__iPhone_6__4.7__iPhone_SE_landscape.png │ ├── iPhone_8_Plus__iPhone_7_Plus__iPhone_6s_Plus__iPhone_6_Plus_landscape.png │ ├── iPhone_8_Plus__iPhone_7_Plus__iPhone_6s_Plus__iPhone_6_Plus_portrait.png │ ├── iPhone_14__iPhone_13_Pro__iPhone_13__iPhone_12_Pro__iPhone_12_landscape.png │ ├── iPhone_14__iPhone_13_Pro__iPhone_13__iPhone_12_Pro__iPhone_12_portrait.png │ ├── iPhone_13_mini__iPhone_12_mini__iPhone_11_Pro__iPhone_XS__iPhone_X_landscape.png │ ├── iPhone_13_mini__iPhone_12_mini__iPhone_11_Pro__iPhone_XS__iPhone_X_portrait.png │ ├── iPhone_16_Plus__iPhone_15_Pro_Max__iPhone_15_Plus__iPhone_14_Pro_Max_portrait.png │ └── iPhone_16_Plus__iPhone_15_Pro_Max__iPhone_15_Plus__iPhone_14_Pro_Max_landscape.png ├── vercel.svg ├── window.svg ├── file.svg ├── manifest.json ├── globe.svg └── next.svg ├── postcss.config.mjs ├── components ├── ui │ ├── aspect-ratio.jsx │ ├── skeleton.jsx │ ├── collapsible.jsx │ ├── label.jsx │ ├── separator.jsx │ ├── textarea.jsx │ ├── progress.jsx │ ├── toaster.jsx │ ├── checkbox.jsx │ ├── sonner.jsx │ ├── slider.jsx │ ├── hover-card.jsx │ ├── avatar.jsx │ ├── tooltip.jsx │ ├── input.jsx │ ├── switch.jsx │ ├── badge.jsx │ ├── popover.jsx │ ├── radio-group.jsx │ ├── toggle-group.jsx │ ├── scroll-area.jsx │ ├── toggle-switch.jsx │ ├── toggle.jsx │ ├── alert.jsx │ ├── card.jsx │ ├── accordion.jsx │ ├── resizable.jsx │ ├── tabs.jsx │ ├── input-otp.jsx │ ├── button.jsx │ ├── breadcrumb.jsx │ ├── table.jsx │ ├── drawer.jsx │ ├── pagination.jsx │ ├── calendar.jsx │ ├── dialog.jsx │ ├── form.jsx │ ├── alert-dialog.jsx │ └── sheet.jsx ├── icons │ └── tpms.jsx ├── layout │ ├── MainLayout.jsx │ ├── BasicTitle.jsx │ ├── LiveFeedNav.jsx │ └── TitleNav.jsx ├── TrainingHandler.jsx ├── MetricsHandler.jsx ├── ThemeToggle.jsx ├── chat │ ├── ChatContext.jsx │ └── ChatButton.jsx ├── PlateImage.jsx ├── LiveFeedTable.jsx ├── TestNotificationButton.jsx ├── ImageViewer.jsx └── debugTable.jsx ├── .dockerignore ├── jsconfig.json ├── next.config.js ├── components.json ├── hooks ├── use-mobile.jsx └── use-toast.js ├── tsconfig.json ├── docker-compose.without-database.yml ├── .gitignore ├── docker-compose-dbonly.yml ├── LICENSE ├── test-mqtt.js ├── example.json ├── Dockerfile ├── json-dump-example.json ├── docker-compose.yml ├── logging └── logger.js ├── CHANGELOG.md ├── tailwind.config.js └── package.json /lib/clientUtils.js: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "next/core-web-vitals" 3 | } 4 | -------------------------------------------------------------------------------- /1024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algertc/ALPR-Database/HEAD/1024.png -------------------------------------------------------------------------------- /180.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algertc/ALPR-Database/HEAD/180.png -------------------------------------------------------------------------------- /192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algertc/ALPR-Database/HEAD/192.png -------------------------------------------------------------------------------- /512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algertc/ALPR-Database/HEAD/512.png -------------------------------------------------------------------------------- /Images/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algertc/ALPR-Database/HEAD/Images/1.png -------------------------------------------------------------------------------- /Images/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algertc/ALPR-Database/HEAD/Images/2.png -------------------------------------------------------------------------------- /Images/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algertc/ALPR-Database/HEAD/Images/3.png -------------------------------------------------------------------------------- /Images/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algertc/ALPR-Database/HEAD/Images/4.png -------------------------------------------------------------------------------- /Images/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algertc/ALPR-Database/HEAD/Images/5.png -------------------------------------------------------------------------------- /Images/db.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algertc/ALPR-Database/HEAD/Images/db.jpg -------------------------------------------------------------------------------- /app/1024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algertc/ALPR-Database/HEAD/app/1024.png -------------------------------------------------------------------------------- /app/180.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algertc/ALPR-Database/HEAD/app/180.png -------------------------------------------------------------------------------- /app/192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algertc/ALPR-Database/HEAD/app/192.png -------------------------------------------------------------------------------- /app/512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algertc/ALPR-Database/HEAD/app/512.png -------------------------------------------------------------------------------- /Images/Hero.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algertc/ALPR-Database/HEAD/Images/Hero.jpg -------------------------------------------------------------------------------- /Images/dash.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algertc/ALPR-Database/HEAD/Images/dash.jpg -------------------------------------------------------------------------------- /Images/push.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algertc/ALPR-Database/HEAD/Images/push.jpg -------------------------------------------------------------------------------- /Images/tags.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algertc/ALPR-Database/HEAD/Images/tags.jpg -------------------------------------------------------------------------------- /Images/tpms.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algertc/ALPR-Database/HEAD/Images/tpms.jpg -------------------------------------------------------------------------------- /app/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algertc/ALPR-Database/HEAD/app/favicon.ico -------------------------------------------------------------------------------- /public/1024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algertc/ALPR-Database/HEAD/public/1024.png -------------------------------------------------------------------------------- /public/180.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algertc/ALPR-Database/HEAD/public/180.png -------------------------------------------------------------------------------- /public/512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algertc/ALPR-Database/HEAD/public/512.png -------------------------------------------------------------------------------- /public/alpr.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algertc/ALPR-Database/HEAD/public/alpr.jpg -------------------------------------------------------------------------------- /public/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algertc/ALPR-Database/HEAD/public/icon.png -------------------------------------------------------------------------------- /Images/alert.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algertc/ALPR-Database/HEAD/Images/alert.JPG -------------------------------------------------------------------------------- /Images/apikey.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algertc/ALPR-Database/HEAD/Images/apikey.png -------------------------------------------------------------------------------- /Images/hero2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algertc/ALPR-Database/HEAD/Images/hero2.png -------------------------------------------------------------------------------- /Images/viewer.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algertc/ALPR-Database/HEAD/Images/viewer.jpg -------------------------------------------------------------------------------- /app/apple-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algertc/ALPR-Database/HEAD/app/apple-icon.png -------------------------------------------------------------------------------- /Images/app_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algertc/ALPR-Database/HEAD/Images/app_icon.png -------------------------------------------------------------------------------- /Images/blueiris.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algertc/ALPR-Database/HEAD/Images/blueiris.png -------------------------------------------------------------------------------- /Images/insights.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algertc/ALPR-Database/HEAD/Images/insights.jpg -------------------------------------------------------------------------------- /Images/liveview.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algertc/ALPR-Database/HEAD/Images/liveview.jpg -------------------------------------------------------------------------------- /public/fallback.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algertc/ALPR-Database/HEAD/public/fallback.jpg -------------------------------------------------------------------------------- /app/fonts/GeistVF.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algertc/ALPR-Database/HEAD/app/fonts/GeistVF.woff -------------------------------------------------------------------------------- /public/placeholder.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algertc/ALPR-Database/HEAD/public/placeholder.jpg -------------------------------------------------------------------------------- /public/test-plate.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algertc/ALPR-Database/HEAD/public/test-plate.jpg -------------------------------------------------------------------------------- /public/license-plate.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algertc/ALPR-Database/HEAD/public/license-plate.ico -------------------------------------------------------------------------------- /app/fonts/GeistMonoVF.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algertc/ALPR-Database/HEAD/app/fonts/GeistMonoVF.woff -------------------------------------------------------------------------------- /public/icon512_maskable.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algertc/ALPR-Database/HEAD/public/icon512_maskable.png -------------------------------------------------------------------------------- /public/icon512_rounded.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algertc/ALPR-Database/HEAD/public/icon512_rounded.png -------------------------------------------------------------------------------- /public/splash_screens/10.2__iPad_portrait.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algertc/ALPR-Database/HEAD/public/splash_screens/10.2__iPad_portrait.png -------------------------------------------------------------------------------- /public/vercel.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/splash_screens/10.2__iPad_landscape.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algertc/ALPR-Database/HEAD/public/splash_screens/10.2__iPad_landscape.png -------------------------------------------------------------------------------- /public/splash_screens/iPhone_16_Pro_portrait.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algertc/ALPR-Database/HEAD/public/splash_screens/iPhone_16_Pro_portrait.png -------------------------------------------------------------------------------- /public/splash_screens/10.5__iPad_Air_landscape.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algertc/ALPR-Database/HEAD/public/splash_screens/10.5__iPad_Air_landscape.png -------------------------------------------------------------------------------- /public/splash_screens/10.5__iPad_Air_portrait.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algertc/ALPR-Database/HEAD/public/splash_screens/10.5__iPad_Air_portrait.png -------------------------------------------------------------------------------- /public/splash_screens/10.9__iPad_Air_landscape.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algertc/ALPR-Database/HEAD/public/splash_screens/10.9__iPad_Air_landscape.png -------------------------------------------------------------------------------- /public/splash_screens/10.9__iPad_Air_portrait.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algertc/ALPR-Database/HEAD/public/splash_screens/10.9__iPad_Air_portrait.png -------------------------------------------------------------------------------- /public/splash_screens/11__iPad_Pro_M4_portrait.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algertc/ALPR-Database/HEAD/public/splash_screens/11__iPad_Pro_M4_portrait.png -------------------------------------------------------------------------------- /public/splash_screens/12.9__iPad_Pro_landscape.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algertc/ALPR-Database/HEAD/public/splash_screens/12.9__iPad_Pro_landscape.png -------------------------------------------------------------------------------- /public/splash_screens/12.9__iPad_Pro_portrait.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algertc/ALPR-Database/HEAD/public/splash_screens/12.9__iPad_Pro_portrait.png -------------------------------------------------------------------------------- /public/splash_screens/13__iPad_Pro_M4_portrait.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algertc/ALPR-Database/HEAD/public/splash_screens/13__iPad_Pro_M4_portrait.png -------------------------------------------------------------------------------- /public/splash_screens/8.3__iPad_Mini_landscape.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algertc/ALPR-Database/HEAD/public/splash_screens/8.3__iPad_Mini_landscape.png -------------------------------------------------------------------------------- /public/splash_screens/8.3__iPad_Mini_portrait.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algertc/ALPR-Database/HEAD/public/splash_screens/8.3__iPad_Mini_portrait.png -------------------------------------------------------------------------------- /public/splash_screens/iPhone_16_Pro_landscape.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algertc/ALPR-Database/HEAD/public/splash_screens/iPhone_16_Pro_landscape.png -------------------------------------------------------------------------------- /public/splash_screens/11__iPad_Pro_M4_landscape.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algertc/ALPR-Database/HEAD/public/splash_screens/11__iPad_Pro_M4_landscape.png -------------------------------------------------------------------------------- /public/splash_screens/13__iPad_Pro_M4_landscape.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algertc/ALPR-Database/HEAD/public/splash_screens/13__iPad_Pro_M4_landscape.png -------------------------------------------------------------------------------- /public/splash_screens/iPhone_16_Pro_Max_landscape.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algertc/ALPR-Database/HEAD/public/splash_screens/iPhone_16_Pro_Max_landscape.png -------------------------------------------------------------------------------- /public/splash_screens/iPhone_16_Pro_Max_portrait.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algertc/ALPR-Database/HEAD/public/splash_screens/iPhone_16_Pro_Max_portrait.png -------------------------------------------------------------------------------- /public/splash_screens/iPhone_11__iPhone_XR_portrait.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algertc/ALPR-Database/HEAD/public/splash_screens/iPhone_11__iPhone_XR_portrait.png -------------------------------------------------------------------------------- /public/splash_screens/iPhone_11__iPhone_XR_landscape.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algertc/ALPR-Database/HEAD/public/splash_screens/iPhone_11__iPhone_XR_landscape.png -------------------------------------------------------------------------------- /public/splash_screens/11__iPad_Pro__10.5__iPad_Pro_portrait.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algertc/ALPR-Database/HEAD/public/splash_screens/11__iPad_Pro__10.5__iPad_Pro_portrait.png -------------------------------------------------------------------------------- /postcss.config.mjs: -------------------------------------------------------------------------------- 1 | /** @type {import('postcss-load-config').Config} */ 2 | const config = { 3 | plugins: { 4 | tailwindcss: {}, 5 | }, 6 | }; 7 | 8 | export default config; 9 | -------------------------------------------------------------------------------- /public/splash_screens/11__iPad_Pro__10.5__iPad_Pro_landscape.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algertc/ALPR-Database/HEAD/public/splash_screens/11__iPad_Pro__10.5__iPad_Pro_landscape.png -------------------------------------------------------------------------------- /public/splash_screens/iPhone_11_Pro_Max__iPhone_XS_Max_landscape.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algertc/ALPR-Database/HEAD/public/splash_screens/iPhone_11_Pro_Max__iPhone_XS_Max_landscape.png -------------------------------------------------------------------------------- /public/splash_screens/iPhone_11_Pro_Max__iPhone_XS_Max_portrait.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algertc/ALPR-Database/HEAD/public/splash_screens/iPhone_11_Pro_Max__iPhone_XS_Max_portrait.png -------------------------------------------------------------------------------- /components/ui/aspect-ratio.jsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | 3 | import * as AspectRatioPrimitive from "@radix-ui/react-aspect-ratio" 4 | 5 | const AspectRatio = AspectRatioPrimitive.Root 6 | 7 | export { AspectRatio } 8 | -------------------------------------------------------------------------------- /public/splash_screens/4__iPhone_SE__iPod_touch_5th_generation_and_later_landscape.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algertc/ALPR-Database/HEAD/public/splash_screens/4__iPhone_SE__iPod_touch_5th_generation_and_later_landscape.png -------------------------------------------------------------------------------- /public/splash_screens/4__iPhone_SE__iPod_touch_5th_generation_and_later_portrait.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algertc/ALPR-Database/HEAD/public/splash_screens/4__iPhone_SE__iPod_touch_5th_generation_and_later_portrait.png -------------------------------------------------------------------------------- /public/splash_screens/iPhone_16__iPhone_15_Pro__iPhone_15__iPhone_14_Pro_portrait.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algertc/ALPR-Database/HEAD/public/splash_screens/iPhone_16__iPhone_15_Pro__iPhone_15__iPhone_14_Pro_portrait.png -------------------------------------------------------------------------------- /public/splash_screens/iPhone_14_Plus__iPhone_13_Pro_Max__iPhone_12_Pro_Max_landscape.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algertc/ALPR-Database/HEAD/public/splash_screens/iPhone_14_Plus__iPhone_13_Pro_Max__iPhone_12_Pro_Max_landscape.png -------------------------------------------------------------------------------- /public/splash_screens/iPhone_14_Plus__iPhone_13_Pro_Max__iPhone_12_Pro_Max_portrait.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algertc/ALPR-Database/HEAD/public/splash_screens/iPhone_14_Plus__iPhone_13_Pro_Max__iPhone_12_Pro_Max_portrait.png -------------------------------------------------------------------------------- /public/splash_screens/iPhone_16__iPhone_15_Pro__iPhone_15__iPhone_14_Pro_landscape.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algertc/ALPR-Database/HEAD/public/splash_screens/iPhone_16__iPhone_15_Pro__iPhone_15__iPhone_14_Pro_landscape.png -------------------------------------------------------------------------------- /public/splash_screens/9.7__iPad_Pro__7.9__iPad_mini__9.7__iPad_Air__9.7__iPad_portrait.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algertc/ALPR-Database/HEAD/public/splash_screens/9.7__iPad_Pro__7.9__iPad_mini__9.7__iPad_Air__9.7__iPad_portrait.png -------------------------------------------------------------------------------- /public/splash_screens/iPhone_8__iPhone_7__iPhone_6s__iPhone_6__4.7__iPhone_SE_portrait.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algertc/ALPR-Database/HEAD/public/splash_screens/iPhone_8__iPhone_7__iPhone_6s__iPhone_6__4.7__iPhone_SE_portrait.png -------------------------------------------------------------------------------- /public/splash_screens/9.7__iPad_Pro__7.9__iPad_mini__9.7__iPad_Air__9.7__iPad_landscape.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algertc/ALPR-Database/HEAD/public/splash_screens/9.7__iPad_Pro__7.9__iPad_mini__9.7__iPad_Air__9.7__iPad_landscape.png -------------------------------------------------------------------------------- /public/splash_screens/iPhone_8__iPhone_7__iPhone_6s__iPhone_6__4.7__iPhone_SE_landscape.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algertc/ALPR-Database/HEAD/public/splash_screens/iPhone_8__iPhone_7__iPhone_6s__iPhone_6__4.7__iPhone_SE_landscape.png -------------------------------------------------------------------------------- /public/splash_screens/iPhone_8_Plus__iPhone_7_Plus__iPhone_6s_Plus__iPhone_6_Plus_landscape.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algertc/ALPR-Database/HEAD/public/splash_screens/iPhone_8_Plus__iPhone_7_Plus__iPhone_6s_Plus__iPhone_6_Plus_landscape.png -------------------------------------------------------------------------------- /public/splash_screens/iPhone_8_Plus__iPhone_7_Plus__iPhone_6s_Plus__iPhone_6_Plus_portrait.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algertc/ALPR-Database/HEAD/public/splash_screens/iPhone_8_Plus__iPhone_7_Plus__iPhone_6s_Plus__iPhone_6_Plus_portrait.png -------------------------------------------------------------------------------- /public/splash_screens/iPhone_14__iPhone_13_Pro__iPhone_13__iPhone_12_Pro__iPhone_12_landscape.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algertc/ALPR-Database/HEAD/public/splash_screens/iPhone_14__iPhone_13_Pro__iPhone_13__iPhone_12_Pro__iPhone_12_landscape.png -------------------------------------------------------------------------------- /public/splash_screens/iPhone_14__iPhone_13_Pro__iPhone_13__iPhone_12_Pro__iPhone_12_portrait.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algertc/ALPR-Database/HEAD/public/splash_screens/iPhone_14__iPhone_13_Pro__iPhone_13__iPhone_12_Pro__iPhone_12_portrait.png -------------------------------------------------------------------------------- /public/splash_screens/iPhone_13_mini__iPhone_12_mini__iPhone_11_Pro__iPhone_XS__iPhone_X_landscape.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algertc/ALPR-Database/HEAD/public/splash_screens/iPhone_13_mini__iPhone_12_mini__iPhone_11_Pro__iPhone_XS__iPhone_X_landscape.png -------------------------------------------------------------------------------- /public/splash_screens/iPhone_13_mini__iPhone_12_mini__iPhone_11_Pro__iPhone_XS__iPhone_X_portrait.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algertc/ALPR-Database/HEAD/public/splash_screens/iPhone_13_mini__iPhone_12_mini__iPhone_11_Pro__iPhone_XS__iPhone_X_portrait.png -------------------------------------------------------------------------------- /public/splash_screens/iPhone_16_Plus__iPhone_15_Pro_Max__iPhone_15_Plus__iPhone_14_Pro_Max_portrait.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algertc/ALPR-Database/HEAD/public/splash_screens/iPhone_16_Plus__iPhone_15_Pro_Max__iPhone_15_Plus__iPhone_14_Pro_Max_portrait.png -------------------------------------------------------------------------------- /public/splash_screens/iPhone_16_Plus__iPhone_15_Pro_Max__iPhone_15_Plus__iPhone_14_Pro_Max_landscape.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algertc/ALPR-Database/HEAD/public/splash_screens/iPhone_16_Plus__iPhone_15_Pro_Max__iPhone_15_Plus__iPhone_14_Pro_Max_landscape.png -------------------------------------------------------------------------------- /.dockerignore: -------------------------------------------------------------------------------- 1 | .dockerignore 2 | 3 | # Not needed as we are bundling the whole app 4 | node_modules 5 | # Log files 6 | logs 7 | *.log 8 | npm-debug.log* 9 | pnpm-debug.log* 10 | yarn-debug.log* 11 | yarn-error.log* 12 | .next 13 | .git 14 | install.sh 15 | update.sh 16 | 17 | config/* 18 | logs/* 19 | auth/* 20 | storage/* 21 | -------------------------------------------------------------------------------- /components/ui/skeleton.jsx: -------------------------------------------------------------------------------- 1 | import { cn } from "@/lib/utils" 2 | 3 | function Skeleton({ 4 | className, 5 | ...props 6 | }) { 7 | return ( 8 | (
) 11 | ); 12 | } 13 | 14 | export { Skeleton } 15 | -------------------------------------------------------------------------------- /components/icons/tpms.jsx: -------------------------------------------------------------------------------- 1 | import Image from "next/image"; 2 | import TPMSIcon from "/public/tpms.svg"; 3 | 4 | const TPMS = ({ size = 20 }) => { 5 | return ( 6 |Coming soon...
11 |No known plates found in the database.
24 | )} 25 |{response}
} 34 | > 35 | ); 36 | } 37 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 Charlie Algert 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /test-mqtt.js: -------------------------------------------------------------------------------- 1 | // test-mqtt.js 2 | import mqtt from 'mqtt'; 3 | import fs from 'fs'; 4 | import path from 'path'; 5 | 6 | // Create a test client 7 | const client = mqtt.connect('mqtt://localhost:1883'); 8 | 9 | // Read a sample image and convert to base64 10 | const imageBuffer = fs.readFileSync(path.join(process.cwd(), 'test-plate.jpg')); 11 | const base64Image = imageBuffer.toString('base64'); 12 | 13 | // Create test payload 14 | const testPayload = { 15 | plate_number: "ABC123", 16 | image: base64Image, 17 | timestamp: new Date().toISOString(), 18 | vehicle_description: "Test vehicle - Blue Toyota Camry" 19 | }; 20 | 21 | client.on('connect', () => { 22 | console.log('Connected to broker'); 23 | 24 | // Publish the test message 25 | client.publish('alpr/plate_reads', JSON.stringify(testPayload), (err) => { 26 | if (err) { 27 | console.error('Error publishing:', err); 28 | } else { 29 | console.log('Test message published successfully'); 30 | } 31 | // Close the client 32 | client.end(); 33 | }); 34 | }); 35 | 36 | client.on('error', (err) => { 37 | console.error('MQTT error:', err); 38 | client.end(); 39 | }); -------------------------------------------------------------------------------- /example.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "api": "alpr", 4 | "found": { 5 | "success": true, 6 | "processMs": 436, 7 | "inferenceMs": 354, 8 | "predictions": [ 9 | { 10 | "confidence": 0.9422435760498047, 11 | "label": "Plate: T121396C", 12 | "plate": "T121396C", 13 | "x_min": 469, 14 | "y_min": 557, 15 | "x_max": 614, 16 | "y_max": 677 17 | }, 18 | { 19 | "confidence": 0.7209769487380981, 20 | "label": "Plate: KYJ5", 21 | "plate": "KYJ5", 22 | "x_min": 210, 23 | "y_min": 481, 24 | "x_max": 295, 25 | "y_max": 558 26 | } 27 | ], 28 | "message": "Found Plate: T121396C, Plate: KYJ5", 29 | "moduleId": "ALPR", 30 | "moduleName": "License Plate Reader", 31 | "code": 200, 32 | "command": "alpr", 33 | "requestId": "6a5d387c-807a-47b6-a4f7-17425b934318", 34 | "inferenceDevice": "GPU", 35 | "analysisRoundTripMs": 633, 36 | "processedBy": "localhost", 37 | "timestampUTC": "Tue, 19 Nov 2024 23:51:20 GMT" 38 | } 39 | } 40 | ] 41 | -------------------------------------------------------------------------------- /components/ui/sonner.jsx: -------------------------------------------------------------------------------- 1 | "use client"; 2 | import { useTheme } from "next-themes" 3 | import { Toaster as Sonner } from "sonner" 4 | 5 | const Toaster = ({ 6 | ...props 7 | }) => { 8 | const { theme = "system" } = useTheme() 9 | 10 | return ( 11 | (AI Assistant (Coming Soon!)
35 | {/*36 | Press ⌘K or Ctrl+K 37 |
*/} 38 |{response}
47 |54 | Generate and upload training data from your validated plate reads. 55 | This process will: 56 |
57 |119 | {body} 120 |
) 121 | ); 122 | }) 123 | FormMessage.displayName = "FormMessage" 124 | 125 | export { 126 | useFormField, 127 | Form, 128 | FormItem, 129 | FormLabel, 130 | FormControl, 131 | FormDescription, 132 | FormMessage, 133 | FormField, 134 | } 135 | -------------------------------------------------------------------------------- /hooks/use-toast.js: -------------------------------------------------------------------------------- 1 | "use client"; 2 | // Inspired by react-hot-toast library 3 | import * as React from "react" 4 | 5 | const TOAST_LIMIT = 1 6 | const TOAST_REMOVE_DELAY = 1000000 7 | 8 | const actionTypes = { 9 | ADD_TOAST: "ADD_TOAST", 10 | UPDATE_TOAST: "UPDATE_TOAST", 11 | DISMISS_TOAST: "DISMISS_TOAST", 12 | REMOVE_TOAST: "REMOVE_TOAST" 13 | } 14 | 15 | let count = 0 16 | 17 | function genId() { 18 | count = (count + 1) % Number.MAX_SAFE_INTEGER 19 | return count.toString(); 20 | } 21 | 22 | const toastTimeouts = new Map() 23 | 24 | const addToRemoveQueue = (toastId) => { 25 | if (toastTimeouts.has(toastId)) { 26 | return 27 | } 28 | 29 | const timeout = setTimeout(() => { 30 | toastTimeouts.delete(toastId) 31 | dispatch({ 32 | type: "REMOVE_TOAST", 33 | toastId: toastId, 34 | }) 35 | }, TOAST_REMOVE_DELAY) 36 | 37 | toastTimeouts.set(toastId, timeout) 38 | } 39 | 40 | export const reducer = (state, action) => { 41 | switch (action.type) { 42 | case "ADD_TOAST": 43 | return { 44 | ...state, 45 | toasts: [action.toast, ...state.toasts].slice(0, TOAST_LIMIT), 46 | }; 47 | 48 | case "UPDATE_TOAST": 49 | return { 50 | ...state, 51 | toasts: state.toasts.map((t) => 52 | t.id === action.toast.id ? { ...t, ...action.toast } : t), 53 | }; 54 | 55 | case "DISMISS_TOAST": { 56 | const { toastId } = action 57 | 58 | // ! Side effects ! - This could be extracted into a dismissToast() action, 59 | // but I'll keep it here for simplicity 60 | if (toastId) { 61 | addToRemoveQueue(toastId) 62 | } else { 63 | state.toasts.forEach((toast) => { 64 | addToRemoveQueue(toast.id) 65 | }) 66 | } 67 | 68 | return { 69 | ...state, 70 | toasts: state.toasts.map((t) => 71 | t.id === toastId || toastId === undefined 72 | ? { 73 | ...t, 74 | open: false, 75 | } 76 | : t), 77 | }; 78 | } 79 | case "REMOVE_TOAST": 80 | if (action.toastId === undefined) { 81 | return { 82 | ...state, 83 | toasts: [], 84 | } 85 | } 86 | return { 87 | ...state, 88 | toasts: state.toasts.filter((t) => t.id !== action.toastId), 89 | }; 90 | } 91 | } 92 | 93 | const listeners = [] 94 | 95 | let memoryState = { toasts: [] } 96 | 97 | function dispatch(action) { 98 | memoryState = reducer(memoryState, action) 99 | listeners.forEach((listener) => { 100 | listener(memoryState) 101 | }) 102 | } 103 | 104 | function toast({ 105 | ...props 106 | }) { 107 | const id = genId() 108 | 109 | const update = (props) => 110 | dispatch({ 111 | type: "UPDATE_TOAST", 112 | toast: { ...props, id }, 113 | }) 114 | const dismiss = () => dispatch({ type: "DISMISS_TOAST", toastId: id }) 115 | 116 | dispatch({ 117 | type: "ADD_TOAST", 118 | toast: { 119 | ...props, 120 | id, 121 | open: true, 122 | onOpenChange: (open) => { 123 | if (!open) dismiss() 124 | }, 125 | }, 126 | }) 127 | 128 | return { 129 | id: id, 130 | dismiss, 131 | update, 132 | } 133 | } 134 | 135 | function useToast() { 136 | const [state, setState] = React.useState(memoryState) 137 | 138 | React.useEffect(() => { 139 | listeners.push(setState) 140 | return () => { 141 | const index = listeners.indexOf(setState) 142 | if (index > -1) { 143 | listeners.splice(index, 1) 144 | } 145 | }; 146 | }, [state]) 147 | 148 | return { 149 | ...state, 150 | toast, 151 | dismiss: (toastId) => dispatch({ type: "DISMISS_TOAST", toastId }), 152 | }; 153 | } 154 | 155 | export { useToast, toast } 156 | -------------------------------------------------------------------------------- /app/help/page.jsx: -------------------------------------------------------------------------------- 1 | import DashboardLayout from "@/components/layout/MainLayout"; 2 | import Link from "next/link"; 3 | 4 | export const dynamic = "force-dynamic"; 5 | 6 | export default function Page() { 7 | return ( 8 |21 | Several changes have been made that will greatly improve the 22 | performance and reliability of the application. A full update 23 | release will be coming soon with a more automated upgrade process, 24 | but I am embedding this quick guide in the meantime for any early 25 | adopters. 26 |
27 |28 | There are two major changes in the database that will require some 29 | quick manual action to transform your existing data. 30 |
31 |83 | Thank you to everyone reporting bugs and leaving suggestions. 84 |
85 |