Skip to content

Containerize local development environment with Docker - #684

Open
khushigoel44-afk wants to merge 2 commits into
Kuldeeep18:mainfrom
khushigoel44-afk:main
Open

Containerize local development environment with Docker#684
khushigoel44-afk wants to merge 2 commits into
Kuldeeep18:mainfrom
khushigoel44-afk:main

Conversation

@khushigoel44-afk

@khushigoel44-afk khushigoel44-afk commented Jul 14, 2026

Copy link
Copy Markdown

Pull Request

🔗 Related Issue

Closes #641

📝 Summary of Changes

This PR completely overhauls the local development setup by introducing Docker containerization. It removes the need for manual virtual environments, background process management, and port configuration.

Specific changes include:--

  1. Infrastructure: Added a Dockerfile targeting Python 3.11.9 for the Django backend.
  2. Orchestration: Created a docker-compose.yml to run the Backend (Django), Frontend (Nginx), Redis, Celery Worker, and Celery Beat scheduler simultaneously.
  3. Dependencies: Added beautifulsoup4 to requirements.txt to fix a crashing Celery task, and added a .dockerignore file for clean builds.
  4. Configuration: Updated environment variable documentation to map Celery broker and result backends to the new Redis container network.
  5. Documentation: Completely rewrote the "Local Setup" section in the README.md to reflect the single-command Docker workflow.

🏷️ Type of Change

[✓] 🐛 Bug fix
[✓] ✨ New feature
[ ] ♻️ Refactor
[✓] 📝 Documentation update
[ ] 🎨 UI / Style change
[✓] 🔧 Chore

🧪 Testing

The entire Docker stack was built and verified locally on WSL2.

