Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
307 commits
Select commit Hold shift + click to select a range
537bd02
test(frontend): cover sign-up group route normalization
deemp May 5, 2026
c569d52
fix(frontend): normalize event sign-up responses
deemp May 5, 2026
83f8e77
fix(frontend): declare Tailwind apply blocks as postcss
deemp May 5, 2026
5639a92
feat(frontend): add a global advertisement toggle
deemp May 5, 2026
104adb5
docs(frontend): add frontend architecture decision records
deemp May 5, 2026
fa9c2ae
fix(frontend): remove dotenv file that wasn't present in the original…
deemp May 5, 2026
4b2b02e
refactor(frontend): unify freemium frontend gating
deemp May 5, 2026
d23d5f7
docs(frontend): retitle freemium gating adr
deemp May 5, 2026
69ce4cb
refactor(frontend): reduce the ADR identifier size
deemp May 6, 2026
ff9b184
refactor(frontend): centralize route and transport boundaries
deemp May 6, 2026
9c36b18
refactor(frontend): tighten calendar and plugin transport boundaries
deemp May 6, 2026
4caa038
fix(frontend): preserve canonical event boundary shapes
deemp May 6, 2026
4fa628e
docs(frontend): split temporal ADRs
deemp May 6, 2026
f314e7a
fix(frontend): restore ADR 001 boundary discipline
deemp May 6, 2026
7eaa5bd
fix(frontend): tighten temporal runtime boundaries
deemp May 6, 2026
534fb39
fix(frontend): enforce temporal date guardrails
deemp May 7, 2026
9cb70a9
docs(frontend): clarify temporal runtime rules
deemp May 7, 2026
675f5f4
docs(frontend): add ADR for Temporal collection semantics
deemp May 7, 2026
ef0e3d5
fix(frontend): normalize Vuetify button props
deemp May 7, 2026
14a1bef
docs(frontend): add ui primitive semantics adr
deemp May 7, 2026
d102acb
chore(frontend): reorder dependency entries
deemp May 7, 2026
2317462
chore(frontend): add playwright test tooling
deemp May 7, 2026
325de46
fix(frontend): restore landing hero sizing parity
deemp May 8, 2026
c9c6b36
chore(backlog): update inbox
deemp May 8, 2026
7f9fecd
fix(frontend): tighten landing hero parity
deemp May 8, 2026
fc56728
fix(frontend): finish legacy v-btn prop cleanup
deemp May 8, 2026
5ebb801
feat(frontend): add legacy v-btn prop lint rule
deemp May 8, 2026
5a64e95
docs(frontend): add ADR for frontend stack baseline
deemp May 8, 2026
9d5912b
docs(frontend): normalize ADR reference format
deemp May 8, 2026
9b5c31d
fix(frontend): align landing hero vertical offsets
deemp May 8, 2026
6bad0c0
fix(frontend): restore new event select labels
deemp May 8, 2026
678e7ef
Tighten advanced options parity styling
deemp May 8, 2026
7c4daf2
Fix new event dialog interactions and validation styling
deemp May 8, 2026
5a013db
Fix slide toggle border styling
deemp May 8, 2026
225fdb8
fix(frontend): restore date picker day selection
deemp May 8, 2026
1c7a996
fix(frontend): preserve date picker selections
deemp May 8, 2026
6fdb292
feat(frontend): add versioned migration comparator
deemp May 9, 2026
37b40e4
feat(frontend): add legacy timeful version as submodule
deemp May 9, 2026
5dafba4
fix(frontend): tighten advanced options parity
deemp May 9, 2026
438832f
test(frontend): extend new-event comparator checks
deemp May 9, 2026
113ec4d
fix(frontend): restore disabled new-event helper parity
deemp May 9, 2026
c3238a3
docs(frontend): clarify comparator startup steps
deemp May 9, 2026
b8b6c18
docs(frontend): split comparator parity guidance
deemp May 9, 2026
f59f8ac
fix(frontend): restore time range select parity
deemp May 9, 2026
7c7c020
fix(frontend): restore date picker width parity
deemp May 9, 2026
2556d78
fix(frontend): block adjacent-month date picker jumps
deemp May 9, 2026
3d7d758
fix(frontend): remove duplicate timezone option labels
deemp May 9, 2026
bf86e33
fix(frontend): restore timezone selector underline parity
deemp May 9, 2026
988683a
fix(frontend): restore legacy dialog header actions
deemp May 9, 2026
c4e0908
test(frontend): track new event close button parity
deemp May 9, 2026
1304cbc
fix(frontend): restore new event submit button states
deemp May 9, 2026
996e3a8
fix(frontend): restore legacy time-range dropdown selection palette
deemp May 9, 2026
0231fc5
feat(frontend): add semantic styling token ADR
deemp May 9, 2026
de80695
feat(frontend): add semantic styling tokens for new event form
deemp May 9, 2026
27c1599
fix(frontend): align gated new event checkboxes
deemp May 9, 2026
b6635a6
fix(frontend): align new event dropdown palettes
deemp May 9, 2026
145e012
refactor(frontend): align new event semantic color states
deemp May 9, 2026
190773f
chore(backlog): add items
deemp May 9, 2026
d52fda1
chore(frontend): require Vite API proxy target
deemp May 9, 2026
9c1be25
fix(frontend): stabilize new event submit button styling
deemp May 15, 2026
a4db0ae
fix(frontend): restore new event submit gating
deemp May 15, 2026
30b56d8
fix(frontend): encode new event dates at transport boundary
deemp May 15, 2026
069db1b
fix(frontend): restore event page transport decoding
deemp May 15, 2026
2222edc
fix(frontend): harden guest response submissions
deemp May 16, 2026
dec003f
fix(frontend): forward schedule overlap panel events
deemp May 16, 2026
c6f8fa5
fix(frontend): remove duplicate event page select labels
deemp May 16, 2026
a3f7cd6
fix(frontend): align schedule overlap time-type menu rows
deemp May 16, 2026
ac8bbc2
fix(frontend): normalize upward schedule-event drags
deemp May 16, 2026
3b72d5a
fix(frontend): restore legacy note icon spacing
deemp May 16, 2026
380eccf
fix(frontend): align event options toggle with legacy
deemp May 16, 2026
2cc7df0
fix(frontend): harden event page locale and Vuetify runtime paths
deemp May 16, 2026
e3b82e6
fix(frontend): contain respondents overflow gradient
deemp May 16, 2026
ec50fec
fix(frontend): restore event respondents rendering
deemp May 17, 2026
e36ea0a
fix(frontend): stabilize event respondents rendering
deemp May 17, 2026
a639583
fix(frontend): restore schedule overlap pointer interactions
deemp May 18, 2026
fb3ada6
fix(frontend): harden firefox comparator event-page runs
deemp May 18, 2026
d24f9f3
fix(frontend): restore schedule grid separator parity
deemp May 18, 2026
9561d95
fix(frontend): thin non-consecutive day separators
deemp May 18, 2026
83fd073
fix(frontend): restore schedule overlap switch toggles
deemp May 18, 2026
6478e56
fix(frontend): align compact schedule overlap switches
deemp May 18, 2026
9d22642
fix(frontend): isolate event boot from third-party startup
deemp May 18, 2026
04cb233
fix(frontend): restore overlay availability slot frames
deemp May 18, 2026
7cc42ef
feat(frontend): add migrated-only comparator inspect command
deemp May 18, 2026
c5157ae
fix(frontend): restore split event grid framing
deemp May 18, 2026
a64c779
fix(frontend): restore default event grid separators
deemp May 18, 2026
86265a8
fix(frontend): restore tool row select accent color
deemp May 18, 2026
8c4cb1f
fix(frontend): restore guest-created event edit action
deemp May 18, 2026
9c217db
fix(frontend): restore timed-grid nav button size
deemp May 18, 2026
213b81f
fix(frontend): centralize event ownership semantics
deemp May 18, 2026
5c0aef8
fix(frontend): restore guest event metadata editing
deemp May 18, 2026
e781609
feat(frontend): refine event description editor controls
deemp May 18, 2026
66ae126
feat(frontend): add landing branding flag
deemp May 19, 2026
ef15a5e
fix(frontend): harden Firefox comparator repro tooling
deemp May 19, 2026
a2a7aab
fix(frontend): align event description edit mode
deemp May 19, 2026
ae22b6d
fix(frontend): align alert text icon to the first line
deemp May 19, 2026
0cf90bb
fix(frontend): restore edit event specific-times checkbox color
deemp May 19, 2026
939d14f
fix(frontend): sync edited specific times immediately
deemp May 19, 2026
a11454d
fix(frontend): normalize specific-time event seed updates
deemp May 19, 2026
5f9a521
fix(frontend): align specific-time event grid baseline
deemp May 19, 2026
9e12c78
fix(frontend): avoid requiring api proxy target for production builds
deemp May 20, 2026
5381708
refactor(frontend): extract shared tooling env config
deemp May 20, 2026
e1f15bc
chore(frontend): update frontend builder image to node 26
deemp May 20, 2026
71a30d2
chore(frontend): split Docker build and dist move steps
deemp May 20, 2026
2daf0c6
build: update frontend compose build args and healthcheck
deemp May 20, 2026
8e46976
fix(frontend): wait for healthy frontend before starting server
deemp May 21, 2026
660f277
build(frontend): add caddy service to compose stack
deemp May 21, 2026
50b72bd
build(frontend): add compose dev overrides for local backend
deemp May 21, 2026
54f5c9c
build(frontend): add caddy edge routing config
deemp May 21, 2026
6cb8580
refactor(frontend): narrow backend html routing to event pages
deemp May 21, 2026
350b5ed
docs(frontend): update migration backlog
deemp May 21, 2026
00a04f1
refactor(frontend): optimize Docker build stages
deemp May 22, 2026
485d7ed
chore(frontend): trim Docker build context
deemp May 22, 2026
8a292e8
refactor(frontend): export build artifacts as one-shot service
deemp May 22, 2026
8acb9ba
docs(frontend): describe frontend-artifacts deployment flow
deemp May 22, 2026
ea7aa01
refactor(repo): consolidate env configuration at repo root
deemp May 22, 2026
e8a00f1
chore(server): remove stale log ignore entry
deemp May 22, 2026
4796919
chore(server): ignore local Go build cache
deemp May 22, 2026
17b9c54
refactor(server): optimize Docker build setup
deemp May 22, 2026
a6cd0bc
refactor(server): align runtime mode and log path
deemp May 22, 2026
ff364de
chore(env): add first-class staging environment support
deemp May 22, 2026
e180104
refactor: normalize environment naming
deemp May 22, 2026
42074fb
docs(env): remove outdated NODE_ENV note
deemp May 22, 2026
d424bd6
test(frontend): align event unit tests with current boundaries
deemp May 22, 2026
f3689fb
docs(frontend): refresh frontend backlog notes
deemp May 22, 2026
6e5ee9b
refactor(frontend): resolve lint cleanup regressions
deemp May 22, 2026
c66eaed
fix(frontend): normalize schedule overlap timezones
deemp May 22, 2026
c195020
chore(env): ignore current root env files
deemp May 22, 2026
c5c9e4f
docs(frontend): add migration agent guidance
deemp May 22, 2026
221833d
docs(frontend): add frontend agent note
deemp May 22, 2026
f60dd7e
docs(frontend): update comparator agent guidance
deemp May 22, 2026
757cfba
docs(frontend): clarify AGENTS instruction boundaries
deemp May 22, 2026
b8880f6
refactor(frontend): move bootstrap IIFEs to mount lifecycle
deemp May 22, 2026
45c224f
refactor(frontend): remove prop-mirroring state from dialog and auth …
deemp May 22, 2026
297b08d
fix(frontend): remove remaining lint warnings
deemp May 22, 2026
ccd49d5
fix(frontend): move timezone bootstrap ownership to parents
deemp May 22, 2026
ba8c10b
fix(frontend): narrow timezone storage reader type
deemp May 22, 2026
195ffd4
feat(frontend): modernize vuetify boolean contracts
deemp May 22, 2026
7ed1d65
feat(frontend): replace legacy Vuetify control selectors
deemp May 22, 2026
dd93866
feat(backlog): identify legacy patterns
deemp May 23, 2026
393eaa4
docs(frontend): add legacy migration findings tracker
deemp May 23, 2026
960a154
fix(frontend): address legacy ownership findings
deemp May 23, 2026
26f7b46
refactor(frontend): extract calendar accounts state
deemp May 23, 2026
2c130e2
fix(frontend): untangle contact and dialog ownership
deemp May 23, 2026
cab3a74
fix(frontend): centralize consent and invitation state
deemp May 23, 2026
341c369
fix(frontend): tighten schedule overlap sidebar contracts
deemp May 23, 2026
33813b4
refactor(frontend): extract sign-up blocks viewport
deemp May 24, 2026
5c7a44b
refactor(frontend): remove reload-owned editor and timezone flows
deemp May 24, 2026
71ecbf1
refactor(frontend): extract sign-in and pronunciation state
deemp May 24, 2026
6fd67b0
refactor(frontend): extract schedule overlap state
deemp May 24, 2026
eb8a6e2
refactor(frontend): extract shared event editor state
deemp May 24, 2026
b0585e4
refactor(frontend): split upgrade dialog state
deemp May 24, 2026
375a97b
feat(frontend): clean up route dismissible state
deemp May 24, 2026
66ceab1
feat(frontend): clean up legacy wrapper components
deemp May 24, 2026
6d201c8
fix(frontend): restore event timezone fallback
deemp May 24, 2026
bbb524e
fix(frontend): avoid fractional Temporal grid offsets
deemp May 25, 2026
c03bea2
fix(frontend): align weird-offset schedule grid separators
deemp May 25, 2026
7a6ae8f
feat(frontend): collapse hidden schedule hours
deemp May 25, 2026
0d58c00
fix(frontend): restrict legacy guest response editing
deemp May 25, 2026
42e5b0b
docs(frontend): add guest response ownership ADR
deemp May 25, 2026
5d61f02
fix(frontend): restore schedule overlap specific-times affordances
deemp May 26, 2026
5e9dd77
feat(frontend): preserve guest identity across edits
deemp May 26, 2026
d96f596
fix(frontend): keep availability drag box visible on release
deemp May 26, 2026
f8b24f7
feat(frontend): support multiple owned guest responses
deemp May 26, 2026
131bf00
fix: harden response name normalization
deemp May 27, 2026
4de7122
test(server): isolate mongo-backed route tests
deemp May 27, 2026
e1c2f44
fix: canonicalize respondent identity for empty-name rows
deemp May 27, 2026
f0c9669
fix(server): harden canonicalization guard and test assertions
deemp May 27, 2026
e193b00
docs: clarify destructive database commands
deemp May 29, 2026
40906d4
fix(frontend): show missing event state
deemp May 29, 2026
90a2d1a
fix(frontend): restore landing GitHub star badge
deemp May 29, 2026
8ddd888
fix(frontend): refresh specific-time event snapshot
deemp May 29, 2026
1ca66d7
fix(frontend): refine schedule selection affordance
deemp May 29, 2026
4dee672
fix(frontend): unify event grid line styling
deemp May 29, 2026
e033adf
fix(frontend): rename grid cursor outline token
deemp May 29, 2026
54d7a92
fix(frontend): close guest availability edit menu on outside click
deemp May 29, 2026
ed115d2
fix(frontend): collapse edge unavailable hours in responses
deemp May 29, 2026
6b1cc99
feat(frontend): refine schedule overlap time-grid behavior
deemp May 29, 2026
9384bd5
fix(frontend): preserve added days in specific-time edits
deemp May 29, 2026
710cce4
fix(frontend): keep specific-times cursor aligned during drag
deemp May 30, 2026
2af2e30
feat(frontend): style date picker weekdays
deemp May 30, 2026
e7bad5a
fix(frontend): keep timed event options visible with zero responses
deemp May 30, 2026
0c4f613
fix(frontend): restore legacy heatmap tint for second guest availability
deemp May 30, 2026
132e03c
feat(frontend): realign event copy link action
deemp May 30, 2026
20cc34d
feat(frontend): group event availability actions
deemp May 30, 2026
d0762b3
feat(frontend): move event options into the header
deemp May 30, 2026
ebbe72e
fix(frontend): unify schedule overlap breakpoint handling
deemp May 30, 2026
27de75a
feat(frontend): refine respondent row edit actions
deemp May 30, 2026
bcfff89
feat(frontend): add timed event instant slot model adr
deemp May 31, 2026
de5d557
docs(frontend): expand migration inbox backlog
deemp May 31, 2026
9f1e061
fix(app): implement ADR-012
deemp Jun 1, 2026
260b136
fix(frontend): resolve type errors in repro-date-added-visual-gap-and…
deemp Jun 4, 2026
2bd896d
fix(frontend): align Timezone label with Time increment in advanced o…
deemp Jun 4, 2026
d2d492b
fix(frontend): use grid line color for underlined variant borders
deemp Jun 4, 2026
9d3874e
fix(frontend): update test to match removed tw-justify-center
deemp Jun 4, 2026
ea67d09
fix(frontend): right-align event header controls and show Best times …
deemp Jun 4, 2026
018979f
fix(frontend): add e2e repro spec for no-responses header layout
deemp Jun 4, 2026
8e537ae
fix(frontend): show Best times toggle on mobile at 1+ response
deemp Jun 4, 2026
b0214d7
fix(frontend): restructure desktop header actions to 2-column grid la…
deemp Jun 4, 2026
606b681
fix(frontend): prevent More options menu from closing on toggle click
deemp Jun 4, 2026
007886e
fix(frontend): switch to single-column layout when More options is hi…
deemp Jun 6, 2026
d39428c
fix(frontend): convert timed-slot coverage to UTC before storing as s…
deemp Jun 10, 2026
1a1eb33
fix(frontend): reset curTimeslotAvailability when cursor leaves grid
deemp Jun 10, 2026
0b822f7
fix(frontend): add outline and calendar icon to mobile Schedule buttons
deemp Jun 10, 2026
62b4eb0
feat(frontend): refine event header metadata actions
deemp Jun 10, 2026
41378a4
feat(frontend): refine event page availability actions
deemp Jun 11, 2026
7d7c97e
fix(frontend): align timed event days with viewer timezone
deemp Jun 11, 2026
1565f74
fix(frontend): hide duplicate timed event date summary
deemp Jun 11, 2026
de56ae6
feat(frontend): add breathing room below event titles
deemp Jun 11, 2026
c3409e7
fix(frontend): align event description with header actions
deemp Jun 11, 2026
69eade3
fix(frontend): align event description trigger text
deemp Jun 11, 2026
36790fc
fix(frontend): add icons to mobile availability buttons
deemp Jun 11, 2026
a01ecd6
feat(frontend): move schedule event to Event desktop header, span two…
deemp Jun 11, 2026
969a55c
fix(frontend): use absoluteMinutes for canonical timed slot response …
deemp Jun 11, 2026
1da4df9
fix(frontend): preserve timed slot state across edits
deemp Jun 11, 2026
caf1d43
feat(frontend): update desktop best-times toggle label
deemp Jun 11, 2026
a2f5cd6
fix(frontend): narrow shown in selector on small tablets
deemp Jun 12, 2026
be3c7c2
feat(frontend): restyle mobile schedule footer button
deemp Jun 12, 2026
74d1949
fix(frontend): align schedule menu items
deemp Jun 12, 2026
7c344fe
feat(frontend): restore availability autofill provider icons
deemp Jun 12, 2026
b06d656
fix(frontend): block empty respondent availability saves
deemp Jun 12, 2026
2975fb4
fix(frontend): keep empty-response header actions compact
deemp Jun 12, 2026
223ed93
fix(frontend): remove mobile add availability button shadow
deemp Jun 12, 2026
bed0f41
fix(frontend): scope 'Shown in' timezone to per-event localStorage key
deemp Jun 12, 2026
33d5dcb
fix(frontend): keep advanced options visible in event editor
deemp Jun 12, 2026
8463a9f
fix(frontend): underline time increment in new event form
deemp Jun 12, 2026
7a0f858
fix(frontend): align specific-times helper copy
deemp Jun 12, 2026
4e73c52
feat(frontend): use flat compact toggle for specific times
deemp Jun 12, 2026
e0fb4cc
fix(frontend): align new event time increment select styling
deemp Jun 12, 2026
fc22593
feat(frontend): refresh new event weekday picker
deemp Jun 12, 2026
619f4a7
fix(frontend): square up new event weekday selector
deemp Jun 12, 2026
7550086
fix(frontend): align new event time increment control
deemp Jun 12, 2026
60696a1
fix(frontend): remove duplicate time increment underline
deemp Jun 12, 2026
bc91f37
fix(frontend): increase spacing before event date section
deemp Jun 12, 2026
fc823b6
chore(inbox): update
deemp Jun 12, 2026
72779ff
fix(frontend): make description view/edit line spacing consistent
deemp Jun 12, 2026
d620723
fix(frontend): right-align Cancel and Save buttons when editing avail…
deemp Jun 12, 2026
b034e73
feat(frontend): move delete availability button from sidebar to Event…
deemp Jun 12, 2026
59419e5
feat(frontend): collapse hours and add Show all hours toggle during a…
deemp Jun 12, 2026
e7cab85
fix(frontend): advance addBlock idx when date is null to prevent bloc…
deemp Jun 13, 2026
4bc9159
fix(frontend): group specific-times edit columns by viewer-local date
deemp Jun 14, 2026
91f0b33
fix(frontend): preserve availability edit actions and edit columns
deemp Jun 14, 2026
c5827f9
fix: canonicalize overlapping timed response slots
deemp Jun 14, 2026
8f0932c
docs(frontend): rewrite timed specific-date slot ADR
deemp Jun 14, 2026
eb7b34e
chore(inbox): update
deemp Jun 14, 2026
cf3600e
fix(frontend): enforce canonical timed event contract
deemp Jun 15, 2026
cd9a263
fix(frontend): align app header and body widths
deemp Jun 17, 2026
b034293
docs(environments): document VITE_ENABLE_SIGN_IN flag semantics
deemp Jun 17, 2026
c234a7e
feat(frontend): make sign-in disableable via VITE_ENABLE_SIGN_IN env …
deemp Jun 17, 2026
2db177f
Merge remote-tracking branch 'origin/main' into migrate/vue3-vite-ts
deemp Jun 17, 2026
f1ce3e9
Merge pull request #1 from deemp/migrate/vue3-vite-ts
deemp Jun 17, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
62 changes: 62 additions & 0 deletions .env.development.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
# Root development environment for frontend tooling and docker compose.

