[π ] Secret Messenger Dev Log #2: Flutter Web + Django, Roadmap, English
β¨ GPT Summary γ
A day spent switching the tech stack to Flutter Web + Django, then establishing the overall development roadmap and an English-based development environment.
π Roadmap
Step-by-step To-Do List for Phase 1β4 β covering:
- π§ Project planning, tech stack selection, and domain purchase
- π οΈ Flutter Web build + Django static integration (local dev)
- π Basic trigger API implementation
- π VPS deployment, Nginx setup, and secure domain serving
β PHASE 1 β Initial Planning & Strategic Decisions
- π§ Define project scope & security strategy
- Target audience: undocumented North Korean defectors living in China
- Objective: provide a secure, disguised, browser-based communication tool
- UX strategy: mimic a calculator interface to conceal real functionality
- π€ Choose AI-assisted development approach
- Use GPT-4o and o1 to assist with design and implementation
- Apply a βVibe Codingβ workflow β using natural language and iterative prototyping with AI
- βοΈ Choose tech stack
- Frontend: Flutter Web (for a polished, app-like UI disguised as a calculator)
- Backend: Django + Django REST Framework (for structured APIs, built-in admin, and security)
- Deployment: Single VPS container serving both Flutter static files and Django API
- π Purchase disguise domain
- Domain:
___.net - Purpose: plausible calculator utility appearance
- Price: β©18,000/year via Korean registrar
- Domain:
β PHASE 2 β Local Development: Flutter Web + Django Integration
π§ 1. Project Environment Setup
- π§± Create Django project
django-admin startproject stealthcore .
- βοΈ Create Django app (for API)
python manage.py startapp api
- π§© Add
'api'and'rest_framework'toINSTALLED_APPS - π Create virtual environment and install dependencies
python -m venv venv && source venv/bin/activatepip install django djangorestframework whitenoise
π οΈ 2. Flutter Web Build
- π» Initialize Flutter app
flutter create ____web- Replace default UI with a
TextFieldandSendbutton
- π§ͺ Send input via
http.post()to/api/check-trigger/ - π¨ Build Web output
flutter build web
- π Move build files
- Create
frontend_static/folder in Django root cp -r build/web/* frontend_static/
- Create
βοΈ 3. Django Static File Serving
-
π§· Update
settings.py:STATIC_URL = '/static/' STATICFILES_DIRS = [ BASE_DIR / 'frontend_static' ] - (Optional) Enable WhiteNoise
- Add
'whitenoise.middleware.WhiteNoiseMiddleware'toMIDDLEWARE
- Add
- ποΈ Copy
build/web/index.htmltotemplates/index.html -
π οΈ Fix asset paths in
index.html:<script src="/static/main.dart.js"></script>
π 4. Connect Flutter to Django
- π§ͺ Create
/api/check-trigger/endpoint- Accepts POST
{ input: "..." } - Returns
{ status: "success" }if input is'1004'
- Accepts POST
- π Ensure no trigger strings exist in frontend source
- π§ͺ Confirm frontend integration with
http.post(...)
β PHASE 3 β VPS Deployment (Vultr)
π 1. Server Setup
- Create a Vultr instance (Ubuntu 22.04, 1GB RAM)
- π Set up SSH access (
ssh root@<ip>) - π¦ Install dependencies:
sudo apt update && sudo apt upgradesudo apt install python3 python3-pip nginx gitsudo apt install certbot python3-certbot-nginx
π 2. Deploy Django
- Upload your project (
scporgit clone) - Set up virtual environment
python3 -m venv venv && source venv/bin/activatepip install -r requirements.txt
- π« Install and test Gunicorn
pip install gunicorngunicorn stealthcore.wsgi:application
π 3. Serve with Nginx
-
Create Nginx config:
server { listen 80; server_name ___.net; location /static/ { alias /home/youruser/project/frontend_static/; } location / { proxy_pass http://127.0.0.1:8000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } } - π Enable HTTPS with Letβs Encrypt
sudo certbot --nginx -d ___.net
- π Restart Nginx:
sudo systemctl restart nginx
β PHASE 4 β Final Testing & Hardening
- π» Visit
https://___.net- Confirm calculator UI loads successfully
- π Enter
'1004'in Flutter input and send- Django should respond with
{ "status": "success" }
- Django should respond with
- π§ͺ Test invalid input returns denial message
β Final Notes
- π§Ό Remove all sensitive logic from frontend
- π Protect future API endpoints with session token validation
- π§ Polish disguise: update app icon, page title, and add fake utility elements
- π§ Write internal docs (
deploy.md) for repeatable deployments
π Diary
There were several major changes.
- I changed course to Flutter Web (Frontend) + Django (Backend).
- Because I plan to keep using this combination when building apps in the future.
- And because both are frameworks I have used before, so I can expect much faster productivity.
- I decided to write all documentation, comments, and commit messages in English.
- Because writing prompts in English may bring even a small performance improvement.
- Because most of the worldβs latest knowledge is handled in English.
- Because I need to build the habit of using English often so it becomes more familiar.
- I decided that Git commit message conventions must follow the standard format used in the development industry.
-
from
* 21adba0 25.04.03 Thu <Hyuk Min> Chore | README.md: Add more details to roadmap -
to
* 21adba0 25.04.03 Thu <Hyuk Min> docs(README): add more details to roadmap - Because unless I plan to live as a solo developer forever, it is right to build the habit of following industry standards early.
- Because later, if I use a change log-related tool, it will need the standard format to parse the messages properly.
-
Looking only at the roadmap itself, I think it came out as a guide that should be good enough to follow.
Tomorrow I should keep getting GPT feedback, refine it, and then just follow it as-is.
Leave a comment