TikTok api
31
.env
Normal file
@@ -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
|
||||||
2
app.json
@@ -2,7 +2,7 @@
|
|||||||
"expo": {
|
"expo": {
|
||||||
"name": "GreenLens",
|
"name": "GreenLens",
|
||||||
"slug": "greenlens",
|
"slug": "greenlens",
|
||||||
"version": "2.2.9",
|
"version": "2.3.0",
|
||||||
"orientation": "portrait",
|
"orientation": "portrait",
|
||||||
"icon": "./assets/icon.png",
|
"icon": "./assets/icon.png",
|
||||||
"userInterfaceStyle": "automatic",
|
"userInterfaceStyle": "automatic",
|
||||||
|
|||||||
@@ -231,8 +231,10 @@ const TypingIndicator = ({ colors }: { colors: any }) => {
|
|||||||
export default function OnboardingChatScreen() {
|
export default function OnboardingChatScreen() {
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
const posthog = useSafeAnalytics();
|
const posthog = useSafeAnalytics();
|
||||||
const { session, isDarkMode, colorPalette, language } = useApp();
|
const { session, colorPalette, language } = useApp();
|
||||||
const colors = useColors(isDarkMode, colorPalette);
|
// 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 copy = getChatCopy(language);
|
||||||
const { height } = useWindowDimensions();
|
const { height } = useWindowDimensions();
|
||||||
const compact = height < 700;
|
const compact = height < 700;
|
||||||
|
|||||||
@@ -45,6 +45,9 @@ services:
|
|||||||
DISCORD_WEBHOOK_SALES_URL: ${DISCORD_WEBHOOK_SALES_URL:-}
|
DISCORD_WEBHOOK_SALES_URL: ${DISCORD_WEBHOOK_SALES_URL:-}
|
||||||
DISCORD_WEBHOOK_DOWNLOADS_URL: ${DISCORD_WEBHOOK_DOWNLOADS_URL:-}
|
DISCORD_WEBHOOK_DOWNLOADS_URL: ${DISCORD_WEBHOOK_DOWNLOADS_URL:-}
|
||||||
JWT_SECRET: ${JWT_SECRET:?JWT_SECRET is required}
|
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:-}
|
PLANT_IMPORT_ADMIN_KEY: ${PLANT_IMPORT_ADMIN_KEY:-}
|
||||||
depends_on:
|
depends_on:
|
||||||
postgres:
|
postgres:
|
||||||
|
|||||||
4
package-lock.json
generated
@@ -1,12 +1,12 @@
|
|||||||
{
|
{
|
||||||
"name": "greenlens",
|
"name": "greenlens",
|
||||||
"version": "2.2.9",
|
"version": "2.3.0",
|
||||||
"lockfileVersion": 3,
|
"lockfileVersion": 3,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "greenlens",
|
"name": "greenlens",
|
||||||
"version": "2.2.9",
|
"version": "2.3.0",
|
||||||
"hasInstallScript": true,
|
"hasInstallScript": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@expo/vector-icons": "^15.0.3",
|
"@expo/vector-icons": "^15.0.3",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "greenlens",
|
"name": "greenlens",
|
||||||
"version": "2.2.9",
|
"version": "2.3.0",
|
||||||
"main": "expo-router/entry",
|
"main": "expo-router/entry",
|
||||||
"private": true,
|
"private": true,
|
||||||
"scripts": {
|
"scripts": {
|
||||||
|
|||||||
|
After Width: | Height: | Size: 548 KiB |
|
After Width: | Height: | Size: 920 KiB |
|
After Width: | Height: | Size: 1.4 MiB |
|
After Width: | Height: | Size: 1005 KiB |
|
After Width: | Height: | Size: 1.2 MiB |
|
After Width: | Height: | Size: 1.1 MiB |
|
After Width: | Height: | Size: 1.2 MiB |
@@ -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
|
||||||
@@ -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'
|
||||||
|
After Width: | Height: | Size: 409 KiB |
|
After Width: | Height: | Size: 388 KiB |
|
After Width: | Height: | Size: 900 KiB |
|
After Width: | Height: | Size: 623 KiB |
|
After Width: | Height: | Size: 855 KiB |
|
After Width: | Height: | Size: 906 KiB |
|
After Width: | Height: | Size: 1.3 MiB |
@@ -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
|
||||||
|
After Width: | Height: | Size: 907 KiB |
|
After Width: | Height: | Size: 630 KiB |
|
After Width: | Height: | Size: 864 KiB |
|
After Width: | Height: | Size: 914 KiB |
|
After Width: | Height: | Size: 1.3 MiB |