# Frontend tooling
VITE_DEV_HOST=127.0.0.1
VITE_DEV_PORT=4173
VITE_API_PROXY_TARGET=http://127.0.0.1:3002
VITE_PREVIEW_HOST=127.0.0.1
VITE_PREVIEW_PORT=4173

# Frontend build-time values
VITE_APP_ENV=development
VITE_POSTHOG_API_KEY=
VITE_ENABLE_SIGN_IN=true
VITE_ENABLE_FREEMIUM=false
VITE_ENABLE_THIRD_PARTY_SHELL=false
VITE_SHOW_FORMERLY_KNOWN_AS_SCHEJ=false

# Backend runtime values
APP_ENV=development
CLIENT_ID=
CLIENT_SECRET=
ANDROID_CLIENT_ID=
IOS_CLIENT_ID=
MICROSOFT_CLIENT_ID=
MICROSOFT_CLIENT_SECRET=
MONGODB_URI=mongodb://mongo:27017
ENCRYPTION_KEY=
SESSION_SECRET=
CORS_ORIGINS=https://localhost,http://localhost:4173,http://localhost:4174,http://127.0.0.1:4173,http://127.0.0.1:4174
SERVICE_ACCOUNT_KEY_PATH=
ANALYTICS_USERNAME=
ANALYTICS_PASSWORD=
DISCORD_BOT_TOKEN=
GUILD_ID=
SLACK_DEV_WEBHOOK_URL=
SLACK_PROD_WEBHOOK_URL=
SLACK_MONETIZATION_WEBHOOK_URL=
MAILCHIMP_API_KEY=
MAILJET_API_KEY=
MAILJET_API_SECRET=
MAILJET_LIST_ID=
LISTMONK_ENABLED=
LISTMONK_URL=
LISTMONK_USERNAME=
LISTMONK_PASSWORD=
LISTMONK_LIST_ID=
LISTMONK_INITIAL_EMAIL_REMINDER_ID=
LISTMONK_SECOND_EMAIL_REMINDER_ID=
LISTMONK_FINAL_EMAIL_REMINDER_ID=
LISTMONK_OTP_EMAIL_TEMPLATE_ID=
GMAIL_APP_PASSWORD=
SCHEJ_EMAIL_ADDRESS=
STRIPE_API_KEY=
STRIPE_WEBHOOK_SECRET=
STRIPE_MONTHLY_PRICE_ID=
STRIPE_MONTHLY_STUDENT_PRICE_ID=
STRIPE_YEARLY_PRICE_ID=
STRIPE_YEARLY_STUDENT_PRICE_ID=
STRIPE_LIFETIME_PRICE_ID=
STRIPE_LIFETIME_PRICE_ID_2=
STRIPE_LIFETIME_STUDENT_PRICE_ID=
GIN_MODE=debug
59 changes: 59 additions & 0 deletions .env.production.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
# Root production environment for frontend builds and docker compose.

