Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
99 commits
Select commit Hold shift + click to select a range
5bc84a9
feat: redesign user profile with vertical swiper timeline
tim-eternos Dec 27, 2025
edee63a
Merge pull request #415 from timwangmusic/feat/swipe-for-profile
timwangmusic Dec 27, 2025
501aec4
Chore(deps-dev): Bump lodash from 4.17.21 to 4.17.23
dependabot[bot] Jan 21, 2026
a450023
Merge pull request #416 from timwangmusic/dependabot/npm_and_yarn/lod…
tim-eternos Jan 21, 2026
c9cea29
fix: use configurable frontend URL with temporary redirects
Ronnie434 Feb 11, 2026
59fef10
Merge pull request #417 from Ronnie434/fix/use-temporary-redirects
tim-eternos Feb 11, 2026
0fd8b6f
fix: pass JWT token in OAuth redirect for cross-domain auth
Ronnie434 Feb 11, 2026
85922f7
Merge pull request #418 from Ronnie434/fix/oauth-pass-jwt-in-redirect
tim-eternos Feb 11, 2026
b867b4a
fix(oauth): auto-register new users on Google SSO login
Ronnie434 Feb 12, 2026
ea5ad73
Merge pull request #419 from Ronnie434/fix/google-oauth-auto-register
tim-eternos Feb 12, 2026
f254389
Fix critical plan generation issues: opening hours, scoring, and erro…
claude Mar 21, 2026
d40eec4
Merge pull request #426 from timwangmusic/claude/review-plan-generati…
tim-eternos Mar 21, 2026
d218263
Improve plan generation with per-slot truncation and spatial clustering
claude Mar 21, 2026
1a1cdb6
Fix spatial clustering: recompute centroids and floor cluster radius
tim-eternos Mar 23, 2026
bf18e25
chore: run go fmt command
tim-eternos Mar 23, 2026
dc6ec1f
Merge pull request #427 from timwangmusic/claude/review-plan-generati…
timwangmusic Mar 23, 2026
f6273ca
Chore(deps-dev): Bump lodash from 4.17.23 to 4.18.1
dependabot[bot] Apr 10, 2026
aeb4671
Merge pull request #432 from timwangmusic/dependabot/npm_and_yarn/lod…
tim-eternos Apr 10, 2026
837bc54
Add brand keyword search and POST /v1/nearby-places endpoint
tim-eternos Jul 21, 2026
8bb5c2e
ci: modernize Go workflow actions
tim-eternos Jul 21, 2026
081f95f
fix: return empty places array instead of null for brands with no res…
tim-eternos Jul 21, 2026
a132e12
reduce cold-start external search radius from 10 to 5 miles
tim-eternos Jul 21, 2026
8e1fcac
cap Place Details calls to the nearest N results
tim-eternos Jul 21, 2026
e664ba8
fix: index details results by compact slot, not sparse result index
tim-eternos Jul 21, 2026
47246c8
test: cover selectPlacesForDetails candidate filtering and budget
tim-eternos Jul 21, 2026
92c6812
filter out places closed on the requested day in /v1/nearby-places
tim-eternos Jul 21, 2026
02557de
Merge pull request #437 from timwangmusic/feat/brand-nearby-places
timwangmusic Jul 21, 2026
2ae8506
Require authentication on POST /v1/nearby-places
tim-eternos Jul 22, 2026
ea09a1e
Merge pull request #438 from timwangmusic/feat/nearby-places-pat-auth
timwangmusic Jul 22, 2026
d74b63a
Fix email verify/reset links to target backend host
claude Jul 23, 2026
e9df1f2
Merge pull request #439 from Ronnie434/claude/email-verify-redirect-b…
timwangmusic Jul 23, 2026
742777f
Add category-based nearby places endpoint
tim-eternos Jul 28, 2026
11d03a1
Merge pull request #440 from timwangmusic/feat/nearby-places-by-category
timwangmusic Jul 28, 2026
ad2c9b3
Union all price buckets for category eatery search
tim-eternos Jul 28, 2026
90e0541
Keep single-key nearby read identical to pre-change behavior
tim-eternos Jul 28, 2026
6c5f29c
Merge pull request #441 from timwangmusic/feat/eatery-all-price-levels
timwangmusic Jul 28, 2026
9565db6
Classify category-endpoint places by primary Google type
tim-eternos Jul 28, 2026
9dba1dc
Merge pull request #442 from timwangmusic/feat/category-primary-place…
timwangmusic Jul 28, 2026
f197da4
Parallelize per-place-type Nearby Searches within a category
tim-eternos Jul 28, 2026
c24fb64
Merge pull request #443 from timwangmusic/feat/parallel-placetype-search
timwangmusic Jul 28, 2026
b2e472f
Widen category place search cap for brand-dedup headroom
tim-eternos Jul 29, 2026
165b957
Merge pull request #444 from timwangmusic/feat/wider-category-limit
timwangmusic Jul 29, 2026
e299558
Broaden Eatery category: bar, bakery, meal_takeaway
tim-eternos Jul 29, 2026
066c113
Merge pull request #445 from timwangmusic/feat/eatery-more-food-types
timwangmusic Jul 29, 2026
8644199
chore: add more place types to Eatery catergory
tim-eternos Jul 30, 2026
b8b643f
Merge pull request #446 from timwangmusic/chore/add-place-types
tim-eternos Jul 30, 2026
f8b7843
docs: add implementation plans for place-type fixes and Places API (N…
tim-eternos Jul 30, 2026
a2ded84
fix: stop mapping unknown place types to Eatery
tim-eternos Jul 30, 2026
98f940b
fix: reject non-legacy place types before calling Nearby Search
tim-eternos Jul 30, 2026
c1853f1
fix: reset mapsFailuresCount per round in extensiveNearbySearch
tim-eternos Jul 30, 2026
92d615b
fix: sort category results by distance before truncating
tim-eternos Jul 30, 2026
3ee7ed2
chore: add Vacation-planner binary to .gitignore
tim-eternos Jul 30, 2026
299a8fd
feat: add admin migration to purge misclassified places from geo buckets
tim-eternos Jul 30, 2026
267e690
fix: narrow bucket cleanup to the write rule and pipeline the scan
tim-eternos Jul 30, 2026
81c7f60
docs: correct the eatery place-type plan after final review
tim-eternos Jul 30, 2026
aada4e3
docs: record deferred follow-ups from the place-type fixes review
tim-eternos Jul 30, 2026
bf6645e
style: gofmt place_distance_sort_test.go
tim-eternos Jul 30, 2026
d089068
docs: replace planning docs with a concise migration runbook
tim-eternos Jul 30, 2026
ab9317f
Merge pull request #447 from timwangmusic/fix/eatery-place-type-miscl…
tim-eternos Jul 30, 2026
5e5d942
fix: stop re-searching Google Maps on every nearby-search request
tim-eternos Jul 30, 2026
21c9c3d
docs: correct the eatery union runbook's deploy ordering
tim-eternos Jul 30, 2026
e7e70ee
docs: record what the production eatery union actually found
tim-eternos Jul 30, 2026
836ec2b
Merge pull request #448 from timwangmusic/fix/nearby-search-cache-sco…
tim-eternos Jul 30, 2026
9b6d167
Expand place-type reverse map and unify ReclassifyForCategory on it
tim-eternos Jul 30, 2026
2a2ecdb
Add text search client, candidate stash, and confirm-insert flow
tim-eternos Jul 31, 2026
a23d808
Fix Task-2 review findings: photo clobber and unbounded Details call
tim-eternos Jul 31, 2026
7777028
Add HTTP handlers and routes for place text-search
tim-eternos Jul 31, 2026
d6b71da
Document place-search endpoints and fix stale reclassify docs
tim-eternos Jul 31, 2026
a272365
Fix review findings: residue arithmetic, false comparison, docstring
tim-eternos Jul 31, 2026
3c35c96
Pin GetPlaceTypes(Visit) in TestGetPlaceTypesByCategory
tim-eternos Jul 31, 2026
2a61462
Fix remaining review findings: docs, wire-contract tags, and a magic …
tim-eternos Jul 31, 2026
a96807a
Merge pull request #449 from timwangmusic/feat/place-text-search
tim-eternos Jul 31, 2026
03f799c
Cut Google Maps spend: cache reverse-geocode, trim Details mask, skip…
tim-eternos Aug 1, 2026
b7c8ff3
Replace BusinessStatus request field with fail-safe IncludeClosedPlac…
tim-eternos Aug 1, 2026
3a22b81
Merge pull request #450 from timwangmusic/perf/maps-cost-free-wins
tim-eternos Aug 2, 2026
f9fb253
Expand Visit category search to entertainment venue types
tim-eternos Aug 2, 2026
c0fb347
Merge pull request #451 from timwangmusic/feat/visit-entertainment-types
tim-eternos Aug 2, 2026
1a46e9a
Apple Maps Server API SDK (Phase 1) (#1)
timwangmusic Aug 11, 2026
7c5528e
ci: trigger workflows on main, drop vestigial Node.js workflow (#2)
timwangmusic Aug 11, 2026
9eb3420
fix(docker): multi-stage build on go 1.24; ship binary + config + ass…
tim-eternos Aug 11, 2026
5644870
feat(deploy): production compose stack (caddy + web + persistent redis)
tim-eternos Aug 11, 2026
7ce03a0
feat(deploy): VM deploy script (AR login, secret render, compose swap…
tim-eternos Aug 11, 2026
ca0ff1a
fix(deploy): atomic env render, rollback on failed verify, visible er…
tim-eternos Aug 11, 2026
c289bff
feat(deploy): idempotent GCP bootstrap script (VM, WIF, secrets, netw…
tim-eternos Aug 11, 2026
02a260d
fix(deploy): app-level verify with reachable rollback, AWS_REGION, de…
tim-eternos Aug 11, 2026
b28a678
Derive LocationType from the primary Google type for keyword searches
tim-eternos Aug 12, 2026
3c848be
Merge pull request #452 from timwangmusic/fix/keyword-search-location…
tim-eternos Aug 12, 2026
7cc6330
Merge remote-tracking branch 'upstream/master' into sync/upstream-452
tim-eternos Aug 12, 2026
f382499
Merge pull request #4 from offerbee-ai/sync/upstream-452
timwangmusic Aug 12, 2026
c8158d1
feat(deploy): self-seeding secrets (no Heroku dependency); new-projec…
tim-eternos Aug 12, 2026
3eba275
chore(deploy): set project id and admin users for offerbee-planner
tim-eternos Aug 12, 2026
892612f
fix(deploy): retry IAM bindings — new service accounts race policy wr…
tim-eternos Aug 12, 2026
9bdc5ce
chore(deploy): move to us-west1 — us-central1 exhausted for e2 shapes
tim-eternos Aug 12, 2026
2fe47e9
chore(deploy): serve plain HTTP on :80 until real domain exists
tim-eternos Aug 12, 2026
839ab25
chore(deploy): geo.offerbee.ai is the API domain
tim-eternos Aug 12, 2026
f2d424f
feat(planner): rate-limit-exempt /healthz for container and deploy pr…
tim-eternos Aug 12, 2026
9abd90e
fix(deploy): address major review findings from PR review
tim-eternos Aug 12, 2026
e256ece
Merge pull request #3 from offerbee-ai/feat/gcp-vm-deploy
timwangmusic Aug 12, 2026
b4f7b26
ci: automated deploy to GCP VM on push to main
tim-eternos Aug 12, 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
71 changes: 71 additions & 0 deletions .github/workflows/deploy.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
name: Deploy

on:
push:
branches: [main]
workflow_dispatch:
inputs:
tag:
description: "Existing image tag to (re)deploy; empty = build current SHA"
required: false

permissions:
contents: read
id-token: write

concurrency:
group: deploy-production
cancel-in-progress: false

jobs:
test:
uses: ./.github/workflows/go.yml

deploy:
needs: test
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6

- name: Resolve and validate image tag
id: tag
run: |
tag="${{ inputs.tag != '' && inputs.tag || github.sha }}"
# tag flows into shell commands below and a docker reference; allow
# only the characters valid in a docker tag so it cannot inject.
if ! printf '%s' "$tag" | grep -Eq '^[A-Za-z0-9_][A-Za-z0-9_.-]{0,127}$'; then
echo "refusing unsafe image tag: $tag" >&2
exit 1
fi
echo "tag=$tag" >> "$GITHUB_OUTPUT"

- uses: google-github-actions/auth@v3
with:
workload_identity_provider: ${{ vars.GCP_WIF_PROVIDER }}
service_account: ${{ vars.GCP_DEPLOYER_SA }}

- uses: google-github-actions/setup-gcloud@v3

- name: Build and push image
if: inputs.tag == ''
env:
IMAGE: ${{ vars.GCP_IMAGE }}
TAG: ${{ steps.tag.outputs.tag }}
run: |
gcloud auth configure-docker us-west1-docker.pkg.dev --quiet
docker build -t "${IMAGE}:${TAG}" .
docker push "${IMAGE}:${TAG}"

- name: Deploy to VM over IAP
env:
ZONE: ${{ vars.GCP_ZONE }}
VM: ${{ vars.GCP_VM }}
TAG: ${{ steps.tag.outputs.tag }}
run: |
gcloud compute ssh "$VM" --zone "$ZONE" --tunnel-through-iap \
--command='mkdir -p /tmp/planner-deploy'
gcloud compute scp deploy/docker-compose.prod.yml deploy/Caddyfile \
deploy/env.production deploy/deploy.sh \
"$VM":/tmp/planner-deploy/ --zone "$ZONE" --tunnel-through-iap
gcloud compute ssh "$VM" --zone "$ZONE" --tunnel-through-iap \
--command="sudo bash -c 'cp /tmp/planner-deploy/* /opt/planner/ && bash /opt/planner/deploy.sh ${TAG}'"
33 changes: 13 additions & 20 deletions .github/workflows/go.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,48 +2,41 @@ name: Go

on:
push:
branches: [master]
branches: [main]
pull_request:
branches: [master]
branches: [main]
workflow_call:

jobs:
golangci:
name: lint
runs-on: ubuntu-latest
steps:
- uses: actions/setup-go@v3
- uses: actions/checkout@v6
- uses: actions/setup-go@v6
with:
go-version: ^1.23
- uses: actions/checkout@v3
go-version-file: go.mod
- name: golangci-lint
uses: golangci/golangci-lint-action@v3
uses: golangci/golangci-lint-action@v9
with:
version: latest
only-new-issues: true

build:
name: Build
runs-on: ubuntu-latest
steps:
- name: Check out code into the Go module directory
uses: actions/checkout@v6

- name: Set up Go 1.x
uses: actions/setup-go@v3
uses: actions/setup-go@v6
with:
go-version: ^1.23
go-version-file: go.mod
id: go

- name: Check out code into the Go module directory
uses: actions/checkout@v3

- name: Get dependencies
run: |
go get -v -t -d ./...
if [ -f Gopkg.toml ]; then
curl https://raw.githubusercontent.com/golang/dep/master/install.sh | sh
dep ensure
fi

- name: Build
run: go build -v .
working-directory: .

- name: Test
run: go test -v ./...
31 changes: 0 additions & 31 deletions .github/workflows/node.js.yml

This file was deleted.

6 changes: 6 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,7 +1,13 @@
.env
.docker_build/

# Apple Maps private keys. Apple allows exactly one download of a .p8 and
# offers no way to retrieve it again, so a leak means revoking the key.
*.p8

vendor
bin/
.idea
.DS_Store
node_modules/
Vacation-planner
25 changes: 15 additions & 10 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -1,12 +1,17 @@
FROM golang:1.21-alpine

ENV GO111MODULE=on

COPY . /app/
WORKDIR /app/

RUN go build -v .
FROM golang:1.24-alpine AS build
WORKDIR /src
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 go build -o /out/vacation-planner .

FROM alpine:3.20
RUN apk add --no-cache ca-certificates tzdata && \
addgroup -S app && adduser -S app -G app
WORKDIR /app
COPY --from=build /out/vacation-planner ./vacation-planner
COPY config/ ./config/
COPY assets/ ./assets/
USER app
EXPOSE 10000

CMD ["./Vacation-planner"]
CMD ["./vacation-planner"]
Loading
Loading