Progressive Web App with Django
Progressive Web App (PWA) with Django
A Progressive Web App (PWA) is a website that behaves like a mobile application.
It is not an Android application, and it is not a website wrapped inside an app (like Capacitor or Cordova).
Instead, it uses modern browser features to provide an app-like experience.
Think of it as:
Traditional Website
+
Modern Browser Features
=
Progressive Web App (PWA)
Normal Website vs PWA
Normal Website
User
↓
Chrome
↓
Website
↓
Close Browser
↓
Everything Stops
Progressive Web App
User
↓
Chrome
↓
PWA
↓
Can Install
↓
Works Offline
↓
Receives Push Notifications
↓
Looks Like an App
What Makes a Website a PWA?
There are only three major requirements.
1. HTTPS
Your website must use HTTPS.
Example:
https://example.com
Not
http://example.com
2. Web App Manifest
A JSON file that describes your application.
Example:
{
"name": "Road Safety",
"short_name": "RoadSafe",
"start_url": "/",
"display": "standalone",
"background_color": "#ffffff",
"theme_color": "#1976d2",
"icons": [
{
"src": "/static/icons/icon-192.png",
"sizes": "192x192",
"type": "image/png"
},
{
"src": "/static/icons/icon-512.png",
"sizes": "512x512",
"type": "image/png"
}
]
}
This tells the browser:
- App name
- Icon
- Theme color
- Splash screen
- Startup page
3. Service Worker
This is the most important part.
A Service Worker is a JavaScript file that runs separately from your web pages.
Browser
↓
Service Worker
↓
Cache
↓
Website
It can:
- Cache files
- Work offline
- Handle push notifications
- Sync data later
- Improve loading speed
PWA Architecture with Django
Django
HTML
CSS
JavaScript
│
▼
Service Worker
│
▼
Browser Cache
│
▼
Installed PWA
Django remains exactly the same backend.
Features of a PWA
Install Like an App
The browser can show:
Install Road Safety App?
The user taps:
Install
The app now appears on the home screen.
Full Screen Mode
Instead of showing Chrome,
it launches like this:
---------------------
Road Safety
---------------------
No browser address bar.
Looks like a native app.
Offline Support
Suppose your app has:
- HTML
- CSS
- JavaScript
- Images
The Service Worker stores these locally.
Internet Available
↓
Download Files
↓
Store in Cache
Later,
No Internet
↓
Open App
↓
Load Cached Files
Your app still opens.
Push Notifications
PWAs support push notifications.
Example:
⚠ Bad Road Ahead
500 meters
or
🚓 Police Checkpoint Nearby
Background Sync
Suppose the user loses internet.
Save Report
↓
No Internet
↓
Store Locally
↓
Internet Returns
↓
Automatically Upload
App Icons
Your PWA can have:
Home Screen
📱
Road Safety
Just like a real application.
Can a PWA Access Android APIs?
Yes
| Feature | Supported |
|---|---|
| GPS | ✅ |
| Camera | ✅ |
| Microphone | ✅ |
| Clipboard | ✅ |
| File Picker | ✅ |
| Push Notifications | ✅ |
| Offline Storage | ✅ |
Limited Support
| Feature | Supported |
|---|---|
| Bluetooth | Partial |
| NFC | Partial |
| Device Motion | Partial |
| Accelerometer | Partial |
Support varies by browser and Android version.
Not Supported
| Feature | Available |
|---|---|
| SMS | ❌ |
| Contacts | ❌ |
| Phone Calls | ❌ |
| Background Services | ❌ |
| Installed Apps | ❌ |
| Widgets | ❌ |
| Android Intents | ❌ |
These are restricted for security reasons.
Django Project Structure
A Django project might look like:
mysite/
manage.py
mysite/
app/
static/
css/
js/
images/
icons/
icon-192.png
icon-512.png
manifest.json
sw.js
Only two additional files are required:
manifest.jsonsw.js
Step 1 — Create a Manifest
Create:
static/manifest.json
Example:
{
"name": "Road Safety",
"short_name": "RoadSafe",
"start_url": "/",
"display": "standalone",
"theme_color": "#1976d2",
"background_color": "#ffffff"
}
Step 2 — Link the Manifest
Inside your base template:
<link rel="manifest" href="{% static 'manifest.json' %}">
Step 3 — Register the Service Worker
Inside your JavaScript:
if ("serviceWorker" in navigator) {
navigator.serviceWorker.register("/static/sw.js");
}
Step 4 — Create Service Worker
Example:
self.addEventListener("install", event => {
console.log("Installed");
});
Later,
you can cache pages for offline use.
Step 5 — Add Icons
static/icons/
icon-192.png
icon-512.png
These become your application's icon.
Step 6 — Deploy Using HTTPS
PWAs require HTTPS.
Examples:
- Nginx + Let's Encrypt
- Cloudflare
- Railway
- Render
- Heroku
- DigitalOcean
- AWS
What Changes in Django?
Almost nothing.
Your Django views remain the same.
Example:
def home(request):
return render(request, "home.html")
Your REST APIs remain the same.
Example:
urlpatterns = [
path("api/login/", views.login),
path("api/location/", views.location),
]
The only additions are:
- Manifest
- Service Worker
- App icons
Example Road Safety PWA
Imagine building your project as a PWA.
User Opens Website
↓
Installs App
↓
Logs In
↓
Gets GPS Location
↓
Shows Map
↓
Reports Bad Road
↓
Uploads to Django
↓
Receives Notifications
The experience feels very similar to a mobile app.
Advantages of a PWA
✅ Easy to convert an existing Django website
✅ No Play Store required
✅ Uses your existing HTML/CSS/JavaScript
✅ Works offline
✅ Installable
✅ Push notifications
✅ Faster loading
✅ Single codebase
Limitations
❌ Cannot access every Android API
❌ Limited background processing
❌ No SMS access
❌ No Contacts
❌ Limited sensor support
❌ No Android widgets
❌ Cannot fully replace a native Android application
When Should You Use a PWA?
A PWA is an excellent choice when:
- You already have a Django website.
- You want users to "install" your website.
- You need offline support.
- You want push notifications.
- You don't need deep Android hardware integration.
- You want to avoid maintaining separate web and mobile codebases.
Is a PWA Right for Your Road Safety Project?
A PWA would be a great first version (MVP) because it lets you:
- Reuse your existing Django frontend.
- Provide an installable app experience.
- Show maps and the user's GPS location.
- Send push notifications.
- Cache pages for offline use.
However, if your long-term vision includes:
- Continuous background location tracking
- Reliable accelerometer and gyroscope monitoring
- Detecting potholes from motion data
- Advanced Android notifications
- Deep integration with device hardware
then a native Android app (Kotlin) or a Flutter app connected to your Django backend will be a better long-term solution.
A practical roadmap is:
- Build the web application with Django.
- Enhance it into a PWA for quick mobile access.
- As your requirements grow, build a dedicated Kotlin or Flutter app that consumes the same Django REST APIs.