# Frontend build-time values
VITE_APP_ENV=production
VITE_POSTHOG_API_KEY=
VITE_ENABLE_SIGN_IN=true
VITE_ENABLE_FREEMIUM=true
VITE_ENABLE_THIRD_PARTY_SHELL=false
VITE_SHOW_FORMERLY_KNOWN_AS_SCHEJ=true

# Optional local preview settings for production-style frontend checks
VITE_PREVIEW_HOST=127.0.0.1
VITE_PREVIEW_PORT=4173

# Backend runtime values
APP_ENV=production
CLIENT_ID=
CLIENT_SECRET=
ANDROID_CLIENT_ID=
IOS_CLIENT_ID=
MICROSOFT_CLIENT_ID=
MICROSOFT_CLIENT_SECRET=
MONGODB_URI=mongodb://mongo:27017
ENCRYPTION_KEY=
SESSION_SECRET=
CORS_ORIGINS=https://www.schej.it,https://schej.it,https://www.timeful.app,https://timeful.app
SERVICE_ACCOUNT_KEY_PATH=
ANALYTICS_USERNAME=
ANALYTICS_PASSWORD=
DISCORD_BOT_TOKEN=
GUILD_ID=
SLACK_DEV_WEBHOOK_URL=
SLACK_PROD_WEBHOOK_URL=
SLACK_MONETIZATION_WEBHOOK_URL=
MAILCHIMP_API_KEY=
MAILJET_API_KEY=
MAILJET_API_SECRET=
MAILJET_LIST_ID=
LISTMONK_ENABLED=
LISTMONK_URL=
LISTMONK_USERNAME=
LISTMONK_PASSWORD=
LISTMONK_LIST_ID=
LISTMONK_INITIAL_EMAIL_REMINDER_ID=
LISTMONK_SECOND_EMAIL_REMINDER_ID=
LISTMONK_FINAL_EMAIL_REMINDER_ID=
LISTMONK_OTP_EMAIL_TEMPLATE_ID=
GMAIL_APP_PASSWORD=
SCHEJ_EMAIL_ADDRESS=
STRIPE_API_KEY=
STRIPE_WEBHOOK_SECRET=
STRIPE_MONTHLY_PRICE_ID=
STRIPE_MONTHLY_STUDENT_PRICE_ID=
STRIPE_YEARLY_PRICE_ID=
STRIPE_YEARLY_STUDENT_PRICE_ID=
STRIPE_LIFETIME_PRICE_ID=
STRIPE_LIFETIME_PRICE_ID_2=
STRIPE_LIFETIME_STUDENT_PRICE_ID=
GIN_MODE=release
59 changes: 59 additions & 0 deletions .env.staging.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
# Root staging environment for frontend builds and docker compose.

