🔧 chore(repo): restructure project file hierarchy

- move project files out of fleetledger directory to root
- update .gitignore to reflect new .env path

📝 docs(README): add detailed project description

- provide an overview of FleetLedger's features and usage
- include setup instructions and security notes
This commit is contained in:
nocci 2025-12-06 11:56:16 +00:00
parent f113a760af
commit ea06f16407
27 changed files with 86 additions and 87 deletions

BIN
app/static/icon-192.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 593 B

BIN
app/static/icon-512.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

View file

@ -0,0 +1,20 @@
{
"name": "FleetLedger",
"short_name": "FleetLedger",
"start_url": "/",
"display": "standalone",
"background_color": "#020617",
"theme_color": "#020617",
"icons": [
{
"src": "/static/icon-192.png",
"sizes": "192x192",
"type": "image/png"
},
{
"src": "/static/icon-512.png",
"sizes": "512x512",
"type": "image/png"
}
]
}

View file

@ -0,0 +1,74 @@
const CACHE_VERSION = "v2";
const CACHE_NAME = `fleetledger-${CACHE_VERSION}`;
const ASSETS = [
"/",
"/static/style.css",
"/static/icon-192.png",
"/static/icon-512.png",
"/static/manifest.webmanifest",
];
self.addEventListener("install", (event) => {
event.waitUntil(
caches.open(CACHE_NAME).then((cache) => {
return cache.addAll(ASSETS);
})
);
});
self.addEventListener("activate", (event) => {
event.waitUntil(
caches.keys().then((keys) =>
Promise.all(
keys
.filter((key) => key.startsWith("fleetledger-") && key !== CACHE_NAME)
.map((key) => caches.delete(key))
)
)
);
});
async function networkFirst(request) {
try {
const response = await fetch(request);
const cache = await caches.open(CACHE_NAME);
cache.put(request, response.clone());
return response;
} catch (err) {
const cached = await caches.match(request);
if (cached) {
return cached;
}
return caches.match("/");
}
}
async function cacheFirst(request) {
const cached = await caches.match(request);
if (cached) {
return cached;
}
const response = await fetch(request);
const cache = await caches.open(CACHE_NAME);
cache.put(request, response.clone());
return response;
}
self.addEventListener("fetch", (event) => {
if (event.request.method !== "GET") {
return;
}
const url = new URL(event.request.url);
// Navigation requests: network first, fallback to cache
if (event.request.mode === "navigate") {
event.respondWith(networkFirst(event.request));
return;
}
// Same-origin static assets: cache first
if (url.origin === self.location.origin) {
event.respondWith(cacheFirst(event.request));
}
});

5
app/static/style.css Normal file
View file

@ -0,0 +1,5 @@
/* Simple extra styles on top of Tailwind. */
body {
font-family: system-ui, -apple-system, BlinkMacSystemFont, "SF Pro Text",
"Segoe UI", sans-serif;
}