diff --git a/.env b/.env new file mode 100644 index 0000000..681178b --- /dev/null +++ b/.env @@ -0,0 +1,31 @@ +SITE_DOMAIN=greenlenspro.com +SITE_URL=https://greenlenspro.com + +POSTGRES_DB=greenlns +POSTGRES_USER=greenlns +POSTGRES_PASSWORD=change-me-in-prod +DATABASE_URL=postgresql://greenlns:change-me-in-prod@postgres:5432/greenlns + +JWT_SECRET=change-me-in-prod + +MINIO_ACCESS_KEY=greenlns-minio +MINIO_SECRET_KEY=change-me-in-prod +MINIO_BUCKET=plant-images +MINIO_PUBLIC_URL=https://greenlenspro.com/storage + +OPENAI_API_KEY= +OPENAI_SCAN_MODEL=gpt-5-mini +OPENAI_HEALTH_MODEL=gpt-5-mini + +REVENUECAT_WEBHOOK_SECRET= +REVENUECAT_PRO_ENTITLEMENT_ID=pro + +PLANT_IMPORT_ADMIN_KEY=greenlens-admin-2024 + +DISCORD_WEBHOOK_SALES_URL= +DISCORD_WEBHOOK_DOWNLOADS_URL= + +TIKTOK_CLIENT_KEY=awoihp5i4k4rraen +TIKTOK_CLIENT_SECRET=TdnxlcQLNRXAy2PW0GsSlQTEqGeHgU7x +TIKTOK_REDIRECT_URI=https://greenlenspro.com/api/tiktok/callback +PLANT_IMPORT_ADMIN_KEY=greenlens-admin-2024 diff --git a/app.json b/app.json index 5052983..15f76c5 100644 --- a/app.json +++ b/app.json @@ -2,7 +2,7 @@ "expo": { "name": "GreenLens", "slug": "greenlens", - "version": "2.2.9", + "version": "2.3.0", "orientation": "portrait", "icon": "./assets/icon.png", "userInterfaceStyle": "automatic", diff --git a/app/onboarding/source.tsx b/app/onboarding/source.tsx index 9904771..e40987b 100644 --- a/app/onboarding/source.tsx +++ b/app/onboarding/source.tsx @@ -231,8 +231,10 @@ const TypingIndicator = ({ colors }: { colors: any }) => { export default function OnboardingChatScreen() { const router = useRouter(); const posthog = useSafeAnalytics(); - const { session, isDarkMode, colorPalette, language } = useApp(); - const colors = useColors(isDarkMode, colorPalette); + const { session, colorPalette, language } = useApp(); + // This screen is hardcoded dark (#131e14 backgrounds), so always use the + // dark color set — theme-dependent text would be unreadable in light mode. + const colors = useColors(true, colorPalette); const copy = getChatCopy(language); const { height } = useWindowDimensions(); const compact = height < 700; diff --git a/docker-compose.yml b/docker-compose.yml index 9c7e98d..8a6bd1f 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -45,6 +45,9 @@ services: DISCORD_WEBHOOK_SALES_URL: ${DISCORD_WEBHOOK_SALES_URL:-} DISCORD_WEBHOOK_DOWNLOADS_URL: ${DISCORD_WEBHOOK_DOWNLOADS_URL:-} JWT_SECRET: ${JWT_SECRET:?JWT_SECRET is required} + TIKTOK_CLIENT_KEY: ${TIKTOK_CLIENT_KEY:-} + TIKTOK_CLIENT_SECRET: ${TIKTOK_CLIENT_SECRET:-} + TIKTOK_REDIRECT_URI: ${TIKTOK_REDIRECT_URI:-https://greenlenspro.com/api/tiktok/callback} PLANT_IMPORT_ADMIN_KEY: ${PLANT_IMPORT_ADMIN_KEY:-} depends_on: postgres: diff --git a/package-lock.json b/package-lock.json index 1b93f1f..def1fc8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "greenlens", - "version": "2.2.9", + "version": "2.3.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "greenlens", - "version": "2.2.9", + "version": "2.3.0", "hasInstallScript": true, "dependencies": { "@expo/vector-icons": "^15.0.3", diff --git a/package.json b/package.json index e1f8e6c..e2a694b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "greenlens", - "version": "2.2.9", + "version": "2.3.0", "main": "expo-router/entry", "private": true, "scripts": { diff --git a/social_out/2026-07-07_greenlens_leaf-drop_pack/greenlens_leaf_drop_contact_sheet.png b/social_out/2026-07-07_greenlens_leaf-drop_pack/greenlens_leaf_drop_contact_sheet.png new file mode 100644 index 0000000..b6ca5d9 Binary files /dev/null and b/social_out/2026-07-07_greenlens_leaf-drop_pack/greenlens_leaf_drop_contact_sheet.png differ diff --git a/social_out/2026-07-07_greenlens_leaf-drop_pack/greenlens_leaf_drop_facebook_key_visual.png b/social_out/2026-07-07_greenlens_leaf-drop_pack/greenlens_leaf_drop_facebook_key_visual.png new file mode 100644 index 0000000..97a940b Binary files /dev/null and b/social_out/2026-07-07_greenlens_leaf-drop_pack/greenlens_leaf_drop_facebook_key_visual.png differ diff --git a/social_out/2026-07-07_greenlens_leaf-drop_pack/greenlens_leaf_drop_slide_01.png b/social_out/2026-07-07_greenlens_leaf-drop_pack/greenlens_leaf_drop_slide_01.png new file mode 100644 index 0000000..8fa22d7 Binary files /dev/null and b/social_out/2026-07-07_greenlens_leaf-drop_pack/greenlens_leaf_drop_slide_01.png differ diff --git a/social_out/2026-07-07_greenlens_leaf-drop_pack/greenlens_leaf_drop_slide_02.png b/social_out/2026-07-07_greenlens_leaf-drop_pack/greenlens_leaf_drop_slide_02.png new file mode 100644 index 0000000..f65eb74 Binary files /dev/null and b/social_out/2026-07-07_greenlens_leaf-drop_pack/greenlens_leaf_drop_slide_02.png differ diff --git a/social_out/2026-07-07_greenlens_leaf-drop_pack/greenlens_leaf_drop_slide_03.png b/social_out/2026-07-07_greenlens_leaf-drop_pack/greenlens_leaf_drop_slide_03.png new file mode 100644 index 0000000..5656b1e Binary files /dev/null and b/social_out/2026-07-07_greenlens_leaf-drop_pack/greenlens_leaf_drop_slide_03.png differ diff --git a/social_out/2026-07-07_greenlens_leaf-drop_pack/greenlens_leaf_drop_slide_04.png b/social_out/2026-07-07_greenlens_leaf-drop_pack/greenlens_leaf_drop_slide_04.png new file mode 100644 index 0000000..19315ef Binary files /dev/null and b/social_out/2026-07-07_greenlens_leaf-drop_pack/greenlens_leaf_drop_slide_04.png differ diff --git a/social_out/2026-07-07_greenlens_leaf-drop_pack/greenlens_leaf_drop_slide_05.png b/social_out/2026-07-07_greenlens_leaf-drop_pack/greenlens_leaf_drop_slide_05.png new file mode 100644 index 0000000..afdd111 Binary files /dev/null and b/social_out/2026-07-07_greenlens_leaf-drop_pack/greenlens_leaf_drop_slide_05.png differ diff --git a/social_out/2026-07-07_greenlens_leaf-drop_pack/greenlens_social_pack_2026-07-07.txt b/social_out/2026-07-07_greenlens_leaf-drop_pack/greenlens_social_pack_2026-07-07.txt new file mode 100644 index 0000000..4da25c8 --- /dev/null +++ b/social_out/2026-07-07_greenlens_leaf-drop_pack/greenlens_social_pack_2026-07-07.txt @@ -0,0 +1,53 @@ +GreenLens Social Pack – 2026-07-07 +Topic: Why your plant keeps dropping leaves +CTA variant tested: hard/soft hybrid — "Scan your plant" + domain. +Format experiment: TikTok/Instagram 3:4 carousel, Facebook landscape key visual, X 2-image educational post. + +TikTok / Instagram Carousel +Title: Why your plant keeps dropping leaves +Caption: Leaves dropping usually means the plant is reacting to a change. Start with the basics: water, light, and a quick leaf check before you add more fertilizer or repot. +Hashtags: #PlantCare #Houseplants #GreenLens #PlantTips +Images: +MEDIA:C:\Users\timo\Documents\greenlens\GreenLens\social_out\2026-07-07_greenlens_leaf-drop_pack\greenlens_leaf_drop_slide_01.png +MEDIA:C:\Users\timo\Documents\greenlens\GreenLens\social_out\2026-07-07_greenlens_leaf-drop_pack\greenlens_leaf_drop_slide_02.png +MEDIA:C:\Users\timo\Documents\greenlens\GreenLens\social_out\2026-07-07_greenlens_leaf-drop_pack\greenlens_leaf_drop_slide_03.png +MEDIA:C:\Users\timo\Documents\greenlens\GreenLens\social_out\2026-07-07_greenlens_leaf-drop_pack\greenlens_leaf_drop_slide_04.png +MEDIA:C:\Users\timo\Documents\greenlens\GreenLens\social_out\2026-07-07_greenlens_leaf-drop_pack\greenlens_leaf_drop_slide_05.png +Format rationale: Save-worthy educational 3:4 carousel with one clear idea per slide and a soft final CTA. + +Facebook +Title: Why your plant keeps dropping leaves +Caption: If leaves start dropping, don’t jump straight to fertilizer. Check whether watering changed, whether the plant is getting harsh direct sun, and whether the undersides of leaves show early pest signs. +Hashtags: #PlantCare #Houseplants #GreenLens +Image: +MEDIA:C:\Users\timo\Documents\greenlens\GreenLens\social_out\2026-07-07_greenlens_leaf-drop_pack\greenlens_leaf_drop_facebook_key_visual.png +Format rationale: Landscape key visual works better for feed readability and link/context posts. + +X / Twitter +Post copy: Dropping leaves usually means your plant is reacting to stress — often water changes, harsh light, or early pests. + +Quick check: +1. Soil moisture +2. Light changes +3. Underside of leaves + +Don’t fix everything at once. Change one thing, then observe. +Hashtags: #PlantCare #Houseplants +Images for X: C:\Users\timo\Documents\greenlens\GreenLens\social_out\2026-07-07_greenlens_leaf-drop_pack\greenlens_leaf_drop_slide_01.png, C:\Users\timo\Documents\greenlens\GreenLens\social_out\2026-07-07_greenlens_leaf-drop_pack\greenlens_leaf_drop_slide_04.png +Format rationale: 2-image educational post to vary away from text-only while staying concise. + +A/B-test hint +Alternative hook: "Leaf drop? Change one thing first" +Test first: current hook, because it names the symptom directly and should attract beginner plant owners. + +Measurement criteria +- Saves on Instagram/TikTok +- Comments with plant symptoms +- Profile clicks +- Website clicks to greenlenspro.com + +Asset map +- Instagram/TikTok carousel: slides 01–05 +- Facebook: greenlens_leaf_drop_facebook_key_visual.png +- X/Twitter: slide 01 + slide 04 +- Internal preview: greenlens_leaf_drop_contact_sheet.png diff --git a/social_out/2026-07-08_greenlens_office-plants_pack/ffmpeg_concat.txt b/social_out/2026-07-08_greenlens_office-plants_pack/ffmpeg_concat.txt new file mode 100644 index 0000000..f2a5e1a --- /dev/null +++ b/social_out/2026-07-08_greenlens_office-plants_pack/ffmpeg_concat.txt @@ -0,0 +1,11 @@ +file 'C:/Users/timo/Documents/greenlens/GreenLens/social_out/2026-07-08_greenlens_office-plants_pack/video_frames/frame_01.png' +duration 1.6 +file 'C:/Users/timo/Documents/greenlens/GreenLens/social_out/2026-07-08_greenlens_office-plants_pack/video_frames/frame_02.png' +duration 1.6 +file 'C:/Users/timo/Documents/greenlens/GreenLens/social_out/2026-07-08_greenlens_office-plants_pack/video_frames/frame_03.png' +duration 1.6 +file 'C:/Users/timo/Documents/greenlens/GreenLens/social_out/2026-07-08_greenlens_office-plants_pack/video_frames/frame_04.png' +duration 1.6 +file 'C:/Users/timo/Documents/greenlens/GreenLens/social_out/2026-07-08_greenlens_office-plants_pack/video_frames/frame_05.png' +duration 1.6 +file 'C:/Users/timo/Documents/greenlens/GreenLens/social_out/2026-07-08_greenlens_office-plants_pack/video_frames/frame_05.png' diff --git a/social_out/2026-07-08_greenlens_office-plants_pack/greenlens_office_plants_contact_sheet.png b/social_out/2026-07-08_greenlens_office-plants_pack/greenlens_office_plants_contact_sheet.png new file mode 100644 index 0000000..f0be643 Binary files /dev/null and b/social_out/2026-07-08_greenlens_office-plants_pack/greenlens_office_plants_contact_sheet.png differ diff --git a/social_out/2026-07-08_greenlens_office-plants_pack/greenlens_office_plants_facebook_key_visual.png b/social_out/2026-07-08_greenlens_office-plants_pack/greenlens_office_plants_facebook_key_visual.png new file mode 100644 index 0000000..3129846 Binary files /dev/null and b/social_out/2026-07-08_greenlens_office-plants_pack/greenlens_office_plants_facebook_key_visual.png differ diff --git a/social_out/2026-07-08_greenlens_office-plants_pack/greenlens_office_plants_slide_01_3x4.png b/social_out/2026-07-08_greenlens_office-plants_pack/greenlens_office_plants_slide_01_3x4.png new file mode 100644 index 0000000..79a6dbd Binary files /dev/null and b/social_out/2026-07-08_greenlens_office-plants_pack/greenlens_office_plants_slide_01_3x4.png differ diff --git a/social_out/2026-07-08_greenlens_office-plants_pack/greenlens_office_plants_slide_02_3x4.png b/social_out/2026-07-08_greenlens_office-plants_pack/greenlens_office_plants_slide_02_3x4.png new file mode 100644 index 0000000..b3506f3 Binary files /dev/null and b/social_out/2026-07-08_greenlens_office-plants_pack/greenlens_office_plants_slide_02_3x4.png differ diff --git a/social_out/2026-07-08_greenlens_office-plants_pack/greenlens_office_plants_slide_03_3x4.png b/social_out/2026-07-08_greenlens_office-plants_pack/greenlens_office_plants_slide_03_3x4.png new file mode 100644 index 0000000..a3040a2 Binary files /dev/null and b/social_out/2026-07-08_greenlens_office-plants_pack/greenlens_office_plants_slide_03_3x4.png differ diff --git a/social_out/2026-07-08_greenlens_office-plants_pack/greenlens_office_plants_slide_04_3x4.png b/social_out/2026-07-08_greenlens_office-plants_pack/greenlens_office_plants_slide_04_3x4.png new file mode 100644 index 0000000..8b267a1 Binary files /dev/null and b/social_out/2026-07-08_greenlens_office-plants_pack/greenlens_office_plants_slide_04_3x4.png differ diff --git a/social_out/2026-07-08_greenlens_office-plants_pack/greenlens_office_plants_slide_05_3x4.png b/social_out/2026-07-08_greenlens_office-plants_pack/greenlens_office_plants_slide_05_3x4.png new file mode 100644 index 0000000..a0688ba Binary files /dev/null and b/social_out/2026-07-08_greenlens_office-plants_pack/greenlens_office_plants_slide_05_3x4.png differ diff --git a/social_out/2026-07-08_greenlens_office-plants_pack/greenlens_office_plants_slideshow_video.mp4 b/social_out/2026-07-08_greenlens_office-plants_pack/greenlens_office_plants_slideshow_video.mp4 new file mode 100644 index 0000000..987a168 Binary files /dev/null and b/social_out/2026-07-08_greenlens_office-plants_pack/greenlens_office_plants_slideshow_video.mp4 differ diff --git a/social_out/2026-07-08_greenlens_office-plants_pack/greenlens_social_pack_2026-07-08.txt b/social_out/2026-07-08_greenlens_office-plants_pack/greenlens_social_pack_2026-07-08.txt new file mode 100644 index 0000000..e799ad9 --- /dev/null +++ b/social_out/2026-07-08_greenlens_office-plants_pack/greenlens_social_pack_2026-07-08.txt @@ -0,0 +1,90 @@ +GreenLens Educational Social Pack - 2026-07-08 + +Thema: Pflanzen fürs Büro / low-drama desk plants +A/B-Variante: Variante A = stärkerer Hook + softer CTA +Format-Test: Carousel als Hauptformat, Slideshow-Video als A/B-Variante aus denselben Slides +Posting-Status: Draft only. Kein Live-Posting ohne ausdrückliches GO von Timo. Brand-Gating: nur GreenLens Pro Accounts. + +Research-Hinweis intern: +- RHS: Zimmerpflanzen können psychologisches Wohlbefinden unterstützen; Claims sollten vorsichtig formuliert werden. +- Cummings & Waring 2020 / American Lung Association: starke Houseplants-clean-the-air-Claims sind für normale Innenräume überzogen. Deshalb kein Air-purifier-Versprechen auf Slides/Captions. + +Plattform: Instagram +Titel: 3 desk plants that handle workweeks +Caption: +Not every office plant needs daily attention. + +If your workweek gets busy, start with plants that forgive normal beginner mistakes: + +1. ZZ plant - low-drama and tolerant +2. Snake plant - likes drying out between watering +3. Peace lily - useful reminder plant, but avoid soggy soil + +Save this before your next plant shop trip. + +Hashtags: #PlantCare #Houseplants #IndoorPlants #GreenLensPro +Specs: 5-slide 3:4 carousel, 1080x1440 PNG. A/B video: 9:16 slideshow MP4 from same slides. +MEDIA:C:\Users\timo\Documents\greenlens\GreenLens\social_out\2026-07-08_greenlens_office-plants_pack\greenlens_office_plants_slide_01_3x4.png +MEDIA:C:\Users\timo\Documents\greenlens\GreenLens\social_out\2026-07-08_greenlens_office-plants_pack\greenlens_office_plants_slide_02_3x4.png +MEDIA:C:\Users\timo\Documents\greenlens\GreenLens\social_out\2026-07-08_greenlens_office-plants_pack\greenlens_office_plants_slide_03_3x4.png +MEDIA:C:\Users\timo\Documents\greenlens\GreenLens\social_out\2026-07-08_greenlens_office-plants_pack\greenlens_office_plants_slide_04_3x4.png +MEDIA:C:\Users\timo\Documents\greenlens\GreenLens\social_out\2026-07-08_greenlens_office-plants_pack\greenlens_office_plants_slide_05_3x4.png + +Plattform: TikTok +Titel: Before you buy another desk plant, check this +Caption: +Busy week? Choose low-drama first. + +These three plants are easier office picks than most trendy houseplants - especially if you forget a watering day sometimes. + +Save it for your next plant shop run. + +Hashtags: #PlantTok #HouseplantTips #PlantCare #GreenLensPro +Specs: A/B 1 = photo carousel 3:4; A/B 2 = 9:16 slideshow video from same carousel slides. +MEDIA:C:\Users\timo\Documents\greenlens\GreenLens\social_out\2026-07-08_greenlens_office-plants_pack\greenlens_office_plants_slideshow_video.mp4 + +Plattform: Facebook +Titel: 3 low-drama office plants for beginners +Caption: +A calmer desk starts with plants that match your real routine. + +ZZ plant, snake plant, and peace lily are useful beginner picks - as long as you avoid the usual mistake: watering on autopilot instead of checking the soil. + +Hashtags: #Houseplants #PlantCare #IndoorPlants #GreenLensPro +Specs: Landscape key visual 1200x675 plus optional carousel link-back. +MEDIA:C:\Users\timo\Documents\greenlens\GreenLens\social_out\2026-07-08_greenlens_office-plants_pack\greenlens_office_plants_facebook_key_visual.png + +Plattform: X/Twitter +Titel: Office plant mini-guide +Caption: +3 low-drama desk plants for busy weeks: + +1) ZZ plant - tolerates lower light + missed watering +2) Snake plant - let soil dry before watering +3) Peace lily - steady moisture, not soggy soil + +Best rule: match the plant to your real routine, not your ideal routine. + +Hashtags: #Houseplants #PlantCare +Specs: 2-image post test: Slide 1 + Slide 2. Alternative: text-only if images feel too polished. +MEDIA:C:\Users\timo\Documents\greenlens\GreenLens\social_out\2026-07-08_greenlens_office-plants_pack\greenlens_office_plants_slide_01_3x4.png +MEDIA:C:\Users\timo\Documents\greenlens\GreenLens\social_out\2026-07-08_greenlens_office-plants_pack\greenlens_office_plants_slide_02_3x4.png + +Asset Map: +- IG carousel: slides 01-05 +- TikTok carousel: slides 01-05 +- TikTok/IG Reel A/B: C:\Users\timo\Documents\greenlens\GreenLens\social_out\2026-07-08_greenlens_office-plants_pack\greenlens_office_plants_slideshow_video.mp4 +- Facebook key visual: C:\Users\timo\Documents\greenlens\GreenLens\social_out\2026-07-08_greenlens_office-plants_pack\greenlens_office_plants_facebook_key_visual.png +- X image test: slides 01-02 +- Contact sheet: C:\Users\timo\Documents\greenlens\GreenLens\social_out\2026-07-08_greenlens_office-plants_pack\greenlens_office_plants_contact_sheet.png + +A/B-Test-Hinweis: +- Zuerst testen: Carousel auf Instagram/TikTok. +- Alternative Hook: Before you buy another desk plant, check this +- CTA-Familie: soft CTA (Check plant health + greenlenspro.com) + +Measurement: +- Saves: educational fit +- Comments: which desk plant do you have? +- Profile clicks: GreenLens intent +- Website clicks: CTA slide / caption intent diff --git a/social_out/2026-07-08_greenlens_office-plants_pack/video_frames/frame_01.png b/social_out/2026-07-08_greenlens_office-plants_pack/video_frames/frame_01.png new file mode 100644 index 0000000..875e92e Binary files /dev/null and b/social_out/2026-07-08_greenlens_office-plants_pack/video_frames/frame_01.png differ diff --git a/social_out/2026-07-08_greenlens_office-plants_pack/video_frames/frame_02.png b/social_out/2026-07-08_greenlens_office-plants_pack/video_frames/frame_02.png new file mode 100644 index 0000000..d83c969 Binary files /dev/null and b/social_out/2026-07-08_greenlens_office-plants_pack/video_frames/frame_02.png differ diff --git a/social_out/2026-07-08_greenlens_office-plants_pack/video_frames/frame_03.png b/social_out/2026-07-08_greenlens_office-plants_pack/video_frames/frame_03.png new file mode 100644 index 0000000..eaccae7 Binary files /dev/null and b/social_out/2026-07-08_greenlens_office-plants_pack/video_frames/frame_03.png differ diff --git a/social_out/2026-07-08_greenlens_office-plants_pack/video_frames/frame_04.png b/social_out/2026-07-08_greenlens_office-plants_pack/video_frames/frame_04.png new file mode 100644 index 0000000..1402f5b Binary files /dev/null and b/social_out/2026-07-08_greenlens_office-plants_pack/video_frames/frame_04.png differ diff --git a/social_out/2026-07-08_greenlens_office-plants_pack/video_frames/frame_05.png b/social_out/2026-07-08_greenlens_office-plants_pack/video_frames/frame_05.png new file mode 100644 index 0000000..ed26013 Binary files /dev/null and b/social_out/2026-07-08_greenlens_office-plants_pack/video_frames/frame_05.png differ