# Frontend build-time values
VITE_APP_ENV=staging
VITE_POSTHOG_API_KEY=
VITE_ENABLE_SIGN_IN=true
VITE_ENABLE_FREEMIUM=true
VITE_ENABLE_THIRD_PARTY_SHELL=false
VITE_SHOW_FORMERLY_KNOWN_AS_SCHEJ=true

# Optional local preview settings for staging-style frontend checks
VITE_PREVIEW_HOST=127.0.0.1
VITE_PREVIEW_PORT=4173

# Backend runtime values
APP_ENV=staging
CLIENT_ID=
CLIENT_SECRET=
ANDROID_CLIENT_ID=
IOS_CLIENT_ID=
MICROSOFT_CLIENT_ID=
MICROSOFT_CLIENT_SECRET=
MONGODB_URI=mongodb://mongo:27017
ENCRYPTION_KEY=
SESSION_SECRET=
CORS_ORIGINS=https://staging.timeful.app
SERVICE_ACCOUNT_KEY_PATH=
ANALYTICS_USERNAME=
ANALYTICS_PASSWORD=
DISCORD_BOT_TOKEN=
GUILD_ID=
SLACK_DEV_WEBHOOK_URL=
SLACK_PROD_WEBHOOK_URL=
SLACK_MONETIZATION_WEBHOOK_URL=
MAILCHIMP_API_KEY=
MAILJET_API_KEY=
MAILJET_API_SECRET=
MAILJET_LIST_ID=
LISTMONK_ENABLED=
LISTMONK_URL=
LISTMONK_USERNAME=
LISTMONK_PASSWORD=
LISTMONK_LIST_ID=
LISTMONK_INITIAL_EMAIL_REMINDER_ID=
LISTMONK_SECOND_EMAIL_REMINDER_ID=
LISTMONK_FINAL_EMAIL_REMINDER_ID=
LISTMONK_OTP_EMAIL_TEMPLATE_ID=
GMAIL_APP_PASSWORD=
SCHEJ_EMAIL_ADDRESS=
STRIPE_API_KEY=
STRIPE_WEBHOOK_SECRET=
STRIPE_MONTHLY_PRICE_ID=
STRIPE_MONTHLY_STUDENT_PRICE_ID=
STRIPE_YEARLY_PRICE_ID=
STRIPE_YEARLY_STUDENT_PRICE_ID=
STRIPE_LIFETIME_PRICE_ID=
STRIPE_LIFETIME_PRICE_ID_2=
STRIPE_LIFETIME_STUDENT_PRICE_ID=
GIN_MODE=release
6 changes: 5 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
*.exe
server/logs.log
.DS_Store
server/server
deploy_scripts/reboot_log.txt
.keys
*.log
.eslintcache
.claude
.env.development
.env.staging
.env.production
3 changes: 3 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
[submodule "migration/timeful.app.js"]
path = migration/timeful.app.js
url = https://github.com/schej-it/timeful.app
136 changes: 136 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,136 @@
# Repository Layout