Steps to test:

  1. Clone the branch and populate the backend/.env file with the updated Docker URLs (redis://redis:6379/0).
  2. Run docker compose up --build to spin up all 5 services.
  3. Open a separate terminal and run docker compose exec backend python backend/manage.py migrate to apply the database schema.
  4. Verify the frontend UI loads successfully at http://localhost:8080/login.html.
  5. Check the terminal logs to confirm the Celery beat scheduler triggers tasks and the worker executes them without OperationalError or connection refusals.

📸 Screenshots (if applicable)

N/A - Infrastructure and documentation changes only.

✅ Checklist

[✓] No merge conflicts
[✓] Changes follow the project guidelines
[✓] Documentation updated (if applicable)
[✓] Related issue linked
[✓] Changes tested locally (if applicable)

Summary by CodeRabbit

  • New Features

    • Added Docker Compose support for running the frontend, backend, Redis, background workers, and scheduled tasks together.
    • Added a containerized backend setup accessible on port 8000.
  • Documentation

    • Updated local setup instructions with Docker prerequisites, startup commands, migrations, local URLs, and shutdown steps.
  • Chores

    • Added Docker ignore rules and expanded repository exclusions for generated files and local databases.
    • Added Beautiful Soup to the project’s dependencies.

@coderabbitai

coderabbitai Bot commented Jul 14, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: d2396e0f-7b0b-4d2c-9d5c-9afa6e49d92f

📥 Commits

Reviewing files that changed from the base of the PR and between 8a4c8df and 7b6764b.

📒 Files selected for processing (5)
  • .gitignore
  • Dockerfile
  • backend/celerybeat-schedule
  • backend/db.sqlite3
  • docker-compose.yml
💤 Files with no reviewable changes (1)
  • docker-compose.yml

📝 Walkthrough

Walkthrough

Docker support was added for the Django backend, Nginx frontend, Redis, Celery worker, and Celery beat scheduler. README setup instructions now use Docker Compose, with supporting dependency, ignore-file, and Celery schedule updates.

Changes

Docker local stack

Layer / File(s) Summary
Backend container image
.dockerignore, requirements.txt, Dockerfile
Defines the Python 3.11.9 backend image, dependency installation, runtime settings, application copy, and Django startup command.
Compose service orchestration
docker-compose.yml, backend/celerybeat-schedule, .gitignore
Configures Nginx, Django, Redis, Celery worker, Celery beat, their shared network, and ignored local runtime artifacts.
Docker setup documentation
README.md
Documents Docker prerequisites, environment variables, Compose commands, migrations, local URLs, and shutdown.

Estimated code review effort: 3 (Moderate) | ~20 minutes

Sequence Diagram(s)

sequenceDiagram
  participant Developer
  participant DockerCompose
  participant Nginx
  participant DjangoBackend
  participant Redis
  participant CeleryWorker
  participant CeleryBeat
  Developer->>DockerCompose: run docker compose up --build
  DockerCompose->>Nginx: start frontend on port 8082
  DockerCompose->>DjangoBackend: start backend on port 8000
  DockerCompose->>Redis: start broker on port 6379
  CeleryBeat->>Redis: publish scheduled tasks
  Redis->>CeleryWorker: deliver task messages
Loading
🚥 Pre-merge checks | ✅ 3 | ❌ 2

❌ Failed checks (2 warnings)

Check name Status Explanation Resolution
Linked Issues check ⚠️ Warning Most requirements are met, but the frontend is exposed on 8082 instead of the requested 8080. Change the frontend service to bind host port 8080, then update the README and any related compose references.
Out of Scope Changes check ⚠️ Warning The tracked backend/celerybeat-schedule file is a generated artifact and is unrelated to the Dockerization task. Remove backend/celerybeat-schedule from the PR and keep it ignored so generated state files are not versioned.
✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly summarizes the main change: containerizing the local development environment with Docker.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 4

🧹 Nitpick comments (1)
docker-compose.yml (1)

24-26: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Avoid duplicating environment variables defined in .env.

You have provided an env_file: backend/.env for this service, which is also documented in the README to contain CELERY_BROKER_URL and CELERY_TASK_ALWAYS_EAGER. Explicitly declaring them here overrides the .env file, which might lead to confusing behavior if a developer tries to modify these values in .env. Consider removing them here so the .env file acts as the single source of truth.

♻️ Proposed fix
-        environment:
-            - CELERY_BROKER_URL=redis://redis:6379/0
-            - CELERY_TASK_ALWAYS_EAGER=false
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docker-compose.yml` around lines 24 - 26, Remove the explicit
CELERY_BROKER_URL and CELERY_TASK_ALWAYS_EAGER entries from the service’s
environment block, leaving backend/.env via env_file as the single source of
truth for both settings.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@backend/celerybeat-schedule`:
- Around line 1-9: Remove and untrack the runtime artifacts
backend/celerybeat-schedule (lines 1-9), backend/celerybeat-schedule-wal (lines
1-71), and backend/celerybeat-schedule-shm (lines 1-2), then add the
celerybeat-schedule* pattern to .gitignore to prevent Celery Beat scheduler
files from being committed again.

In `@backend/db.sqlite3`:
- Line 1: Remove the tracked database artifact db.sqlite3 from the repository
and Docker build context, add appropriate ignore rules, and replace its use with
migrations and sanitized seed data. Revoke and rotate exposed Google OAuth
tokens, force password resets for affected accounts, and purge the database from
Git history if it has been published.

In `@docker-compose.yml`:
- Around line 6-7: Update the frontend service port mapping in the Docker
Compose configuration from host port 8082 to 8080 while keeping the container
port 80 unchanged, so it matches the documented and example configuration.

In `@Dockerfile`:
- Line 1: Update the Dockerfile’s FROM image to python:3.11.9-slim so the
container uses the Python version specified by the PR objective.

---

Nitpick comments:
In `@docker-compose.yml`:
- Around line 24-26: Remove the explicit CELERY_BROKER_URL and
CELERY_TASK_ALWAYS_EAGER entries from the service’s environment block, leaving
backend/.env via env_file as the single source of truth for both settings.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: ed4c7827-ecdd-42df-aa49-ab31c1d0ce8e

📥 Commits

Reviewing files that changed from the base of the PR and between 4a33158 and 8a4c8df.

📒 Files selected for processing (9)
  • .dockerignore
  • Dockerfile
  • README.md
  • backend/celerybeat-schedule
  • backend/celerybeat-schedule-shm
  • backend/celerybeat-schedule-wal
  • backend/db.sqlite3
  • docker-compose.yml
  • requirements.txt

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Caution

Inline review comments failed to post. This is likely due to GitHub's internal server error or limits when posting large numbers of comments. If you are seeing this consistently it is likely a permissions issue. Please check "Moderation" -> "Code review limits" under your organization settings.

Actionable comments posted: 4

🧹 Nitpick comments (1)
docker-compose.yml (1)

24-26: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Avoid duplicating environment variables defined in .env.

You have provided an env_file: backend/.env for this service, which is also documented in the README to contain CELERY_BROKER_URL and CELERY_TASK_ALWAYS_EAGER. Explicitly declaring them here overrides the .env file, which might lead to confusing behavior if a developer tries to modify these values in .env. Consider removing them here so the .env file acts as the single source of truth.

♻️ Proposed fix
-        environment:
-            - CELERY_BROKER_URL=redis://redis:6379/0
-            - CELERY_TASK_ALWAYS_EAGER=false
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docker-compose.yml` around lines 24 - 26, Remove the explicit
CELERY_BROKER_URL and CELERY_TASK_ALWAYS_EAGER entries from the service’s
environment block, leaving backend/.env via env_file as the single source of
truth for both settings.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@backend/celerybeat-schedule`:
- Around line 1-9: Remove and untrack the runtime artifacts
backend/celerybeat-schedule (lines 1-9), backend/celerybeat-schedule-wal (lines
1-71), and backend/celerybeat-schedule-shm (lines 1-2), then add the
celerybeat-schedule* pattern to .gitignore to prevent Celery Beat scheduler
files from being committed again.

In `@backend/db.sqlite3`:
- Line 1: Remove the tracked database artifact db.sqlite3 from the repository
and Docker build context, add appropriate ignore rules, and replace its use with
migrations and sanitized seed data. Revoke and rotate exposed Google OAuth
tokens, force password resets for affected accounts, and purge the database from
Git history if it has been published.

In `@docker-compose.yml`:
- Around line 6-7: Update the frontend service port mapping in the Docker
Compose configuration from host port 8082 to 8080 while keeping the container
port 80 unchanged, so it matches the documented and example configuration.

In `@Dockerfile`:
- Line 1: Update the Dockerfile’s FROM image to python:3.11.9-slim so the
container uses the Python version specified by the PR objective.

---

Nitpick comments:
In `@docker-compose.yml`:
- Around line 24-26: Remove the explicit CELERY_BROKER_URL and
CELERY_TASK_ALWAYS_EAGER entries from the service’s environment block, leaving
backend/.env via env_file as the single source of truth for both settings.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: ed4c7827-ecdd-42df-aa49-ab31c1d0ce8e

📥 Commits

Reviewing files that changed from the base of the PR and between 4a33158 and 8a4c8df.

📒 Files selected for processing (9)
  • .dockerignore
  • Dockerfile
  • README.md
  • backend/celerybeat-schedule
  • backend/celerybeat-schedule-shm
  • backend/celerybeat-schedule-wal
  • backend/db.sqlite3
  • docker-compose.yml
  • requirements.txt
🛑 Comments failed to post (4)
backend/celerybeat-schedule (1)

1-9: 📐 Maintainability & Code Quality | 🟠 Major | ⚡ Quick win

Remove local Celery Beat schedule runtime artifacts. All of these files are local runtime database artifacts generated by Celery Beat's SQLite scheduler. Committing these files leads to repository bloat, merge conflicts, and leaks local state. Please untrack them and ensure celerybeat-schedule* is added to your .gitignore.

  • backend/celerybeat-schedule#L1-L9: Untrack and remove this file.
  • backend/celerybeat-schedule-wal#L1-L71: Untrack and remove this file.
  • backend/celerybeat-schedule-shm#L1-L2: Untrack and remove this file.
📍 Affects 3 files
  • backend/celerybeat-schedule#L1-L9 (this comment)
  • backend/celerybeat-schedule-wal#L1-L71
  • backend/celerybeat-schedule-shm#L1-L2
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@backend/celerybeat-schedule` around lines 1 - 9, Remove and untrack the
runtime artifacts backend/celerybeat-schedule (lines 1-9),
backend/celerybeat-schedule-wal (lines 1-71), and
backend/celerybeat-schedule-shm (lines 1-2), then add the celerybeat-schedule*
pattern to .gitignore to prevent Celery Beat scheduler files from being
committed again.
backend/db.sqlite3 (1)

1-1: 🔒 Security & Privacy | 🔴 Critical | 🏗️ Heavy lift

Remove this database and rotate the exposed credentials.

backend/db.sqlite3 contains real-looking user emails, phone numbers, campaign data, password hashes, and Google OAuth bearer tokens. Remove it from the repository and Docker context, revoke/rotate all exposed tokens, force affected password resets, and purge it from Git history if already published. Use migrations plus sanitized seed data instead.

Also applies to: 466-467

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@backend/db.sqlite3` at line 1, Remove the tracked database artifact
db.sqlite3 from the repository and Docker build context, add appropriate ignore
rules, and replace its use with migrations and sanitized seed data. Revoke and
rotate exposed Google OAuth tokens, force password resets for affected accounts,
and purge the database from Git history if it has been published.
docker-compose.yml (1)

6-7: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Fix frontend port mapping to match documentation.

The docker-compose.yml maps the frontend to port 8082, but the PR objectives, README.md documentation, and .env configuration examples all expect the frontend to be accessible on port 8080.

🐛 Proposed fix
         ports:
-            - "8082:80"
+            - "8080:80"
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

        ports:
            - "8080:80"
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docker-compose.yml` around lines 6 - 7, Update the frontend service port
mapping in the Docker Compose configuration from host port 8082 to 8080 while
keeping the container port 80 unchanged, so it matches the documented and
example configuration.
Dockerfile (1)

1-1: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Align Python version with PR objectives.

The PR objective states that a Python 3.11.9 Dockerfile is being added, but the base image used here is python:3.13-slim. Please confirm if this is intentional or if it should be reverted to 3.11.9-slim.

💡 Proposed fix
-FROM python:3.13-slim
+FROM python:3.11.9-slim
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

FROM python:3.11.9-slim
🧰 Tools
🪛 Trivy (0.69.3)

[error] 1-1: Image user should not be 'root'

Specify at least 1 USER command in Dockerfile with non-root user as argument

Rule: DS-0002

Learn more

(IaC/Dockerfile)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@Dockerfile` at line 1, Update the Dockerfile’s FROM image to
python:3.11.9-slim so the container uses the Python version specified by the PR
objective.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
Dockerfile (1)

1-16: 🔒 Security & Privacy | 🟠 Major | ⚡ Quick win

Run the backend as a non-root user.

The image currently inherits root and has no USER directive. Create an unprivileged user, assign ownership of /app, and switch to it before CMD to reduce container and bind-mount risk.

Proposed fix
 COPY requirements.txt .
 
 RUN pip install --no-cache-dir -r requirements.txt 
 
-COPY . .
+RUN addgroup --system app && adduser --system --ingroup app app
+COPY --chown=app:app . .
+USER app
 
 EXPOSE 8000
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@Dockerfile` around lines 1 - 16, Update the Dockerfile after the application
files are copied to create an unprivileged user, assign that user ownership of
/app, and add a USER directive before CMD. Keep the existing working directory
and startup command unchanged while ensuring the backend runs without root
privileges.

Source: Linters/SAST tools

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.gitignore:
- Around line 23-24: Re-save .gitignore as a plain-text file by removing all
embedded NUL bytes while preserving the existing .venv and backend/db.sqlite3
ignore entries unchanged.

---

Outside diff comments:
In `@Dockerfile`:
- Around line 1-16: Update the Dockerfile after the application files are copied
to create an unprivileged user, assign that user ownership of /app, and add a
USER directive before CMD. Keep the existing working directory and startup
command unchanged while ensuring the backend runs without root privileges.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: d2396e0f-7b0b-4d2c-9d5c-9afa6e49d92f

📥 Commits

Reviewing files that changed from the base of the PR and between 8a4c8df and 7b6764b.

📒 Files selected for processing (5)
  • .gitignore
  • Dockerfile
  • backend/celerybeat-schedule
  • backend/db.sqlite3
  • docker-compose.yml
💤 Files with no reviewable changes (1)
  • docker-compose.yml

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Caution

Inline review comments failed to post. This is likely due to GitHub's internal server error or limits when posting large numbers of comments. If you are seeing this consistently it is likely a permissions issue. Please check "Moderation" -> "Code review limits" under your organization settings.

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
Dockerfile (1)

1-16: 🔒 Security & Privacy | 🟠 Major | ⚡ Quick win

Run the backend as a non-root user.

The image currently inherits root and has no USER directive. Create an unprivileged user, assign ownership of /app, and switch to it before CMD to reduce container and bind-mount risk.

Proposed fix
 COPY requirements.txt .
 
 RUN pip install --no-cache-dir -r requirements.txt 
 
-COPY . .
+RUN addgroup --system app && adduser --system --ingroup app app
+COPY --chown=app:app . .
+USER app
 
 EXPOSE 8000
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@Dockerfile` around lines 1 - 16, Update the Dockerfile after the application
files are copied to create an unprivileged user, assign that user ownership of
/app, and add a USER directive before CMD. Keep the existing working directory
and startup command unchanged while ensuring the backend runs without root
privileges.

Source: Linters/SAST tools

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.gitignore:
- Around line 23-24: Re-save .gitignore as a plain-text file by removing all
embedded NUL bytes while preserving the existing .venv and backend/db.sqlite3
ignore entries unchanged.

---

Outside diff comments:
In `@Dockerfile`:
- Around line 1-16: Update the Dockerfile after the application files are copied
to create an unprivileged user, assign that user ownership of /app, and add a
USER directive before CMD. Keep the existing working directory and startup
command unchanged while ensuring the backend runs without root privileges.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: d2396e0f-7b0b-4d2c-9d5c-9afa6e49d92f

📥 Commits

Reviewing files that changed from the base of the PR and between 8a4c8df and 7b6764b.

📒 Files selected for processing (5)
  • .gitignore
  • Dockerfile
  • backend/celerybeat-schedule
  • backend/db.sqlite3
  • docker-compose.yml
💤 Files with no reviewable changes (1)
  • docker-compose.yml
🛑 Comments failed to post (1)
.gitignore (1)

23-24: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

python - <<'PY'
from pathlib import Path

data = Path(".gitignore").read_bytes()
for number, line in enumerate(data.splitlines(), 1):
    if any(byte < 32 and byte not in (9,) for byte in line):
        print(f"control byte on line {number}: {line!r}")
PY

Repository: Kuldeeep18/LeadOrbit

Length of output: 444


🏁 Script executed:

python3 - <<'PY'
from pathlib import Path

p = Path(".gitignore")
data = p.read_bytes()

print("first 32 bytes:", data[:32])
print("byte length:", len(data))
print("line count:", len(data.splitlines()))
print("suspect lines:")
for number, line in enumerate(data.splitlines(), 1):
    if any(byte < 32 and byte not in (9,) for byte in line):
        print(number, line)
PY

Repository: Kuldeeep18/LeadOrbit

Length of output: 418


Re-save .gitignore as plain text. The .venv and backend/db.sqlite3 entries contain embedded NUL bytes, which can break ignore parsing.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.gitignore around lines 23 - 24, Re-save .gitignore as a plain-text file by
removing all embedded NUL bytes while preserving the existing .venv and
backend/db.sqlite3 ignore entries unchanged.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Enhancement]: Add Docker and Docker Compose to streamline local setup

1 participant