<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Subina Thapa</title>
    <description>The latest articles on Forem by Subina Thapa (@thapasubina22).</description>
    <link>https://forem.com/thapasubina22</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3844710%2Fb369f51f-ddbe-4ee0-8cf0-6285f1c7da58.jpg</url>
      <title>Forem: Subina Thapa</title>
      <link>https://forem.com/thapasubina22</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/thapasubina22"/>
    <language>en</language>
    <item>
      <title>Building a Production-Ready Full Stack App with Flutter, Django &amp; PostgreSQL</title>
      <dc:creator>Subina Thapa</dc:creator>
      <pubDate>Sat, 04 Apr 2026 09:30:53 +0000</pubDate>
      <link>https://forem.com/thapasubina22/building-a-production-ready-full-stack-app-with-flutter-django-postgresql-52k3</link>
      <guid>https://forem.com/thapasubina22/building-a-production-ready-full-stack-app-with-flutter-django-postgresql-52k3</guid>
      <description>&lt;p&gt;Building a Production-Ready Full Stack App with Flutter, Django &amp;amp; PostgreSQL&lt;br&gt;
Introduction&lt;/p&gt;

&lt;p&gt;In today’s modern development world, building scalable and production-ready applications requires a powerful and flexible tech stack. In this article, I’ll walk you through how to build a full stack application using Flutter, Django, and PostgreSQL, along with real-world practices used in production environments.&lt;/p&gt;

&lt;p&gt;Whether you're a beginner or an intermediate developer, this guide will help you understand how frontend, backend, and database work together in a real project.&lt;/p&gt;

&lt;p&gt;Architecture Overview&lt;/p&gt;

&lt;p&gt;A clean architecture is the backbone of any production-ready system.&lt;/p&gt;

&lt;p&gt;Flutter (Frontend)&lt;br&gt;
       ↓&lt;br&gt;
Django REST API (Backend)&lt;br&gt;
       ↓&lt;br&gt;
PostgreSQL (Database)&lt;br&gt;
 Explanation:&lt;br&gt;
Flutter → Handles UI and user interaction&lt;br&gt;
Django REST Framework → Manages API logic and business rules&lt;br&gt;
PostgreSQL → Stores structured data efficiently&lt;br&gt;
API Flow (How Everything Connects)&lt;/p&gt;

&lt;p&gt;Here’s how data flows in this stack:&lt;/p&gt;

&lt;p&gt;User interacts with Flutter app&lt;br&gt;
Flutter sends HTTP request to Django API&lt;br&gt;
Django processes request (business logic)&lt;br&gt;
Django queries PostgreSQL database&lt;br&gt;
Response is sent back to Flutter&lt;br&gt;
UI updates based on response&lt;/p&gt;

&lt;p&gt;Example API call in Flutter:&lt;/p&gt;