This repo contains:

- a frontend in `./frontend`
- a backend in `./server`
- the previous frontend implementation in `migration/timeful.app.js`
- the shared migration browser tooling in `migration/comparator`

## Working Defaults

Unless the user explicitly asks for server changes:

- treat `frontend/` as the primary working directory
- use clean layout-based fixes, not hacks
- prefer adding regression tests before fixing migration bugs
- keep repo-tracked frontend browser checks under `frontend/e2e`
- newly added regression tests may fail when they are meant to expose an existing bug
- first confirm that the finding you plan to work on still reproduces
- update the relevant findings handoff file when adding or refining reproductions
- suggest new findings if you notice them

Canonical findings location:

- `findings/*.md`

## Server Test Workflow

For backend work that touches Mongo-backed route tests:

- use the isolated test overlay in `compose.test.yaml` as the default path
- start test Mongo with `docker compose --env-file .env.development -f compose.yaml -f compose.test.yaml up -d mongo-test`
- run the scoped route suite with `docker compose --env-file .env.development -f compose.yaml -f compose.test.yaml run --rm server-test`
- clean up isolated test state with `docker compose --env-file .env.development -f compose.yaml -f compose.test.yaml down -v`
- prefer the isolated Compose stack over host Mongo for repeatable local and CI-friendly runs
- if Mongo-backed tests are run directly on the host, require an explicit `MONGODB_URI` pointing at a dedicated test database
- do not rely on a `127.0.0.1:27017` fallback for Mongo-backed route tests

