Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
9109f90
feat(web): swipe-open mobile sidebar, configurable APP_NAME, OG tagline
ksprptr Aug 29, 2026
f075ef6
feat: one-command Docker deployment, rewritten README, JavaScript-req…
ksprptr Aug 30, 2026
29eda8c
feat(web): make the split view desktop-only
ksprptr Aug 30, 2026
6ab0483
docs: correct the Drive OAuth scope and the publishing guidance
ksprptr Aug 30, 2026
ef7aad3
style(web): matching 404 with other my apps
ksprptr Aug 30, 2026
61f8827
chore: monorepo audit, major dependency upgrades, and contract cleanup
ksprptr Aug 31, 2026
d7cfd5b
refactor(web): share the pane listing and selection between both panes
ksprptr Aug 31, 2026
a8d99e1
refactor(web): move entry mutations and their dialogs out of the work…
ksprptr Aug 31, 2026
3c9ee52
refactor(web): extract the file row and the drop-item helpers
ksprptr Aug 31, 2026
ccaf007
refactor(web): extract the URL location and split-pane state into hooks
ksprptr Aug 31, 2026
83ce1ca
perf(web): memoize the file row and stabilise what feeds it
ksprptr Aug 31, 2026
72602bd
style(web): apply Prettier to the files it could not reach before
ksprptr Aug 31, 2026
56673ac
fix(api,web): harden the storage metadata, rate-limit and log surfaces
ksprptr Aug 31, 2026
d5eaf55
test(api): cover the guards, configs and storage paths that had none
ksprptr Aug 31, 2026
070a863
refactor(api): share the request pipeline between bootstrap and the e…
ksprptr Aug 31, 2026
30e9445
style(api,web): trim comments to one line and unify the JSDoc banners
ksprptr Aug 31, 2026
4620897
test(api): add a Postman regression collection for the live API
ksprptr Sep 1, 2026
f17f04b
fix(web): keep the closed split pane out of the tab order
ksprptr Sep 1, 2026
f00fba2
fix(web): give the modal dialog semantics and a labelled close button
ksprptr Sep 1, 2026
1aaeafb
fix(web): return a real 404 for a URL that names no storage backend
ksprptr Sep 1, 2026
6d748d6
fix(web): cap the folder and file name inputs at 255 characters
ksprptr Sep 1, 2026
29d8b91
perf(api): cache the Drive storage quota between status polls
ksprptr Sep 1, 2026
b0c8bd5
chore: drop the unused version field and unescape the author name
ksprptr Sep 1, 2026
caa0322
feat(api,web): proxy the Google OAuth handshake so the browser never …
ksprptr Sep 1, 2026
adb9ec7
ci: add GitHub Actions workflow for lint, build and tests
ksprptr Sep 1, 2026
af6dbee
chore: align node and pnpm versions with the reference project
ksprptr Sep 1, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 16 additions & 6 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -1,22 +1,32 @@
# deps
**/node_modules
.pnpm-store

# builds
apps/api/dist
apps/cdn/dist
apps/socials/.next
apps/api-assets/.next
apps/web/.next
**/out
**/build
**/*.tsbuildinfo

# turbo
**/.turbo
**/tsconfig.build.tsbuildinfo

# env
# env — the images ship only the examples (the API validates its env against .env.example)
**/.env
**/.env.*
!**/.env.example

# vcs / tooling
.git
.github
.husky
.claude

# reference material (not part of the app)
example

# misc
**/coverage
**/*.md
**/.claude
**/.DS_Store
20 changes: 17 additions & 3 deletions .env.example
Original file line number Diff line number Diff line change
@@ -1,21 +1,35 @@
# Root environment — infrastructure + the web app (docker compose reads this file).
# The API's own secrets live in apps/api/.env (see apps/api/.env.example).
#
# cp .env.example .env

# Database (PostgreSQL)
DB_HOST="localhost"
DB_PORT=5432
DB_NAME="dropto"
DB_USER="root"
DB_PASS="password"

# Redis
# Redis (rate limiter)
REDIS_PORT=6379
REDIS_USER="default"
REDIS_PASS="password"
REDIS_KEY_PREFIX="dropto:"

# URLs
APP_URL="http://localhost:3000"
NEXT_PUBLIC_API_URL="http://localhost:4000/api/v1"

# Security
# Auth-cookie domain. Use a shared parent in production (e.g. ".example.com") so the web app and the API can both read the cookies.
COOKIE_DOMAIN="localhost"

# Web build args
# Branding (optional) — display name of this instance; defaults to "DropTo" when empty.
APP_NAME="DropTo"

# Web build args — inlined into the browser bundle at build time.
NEXT_PUBLIC_GOOGLE_API_KEY="your_google_picker_api_key"
NEXT_PUBLIC_GOOGLE_APP_ID="your_google_cloud_project_number"

# Host ports the containers publish on, bound to 127.0.0.1 (docker compose only).
WEB_PORT=3000
API_PORT=4000
64 changes: 64 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
name: CI

# Two-branch flow (dev → prod): fast feedback on every push to dev, and a gate on the PR into prod.
on:
push:
branches: [dev]
pull_request:
branches: [prod]

# A newer push to the same branch/PR supersedes the run in flight.
concurrency:
group: ci-${{ github.ref }}
cancel-in-progress: true

permissions:
contents: read

jobs:
ci:
name: lint · build · test
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v5

# Reads the pnpm version from `packageManager` in package.json, so it cannot drift from local.
- uses: pnpm/action-setup@v4

- uses: actions/setup-node@v5
with:
node-version: 24
cache: pnpm

# Turborepo's local cache: unchanged packages replay instead of re-running.
- name: Restore Turborepo cache
uses: actions/cache@v4
with:
path: .turbo
key: turbo-${{ runner.os }}-${{ github.sha }}
restore-keys: turbo-${{ runner.os }}-

- name: Install dependencies
run: pnpm install --frozen-lockfile

- name: Lint
run: pnpm lint

# The lint scripts run eslint with --fix, so a fixable violation would be silently repaired and
# the step would pass. Failing on a dirty tree is what turns lint back into a real gate.
- name: Verify lint changed nothing
run: git diff --exit-code

- name: Build
run: pnpm build

- name: Unit tests (api)
run: pnpm --filter api run test

# Committed template of throwaway values — see the summary for why it is copied, not rebuilt here.
- name: Create the API test environment
run: cp apps/api/.env.test.example apps/api/.env.test

- name: E2E tests (api)
run: pnpm --filter api run test:e2e
Loading
Loading