&lt;p&gt;final response = await http.get(&lt;br&gt;
  Uri.parse('&lt;a href="http://yourapi.com/api/posts/'" rel="noopener noreferrer"&gt;http://yourapi.com/api/posts/'&lt;/a&gt;)&lt;br&gt;
);&lt;/p&gt;

&lt;p&gt;Django View:&lt;/p&gt;

&lt;p&gt;from rest_framework.views import APIView&lt;br&gt;
from rest_framework.response import Response&lt;/p&gt;

&lt;p&gt;class PostList(APIView):&lt;br&gt;
    def get(self, request):&lt;br&gt;
        data = {"message": "Hello from Django"}&lt;br&gt;
        return Response(data)&lt;br&gt;
 Authentication (JWT)&lt;/p&gt;

&lt;p&gt;Authentication is critical in production apps.&lt;/p&gt;

&lt;p&gt;We use JWT (JSON Web Token) for secure authentication.&lt;/p&gt;

&lt;p&gt;Django Setup:&lt;/p&gt;

&lt;p&gt;Install:&lt;/p&gt;

&lt;p&gt;pip install djangorestframework-simplejwt&lt;/p&gt;

&lt;p&gt;Add in settings:&lt;/p&gt;

&lt;p&gt;REST_FRAMEWORK = {&lt;br&gt;
    'DEFAULT_AUTHENTICATION_CLASSES': (&lt;br&gt;
        'rest_framework_simplejwt.authentication.JWTAuthentication',&lt;br&gt;
    ),&lt;br&gt;
}&lt;br&gt;
Login Flow:&lt;br&gt;
User logs in via Flutter&lt;br&gt;
Django returns JWT token&lt;br&gt;
Flutter stores token securely&lt;br&gt;
Token is sent with every request&lt;/p&gt;

&lt;p&gt;Flutter header example:&lt;/p&gt;

&lt;p&gt;headers: {&lt;br&gt;
  "Authorization": "Bearer YOUR_TOKEN",&lt;br&gt;
}&lt;br&gt;
 PostgreSQL Integration&lt;/p&gt;

&lt;p&gt;Why PostgreSQL?&lt;/p&gt;

&lt;p&gt;Fast and scalable&lt;br&gt;
Supports complex queries&lt;br&gt;
Production-ready&lt;br&gt;
Django Configuration:&lt;br&gt;
DATABASES = {&lt;br&gt;
    'default': {&lt;br&gt;
        'ENGINE': 'django.db.backends.postgresql',&lt;br&gt;
        'NAME': 'mydb',&lt;br&gt;
        'USER': 'postgres',&lt;br&gt;
        'PASSWORD': 'password',&lt;br&gt;
        'HOST': 'localhost',&lt;br&gt;
        'PORT': '5432',&lt;br&gt;
    }&lt;br&gt;
}&lt;br&gt;
 Deployment Tips (Production Level)&lt;/p&gt;

&lt;p&gt;To make your app truly production-ready:&lt;/p&gt;

&lt;p&gt;Backend (Django)&lt;br&gt;
Use Gunicorn + Nginx&lt;br&gt;
Enable HTTPS&lt;br&gt;
Use environment variables&lt;br&gt;
Debug = False&lt;br&gt;
Frontend (Flutter)&lt;br&gt;
Build APK/IPA for release&lt;br&gt;
flutter build apk --release&lt;br&gt;
Database&lt;br&gt;
Use managed DB (AWS RDS, Supabase, etc.)&lt;br&gt;
Enable backups&lt;br&gt;
Real-World Challenges&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;CORS Issues&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Fix using:&lt;/p&gt;

&lt;p&gt;pip install django-cors-headers&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;API Latency&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Optimize:&lt;/p&gt;

&lt;p&gt;Use caching&lt;br&gt;
Optimize queries&lt;br&gt;
Reduce unnecessary API calls&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;State Management in Flutter&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Use:&lt;/p&gt;

&lt;p&gt;Provider&lt;br&gt;
Riverpod&lt;br&gt;
Bloc&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Authentication Errors&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Common issue:&lt;/p&gt;

&lt;p&gt;Token expired&lt;br&gt;
 Solution:&lt;br&gt;
Implement refresh tokens&lt;br&gt;
Best Practices&lt;br&gt;
Keep frontend and backend separate&lt;br&gt;
Use environment variables&lt;br&gt;
Write clean and modular code&lt;br&gt;
Use version control (Git)&lt;br&gt;
Add logging and monitoring&lt;/p&gt;

&lt;p&gt;Conclusion&lt;br&gt;
Building a production-ready app with Flutter, Django, and PostgreSQL is not just about coding — it's about architecture, scalability, and real-world problem solving.&lt;/p&gt;

</description>
      <category>django</category>
      <category>flutter</category>
      <category>postgres</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Building a Scalable To-Do App in Flutter Using Provider &amp; Local Storage</title>
      <dc:creator>Subina Thapa</dc:creator>
      <pubDate>Wed, 01 Apr 2026 04:34:56 +0000</pubDate>
      <link>https://forem.com/thapasubina22/building-a-scalable-to-do-app-in-flutter-using-provider-local-storage-2lnd</link>
      <guid>https://forem.com/thapasubina22/building-a-scalable-to-do-app-in-flutter-using-provider-local-storage-2lnd</guid>
      <description>&lt;p&gt;Introduction:&lt;/p&gt;

&lt;p&gt;Beginners often create simple apps without considering scalability or maintainability. In this guide, we’ll build a professional, production-ready To-Do app using Riverpod for state management, Hive for persistent storage, and clean architecture principles.&lt;/p&gt;

&lt;p&gt;Step 1&lt;br&gt;
 Setup Dependencies&lt;br&gt;
dependencies:&lt;br&gt;
  flutter:&lt;br&gt;
    sdk: flutter&lt;br&gt;
  flutter_riverpod: ^2.3.6&lt;br&gt;
  hive: ^2.2.3&lt;br&gt;
  hive_flutter: ^1.1.0&lt;/p&gt;

&lt;p&gt;Step 2&lt;br&gt;
 Project Structure (Clean Architecture)&lt;br&gt;
lib/&lt;br&gt;
├─ main.dart&lt;br&gt;
├─ models/&lt;br&gt;
│   └─ task.dart&lt;br&gt;
├─ providers/&lt;br&gt;
│   └─ task_provider.dart&lt;br&gt;
├─ services/&lt;br&gt;
│   └─ task_service.dart&lt;br&gt;
├─ screens/&lt;br&gt;
│   └─ todo_home.dart&lt;/p&gt;

&lt;p&gt;This separation makes the app scalable, testable, and maintainable.&lt;/p&gt;

&lt;p&gt;Step 3&lt;br&gt;
 Create the Task Model&lt;br&gt;
import 'package:hive/hive.dart';&lt;/p&gt;

&lt;p&gt;part 'task.g.dart';&lt;/p&gt;

&lt;p&gt;@HiveType(typeId: 0)&lt;br&gt;
class Task extends HiveObject {&lt;br&gt;
  @HiveField(0)&lt;br&gt;
  String title;&lt;/p&gt;

&lt;p&gt;@HiveField(1)&lt;br&gt;
  bool completed;&lt;/p&gt;

&lt;p&gt;Task({required this.title, this.completed = false});&lt;br&gt;
}&lt;br&gt;
Use build_runner to generate Hive adapters:&lt;br&gt;
flutter pub run build_runner build&lt;/p&gt;

&lt;p&gt;Step 4&lt;br&gt;
 Create Task Service (Handles Data &amp;amp; Persistence)&lt;br&gt;
import 'package:hive_flutter/hive_flutter.dart';&lt;br&gt;
import '../models/task.dart';&lt;/p&gt;

&lt;p&gt;class TaskService {&lt;br&gt;
  static const String boxName = 'tasksBox';&lt;/p&gt;

&lt;p&gt;late Box _box;&lt;/p&gt;

&lt;p&gt;Future init() async {&lt;br&gt;
    _box = await Hive.openBox(boxName);&lt;br&gt;
  }&lt;/p&gt;

&lt;p&gt;List getTasks() =&amp;gt; _box.values.toList();&lt;/p&gt;

&lt;p&gt;Future addTask(Task task) async =&amp;gt; await _box.add(task);&lt;/p&gt;

&lt;p&gt;Future updateTask(int index, Task task) async =&amp;gt; await _box.putAt(index, task);&lt;/p&gt;

&lt;p&gt;Future deleteTask(int index) async =&amp;gt; await _box.deleteAt(index);&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;Step 5&lt;br&gt;
 Create Riverpod Provider&lt;br&gt;
import 'package:flutter_riverpod/flutter_riverpod.dart';&lt;br&gt;
import '../models/task.dart';&lt;br&gt;
import '../services/task_service.dart';&lt;/p&gt;

&lt;p&gt;final taskServiceProvider = Provider((ref) =&amp;gt; TaskService());&lt;/p&gt;

&lt;p&gt;final tasksProvider = StateNotifierProvider&amp;gt;((ref) {&lt;br&gt;
  final service = ref.watch(taskServiceProvider);&lt;br&gt;
  return TasksNotifier(service);&lt;br&gt;
});&lt;/p&gt;

&lt;p&gt;class TasksNotifier extends StateNotifier&amp;gt; {&lt;br&gt;
  final TaskService _service;&lt;/p&gt;

&lt;p&gt;TasksNotifier(this._service) : super([]) {&lt;br&gt;
    loadTasks();&lt;br&gt;
  }&lt;/p&gt;

&lt;p&gt;Future loadTasks() async {&lt;br&gt;
    state = _service.getTasks();&lt;br&gt;
  }&lt;/p&gt;

&lt;p&gt;Future addTask(String title) async {&lt;br&gt;
    final task = Task(title: title);&lt;br&gt;
    await _service.addTask(task);&lt;br&gt;
    state = [...state, task];&lt;br&gt;
  }&lt;/p&gt;

&lt;p&gt;Future toggleComplete(int index) async {&lt;br&gt;
    final task = state[index];&lt;br&gt;
    task.completed = !task.completed;&lt;br&gt;
    await _service.updateTask(index, task);&lt;br&gt;
    state = [...state];&lt;br&gt;
  }&lt;/p&gt;

&lt;p&gt;Future deleteTask(int index) async {&lt;br&gt;
    await _service.deleteTask(index);&lt;br&gt;
    state = [...state]..removeAt(index);&lt;br&gt;
  }&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;Step 6:&lt;br&gt;
 Build the UI (TodoHome Screen)&lt;br&gt;
import 'package:flutter/material.dart';&lt;br&gt;
import 'package:flutter_riverpod/flutter_riverpod.dart';&lt;br&gt;
import '../providers/task_provider.dart';&lt;/p&gt;

&lt;p&gt;class TodoHome extends ConsumerWidget {&lt;br&gt;
  final TextEditingController controller = TextEditingController();&lt;/p&gt;

&lt;p&gt;&lt;a class="mentioned-user" href="https://dev.to/override"&gt;@override&lt;/a&gt;&lt;br&gt;
  Widget build(BuildContext context, WidgetRef ref) {&lt;br&gt;
    final tasks = ref.watch(tasksProvider);&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;return Scaffold(
  appBar: AppBar(title: Text("Advanced To-Do App")),
  body: Column(
    children: [
      Padding(
        padding: EdgeInsets.all(10),
        child: TextField(
          controller: controller,
          decoration: InputDecoration(labelText: "Enter a task"),
        ),
      ),
      ElevatedButton(
        onPressed: () {
          ref.read(tasksProvider.notifier).addTask(controller.text);
          controller.clear();
        },
        child: Text("Add Task"),
      ),
      Expanded(
        child: ListView.builder(
          itemCount: tasks.length,
          itemBuilder: (_, index) {
            final task = tasks[index];
            return ListTile(
              title: Text(
                task.title,
                style: TextStyle(
                  decoration: task.completed ? TextDecoration.lineThrough : null,
                ),
              ),
              leading: Checkbox(
                value: task.completed,
                onChanged: (_) =&amp;gt; ref.read(tasksProvider.notifier).toggleComplete(index),
              ),
              trailing: IconButton(
                icon: Icon(Icons.delete),
                onPressed: () =&amp;gt; ref.read(tasksProvider.notifier).deleteTask(index),
              ),
            );
          },
        ),
      ),
    ],
  ),
);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;Step 7: Why This Is Pro-Level&lt;br&gt;
Riverpod → Safer, testable, and scalable state management.&lt;br&gt;
Clean Architecture → Separate UI, providers, services, and models.&lt;br&gt;
Persistent storage → Hive ensures data persists across app restarts.&lt;br&gt;
Error handling &amp;amp; async operations → Prepares app for real-world scenarios.&lt;/p&gt;

&lt;p&gt;Step 8: Next Enhancements for a Real-World App&lt;br&gt;
Add user authentication with Firebase.&lt;br&gt;
Sync tasks across devices with cloud storage.&lt;br&gt;
Implement push notifications for task reminders.&lt;br&gt;
Add animations &amp;amp; theming for production-quality UX.&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>flutter</category>
      <category>mobile</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