## Frontend Runtime Workflow

For local frontend parity work against the backend:

- start `mongo` and `server` with `docker compose --env-file .env.development -f compose.yaml -f compose.development.yaml up --build mongo server`
- start the migrated app from `./frontend` on `127.0.0.1:4173`
- start the legacy app from `./migration/timeful.app.js/frontend` on `127.0.0.1:4174`
- keep the migrated frontend pointed at the backend through the repo-root `.env.development`, with `VITE_API_PROXY_TARGET=http://127.0.0.1:3002`
- keep the legacy frontend running through its Vue dev-server proxy on `127.0.0.1:4174` so `/api` and `/swagger` are forwarded to `http://127.0.0.1:3002`
- verify frontend-to-backend wiring through the frontend origins with `http://127.0.0.1:4173/api/health` and `http://127.0.0.1:4174/api/health`

When asked to start frontend dev servers or run browser parity checks, follow `./migration/comparator/AGENTS.md` for the detailed command flow.

## Comparator Policy

When aligning the migrated frontend with the legacy frontend:

- run browser checks using `./migration/comparator`
- prefer `inspect` while investigating migrated behavior
- use `compare` when you specifically need old-vs-new parity evidence
- use comparator output as the primary evidence for style and layout adjustments whenever both apps exist locally
- keep Firefox comparator runs sequential while the intermittent `page.goto(...): NS_ERROR_OUT_OF_MEMORY` instability remains under investigation
- for `/e/dEeaF` event scenarios, prefer the shared comparator flow so the stable locale shim and consent-dismiss setup run before snapshot collection
- run Firefox comparator tooling outside the Codex sandbox by default for this repo
- if a Firefox comparator repro only fails inside the sandboxed path, do not classify it as a frontend migration regression without reproducing it outside the sandbox
- if Firefox `page.goto(...): NS_ERROR_OUT_OF_MEMORY` only appears inside the sandboxed path, do not classify it as a frontend migration bug without stronger outside-sandbox evidence

## Cross-Cutting Frontend Rules

Follow the frontend ADRs and `./frontend/AGENTS.md` for implementation details. In particular:

- keep boundary and transport types separate from internal types
- preserve one canonical internal shape per concept
- keep compatibility coercions and transport decoding or encoding at explicit boundaries, not inside views, composables, or submit paths
- many Temporal regressions are runtime issues, so passing typecheck or build is not sufficient
- keep shared timezone decoding centralized and avoid rebuilding it at call sites
- treat Temporal values with value semantics, not identity semantics
- keep civil-date, end-of-day, and working-hours semantics explicit at domain boundaries

## Required Checks

For frontend work, run:

- `cd frontend && npm run lint`
- `cd frontend && npm run typecheck`
- `cd frontend && npm run build`
- `cd frontend && npm run test:unit`

## Local Frontend Debug

For local frontend debugging, keep the production-oriented `compose.yaml` and layer the repo-local override on top of it.

Local frontend tooling expects these variables in the repo-root `.env.development`:

- `VITE_DEV_HOST`
- `VITE_DEV_PORT`
- `VITE_API_PROXY_TARGET`

If your local backend is on a different host or port, point `VITE_API_PROXY_TARGET` there instead.

Useful local entry points:

- fast UI debug: `http://127.0.0.1:4173/test`
- real integrated flow: sign in, open `http://127.0.0.1:4173/home`, then click create event

The Vite dev server proxies `/api` and `/swagger` to `VITE_API_PROXY_TARGET`, so frontend requests stay same-origin and avoid browser CORS issues.
The canonical env-file contract lives in `docs/environments.md`.

## Local Firefox E2E Verification

For local Firefox timed-event verification against the real runtime stack:

- start `mongo` and `server` with `docker compose --env-file .env.development -f compose.yaml -f compose.development.yaml up --build mongo server`
- start the migrated frontend from `frontend/` with `npm run dev -- --host 127.0.0.1 --port 4173`
- run Playwright from `frontend/` with `PLAYWRIGHT_USE_EXISTING_SERVER=1 npm run test:e2e -- --project=firefox-desktop`

When `PLAYWRIGHT_USE_EXISTING_SERVER=1` is set, Playwright keeps the configured `baseURL` but skips launching its own frontend `webServer`. Use this local-only mode when you intentionally want Playwright to target an already running migrated app; keep the default mode for CI and for runs where Playwright should own the dev server lifecycle.

## Rewrite Safety

- when cleaning the worktree for rebases, amends, or other history rewrites, prefer explicitly moving or copying tracked and untracked files aside and restoring them afterward
- do not use `rm` as the primary cleanup mechanism when a non-destructive move or backup approach is practical

## VS Code MCP Usage

Only use:

- `search_symbols_code`
- `get_symbol_definition_code`
- `get_diagnostics_code`

## Commits

- write conventional commit messages
- for frontend changes, use the `frontend` scope
- explain the changes in the commit body, including why they were made
- do not mention unrelated changes
- add co-authored at the end of the commit message
Loading