Splits a CSV ledger of shared costs for a trip, flat or event - equal, shares, exact, percent and itemized bills with tax/tip pro rata, 'all except' exclusions, several payers, refunds, repayments and multiple currencies at agreed rates - in cents, then finds the provably fewest settle-up transfers (exact zero-sum subgroup search). Returns balances, a per-person audit and a chat message. Includes a stdlib Python planner with --self-test. 来源:https://prompts.chat/prompts/cmvw36uun0001jw07xu4uz2md
---
name: shared-expense-bill-splitter-and-settle-up-planner
description: Splits a CSV ledger of shared costs for a trip, flat or event - equal, shares, exact, percent and itemized bills with tax/tip pro rata, 'all except' exclusions, several payers, refunds, repayments and multiple currencies at agreed rates - in cents, then finds the provably fewest settle-up transfers (exact zero-sum subgroup search). Returns balances, a per-person audit and a chat message. Includes a stdlib Python planner with --self-test.
---
# Shared Expense Bill Splitter and Settle-Up Planner
You turn a messy list of shared spending into a fair, checkable split and the shortest possible list of payments. You keep the ledger as a CSV the group can edit in any spreadsheet, apply the split rule each line really needs (who was there, who ordered what, who stayed fewer nights), convert currencies at rates the group agrees on, and settle everyone with the fewest transfers. Every cent is accounted for, and anyone can trace their own number line by line.
## Files in this skill
- `scripts/settle_up.py` - reads the CSV ledger, splits each line in integer cents (largest-remainder rounding), computes paid/share/net per person, and searches all zero-sum subgroups to find the minimum number of transfers (exact up to 18 people with a balance, greedy beyond) (Python 3.8+ standard library only)
- `references/split-methods.md` - the CSV format, which split to use for which cost, itemized bills with tax and tip, exclusions, payers, refunds and repayments
- `references/settle-up-and-currency.md` - why the minimum can be below "people - 1", how the search works, rounding, exchange rates and card fees, payment etiquette
- `templates/settle-up-summary.md` - the summary to hand back and paste into the group chat
- `examples/lisbon-trip.csv` - 5 friends, 11 lines: shares by nights, an excluded person, an itemized dinner, a USD booking, premium seats, two payers, a refund, GBP snacks and a repayment already made
- `examples/lisbon-settle-output.md` - the real output of the planner on that ledger
- `examples/flat-october.csv` - 6 flatmates where the minimum (4 transfers) beats paying largest debt to largest credit (5)
## Workflow
### 1. Collect the ledger
Ask for every shared cost with: what, who paid (and how much each, if several people paid), the amount and currency, and who it was for. Ask the questions that change the split: Did anyone arrive late or leave early? Did anyone skip a meal or an activity? Was a dinner shared or ordered individually? Has anyone already paid someone back? Agree the base currency and the rates (one rate per currency for the whole trip unless the group wants card statement rates). Write it as the CSV in `references/split-methods.md`, with `# people:` so typos in names are caught.
### 2. Run the planner
```
python3 scripts/settle_up.py examples/lisbon-trip.csv
python3 scripts/settle_up.py flat.csv --base GBP --rates EUR=0.86 --detail Ben
python3 scripts/settle_up.py ledger.csv --json
python3 scripts/settle_up.py --self-test
```
Exit 0 = plan printed (read the Warnings section), 2 = the ledger has an error (sums that do not match, missing rate, unknown split or name) - fix the line it names. If you cannot run code, follow the same steps by hand: convert each line to base cents, split, sum paid minus share per person, then match debtors to creditors, looking first for people or small groups whose balances cancel exactly.
### 3. Check the result with the group
- The check line must read `nets add up to 0.00`; paid and shares must be equal.
- Read the balances aloud in plain words ("Ana paid 990.00, her share is 377.31 and Eli already gave her 100.00, so she gets back 512.69").
- Point out lines that drive the result and are easy to dispute (shares by nights, itemized meals, a refund, a repayment), and offer `--detail <name>` for anyone who wants their own breakdown.
- If someone prefers to pay someone else (or cannot pay a person directly), rerun after adding the agreed transfer as a `payment` line; the plan recomputes the rest.
### 4. Deliver
Fill `templates/settle-up-summary.md`: totals, the balances table, the numbered transfers, the assumptions (rates, who was excluded where, how tax/tip was spread), and the short group-chat message. Suggest marking each transfer as done by adding it to the ledger as a `payment` line, so a second run shows everyone at 0.00.
## Example result
On `examples/lisbon-trip.csv` (5 people, 1,583.07 EUR spent) Ana paid the apartment and the fado tickets and gets back 512.69 EUR; the plan is 4 transfers: Ben pays Ana 243.17, Dara pays Ana 140.94, Eli pays Ana 128.58 and Eli pays Cem 0.85 (Eli's earlier 100.00 repayment is already counted). On `examples/flat-october.csv` Bo and Finn cancel each other out, so 6 flatmates settle in 4 transfers where paying largest debt to largest credit would take 5.
## Rules
- Never invent amounts, rates or who took part; ask, or mark the line as an assumption in the summary.
- Use one agreed rate per currency and show it; do not mix live rates into a finished split.
- Keep all arithmetic in cents and show where rounding cents went (largest remainder, ties to the person listed first).
- Do not judge spending; flag only lines that look like duplicates, typos or missing participants.
- A repayment is a `payment` line, never a negative expense; a refund is a negative expense shared by the same people as the original cost.
- Present the plan as a proposal; the group can swap who pays whom as long as each person's net is unchanged.
FILE:references/split-methods.md
# Split methods and CSV format
## Columns
`date,description,paid_by,amount,currency,split,participants,details` - header row required; any spreadsheet can export it. Optional comment lines before the header:
```
# people: Ana, Ben, Cem, Dara, Eli (strict list: a misspelt name is an error)
# base: EUR
# rates: USD=0.92, GBP=1.16 (1 USD = 0.92 EUR)
```
Without `# people:` everyone named anywhere in the file is a member and `all` means all of them; names are matched case-insensitively.
## Choosing a split
| Cost | Split | Example `participants` / `details` |
|---|---|---|
| Groceries, taxi, fuel, shared tickets | `equal` | `all`, `Ana;Ben`, `all-Eli` |
| Accommodation when people stayed different nights, rooms of different size | `shares` | `Ana:3;Ben:3;Dara:2` (nights or room weights) |
| Tickets with different prices, a known per-person amount | `exact` | `Ana:30;Ben:45` (others in participants split the rest equally) |
| Agreed percentages (rent by income, wine for those who drank) | `percent` | `Ana:25;Ben:25;Dara:50` (must total 100) |
| Restaurant bill where people ordered separately | `itemized` | `Ana:31;Ben:28.50;shared:42` |
| Someone already paid someone back | `payment` | participants = the one recipient |
## Itemized bills
- `details` lists each person's items before tax, service and tip; `shared` is the sum of starters, bottles or anything everyone shared (split equally among `participants`).
- `amount` is the final bill. The difference (amount - items) is tax, service and tip, spread in proportion to what each person had, so a person who ordered more pays more tip. The output shows it as `+17.3% tax/tip`.
- If the items add up to more than the bill (a discount or a typo), the planner stops; enter the discount by lowering the item prices it applied to.
## Exclusions and partial participation
- `all-Eli` or `all except Eli` = everyone but Eli; chain several: `all-Bo-Finn`.
- For people present part of the time, use `shares` with nights or days instead of excluding them.
- A child or a guest paid for by one member: list them under the member's name (`shares` weight 1.5) or add them to `# people:` and settle with their parent.
## Payers
- One payer: `Ana`. Several payers on one bill: `Ben:40;Cem:20` (amounts in the row currency, must add up to `amount`).
- A card shared by a couple: treat the couple as one person or split the payer amount.
## Refunds, deposits, repayments
- Refund received after a cancellation: negative `amount`, `paid_by` = who received the money, same participants as the original cost.
- Deposit returned by a landlord: negative `amount` split the same way as the deposit.
- Money handed over between members: `payment` (from `paid_by` to the one person in `participants`). Record settle-up transfers the same way; rerunning then shows who is still open.
## Common mistakes the planner catches
- Exact amounts or percentages that do not add up, payer amounts that differ from the bill, items over the bill.
- A currency without a rate, an unknown split word, a misspelt name when `# people:` is set.
- Two identical lines (same date, description, amount and payer) - reported as a warning, not removed.
- Zero amounts - skipped with a warning.
FILE:references/settle-up-and-currency.md
# Settle-up and currency
## Net balance
For every person: `net = paid + payments sent - share - payments received`. Positive = gets money back, negative = owes. The nets always add up to exactly 0.00 because every line is split in integer cents that sum to the line total.
## Why "fewest transfers" can be less than people - 1
- Any group with k people who have a balance can settle in at most k - 1 transfers (each transfer clears at least one person).
- If the group splits into subgroups whose balances each add up to zero, each subgroup settles on its own: with g such subgroups the minimum is k - g. Example: Bo +300 and Finn -300 cancel, so 6 flatmates need 4 transfers, not 5.
- Paying the largest debt to the largest credit (the usual app approach) does not look for these subgroups and can take more transfers.
- Finding the best split into zero-sum subgroups is a hard problem in general; the planner solves it exactly for up to 18 people with a non-zero balance (dynamic programming over subsets, under a second) and falls back to the greedy plan above that, saying so.
- Within each subgroup the plan pays largest debt to largest credit, which uses exactly (subgroup size - 1) transfers.
- Several plans can have the same minimum count; any of them is fair, because each person's total in or out is fixed by their net.
## Rounding
- Each line is converted to base cents once (`amount x rate`, rounded half up), then split with the largest-remainder method: everyone gets the rounded-down amount, and the leftover cents go to the largest fractions, ties to the person listed first in `# people:`.
- Over a whole trip this moves at most a few cents per person; say so if someone asks why 10.00 / 3 is 3.34 for one person.
## Exchange rates
- Agree one rate per currency before splitting: the rate on the day most costs were paid, the average of the trip, or the rate on the payer's card statement (which includes the bank's markup).
- If the payer's card charged a foreign transaction fee, either include it in the amount (the group shares it) or leave it out (the payer absorbs it) - decide once for the whole trip.
- Enter amounts in the currency actually paid and let the planner convert; do not pre-convert some lines by hand.
- Settle in the base currency. If someone pays in another currency, convert the transfer at the same agreed rate and record it as a `payment` line in that currency.
## Payment etiquette
- Send the group-chat message with the transfers and a link to the ledger; give people a day or two to dispute a line before paying.
- Small transfers (under ~2 EUR/USD) can be waived or rolled into the next shared cost if both people agree - record that as a `payment` line so the ledger stays exact.
- When everyone has paid, add each transfer as a `payment` line and rerun: every net should be 0.00.
FILE:templates/settle-up-summary.md
# Settle-up: <trip / flat / event>, <dates>
**Group:** <Ana, Ben, Cem, Dara, Eli> **Base currency:** <EUR> **Total spent:** <1,583.07 EUR> over <11> lines
**Rates agreed:** <1 USD = 0.92 EUR, 1 GBP = 1.16 EUR (trip average)>
## Balances
| Person | Paid | Fair share | Already sent / received | Net |
|---|---|---|---|---|
| <Ana> | <990.00> | <377.31> | <received 100.00> | <+512.69 gets back> |
| <Ben> | <64.00> | <307.17> | <-> | <-243.17 owes> |
## Transfers (<n>, the minimum possible)
1. <Ben pays Ana 243.17 EUR>
2. <Dara pays Ana 140.94 EUR>
3. <...>
## How lines were split
- <Apartment: by nights, Dara and Eli 2 of 3 nights>
- <Airport taxi: everyone except Eli (came by train)>
- <Dinner: itemized, 17.3% tax and tip spread by what each person ordered; starters 42.00 shared>
- <Palace tickets refund: back to Ben and Cem, who paid for them>
- <Eli's 100.00 to Ana is already counted>
## Assumptions and open points
- <rates above; card fees not included>
- <check line 5 (surf lesson): was Ben in?>
## Group chat message
```
Settle-up (<EUR>, <11> lines, rates: <USD 0.92, GBP 1.16>):
- <Ben -> Ana: 243.17 EUR>
- <Dara -> Ana: 140.94 EUR>
Full table: <link to the sheet>. Shout within 2 days if a line is wrong.
```
**When paid:** add each transfer as a `payment` line and rerun - every net should read 0.00.
FILE:examples/lisbon-trip.csv
# people: Ana, Ben, Cem, Dara, Eli
# base: EUR
# rates: USD=0.92, GBP=1.16
date,description,paid_by,amount,currency,split,participants,details
2026-10-02,Apartment 3 nights (Dara and Eli 2 nights),Ana,840.00,EUR,shares,all,Ana:3;Ben:3;Cem:3;Dara:2;Eli:2
2026-10-02,Airport taxi (Eli came by train),Ben,48.00,EUR,equal,all-Eli,
2026-10-02,Groceries for the flat,Eli,63.75,EUR,equal,all,
2026-10-03,Dinner at Taberna do Mar,Cem,212.40,EUR,itemized,all,Ana:31;Ben:28.50;Cem:24;Dara:36;Eli:19.50;shared:42
2026-10-03,Surf lesson (booked on a US site),Dara,180.00,USD,equal,Ana;Dara;Eli,
2026-10-03,Fado tickets (premium seats for Dara and Eli),Ana,150.00,EUR,exact,all-Cem,Ana:30;Ben:30;Dara:45;Eli:45
2026-10-04,Train to Sintra,Ben:40;Cem:20,60.00,EUR,equal,all,
2026-10-04,Wine for the flat,Dara,36.00,EUR,percent,,Ana:25;Ben:25;Dara:50
2026-10-04,Palace tickets refunded (rain),Ben,-24.00,EUR,equal,Ben;Cem,
2026-10-05,Snacks at the London layover,Cem,27.00,GBP,equal,all,
2026-10-05,Eli paid Ana back for the apartment,Eli,100.00,EUR,payment,Ana,
FILE:examples/lisbon-settle-output.md
# Settle-up plan
Base currency: EUR People: 5 Lines: 11 Total spent: 1,583.07 EUR
Rates used: 1 GBP = 1.16 EUR, 1 USD = 0.92 EUR
## Expenses
| # | Date | What | Paid by | Amount | In EUR | Split | Among |
|---|---|---|---|---|---|---|---|
| 1 | 2026-10-02 | Apartment 3 nights (Dara and Eli 2 nights) | Ana | 840.00 EUR | 840.00 | shares | all |
| 2 | 2026-10-02 | Airport taxi (Eli came by train) | Ben | 48.00 EUR | 48.00 | equal | Ana, Ben, Cem, Dara |
| 3 | 2026-10-02 | Groceries for the flat | Eli | 63.75 EUR | 63.75 | equal | all |
| 4 | 2026-10-03 | Dinner at Taberna do Mar | Cem | 212.40 EUR | 212.40 | itemized (+17.3% tax/tip) | all |
| 5 | 2026-10-03 | Surf lesson (booked on a US site) | Dara | 180.00 USD | 165.60 | equal | Ana, Dara, Eli |
| 6 | 2026-10-03 | Fado tickets (premium seats for Dara and Eli) | Ana | 150.00 EUR | 150.00 | exact | Ana, Ben, Dara, Eli |
| 7 | 2026-10-04 | Train to Sintra | Ben 40.00, Cem 20.00 | 60.00 EUR | 60.00 | equal | all |
| 8 | 2026-10-04 | Wine for the flat | Dara | 36.00 EUR | 36.00 | percent | Ana, Ben, Dara |
| 9 | 2026-10-04 | Palace tickets refunded (rain) | Ben | -24.00 EUR | -24.00 | equal | Ben, Cem |
| 10 | 2026-10-05 | Snacks at the London layover | Cem | 27.00 GBP | 31.32 | equal | all |
| 11 | 2026-10-05 | Eli paid Ana back for the apartment | Eli | 100.00 EUR | 100.00 | payment | to Ana |
## Balances
| Person | Paid | Share | Sent | Received | Net |
|---|---|---|---|---|---|
| Ana | 990.00 | 377.31 | 0.00 | 100.00 | 512.69 (gets back) |
| Ben | 64.00 | 307.17 | 0.00 | 0.00 | -243.17 (owes) |
| Cem | 263.72 | 262.87 | 0.00 | 0.00 | 0.85 (gets back) |
| Dara | 201.60 | 342.54 | 0.00 | 0.00 | -140.94 (owes) |
| Eli | 63.75 | 293.18 | 100.00 | 0.00 | -129.43 (owes) |
Check: nets add up to 0.00 (paid 1,583.07 = shares 1,583.07).
## Transfers (4)
1. Ben pays Ana **243.17 EUR**
2. Dara pays Ana **140.94 EUR**
3. Eli pays Ana **128.58 EUR**
4. Eli pays Cem **0.85 EUR**
Minimum possible: 4 transfers for 5 people with a balance (no smaller subgroup evens out on its own).
## Message for the group chat
```
Settle-up (EUR, 11 lines, rates: GBP 1.16, USD 0.92):
- Ben -> Ana: 243.17 EUR
- Dara -> Ana: 140.94 EUR
- Eli -> Ana: 128.58 EUR
- Eli -> Cem: 0.85 EUR
Full table in the shared sheet. Shout within 2 days if a line is wrong.
```
FILE:examples/flat-october.csv
# people: Asha, Bo, Chen, Dev, Ema, Finn
# base: EUR
date,description,paid_by,amount,currency,split,participants,details
2026-10-01,Festival tickets for Bo and Finn,Bo,600,EUR,exact,Bo;Finn,Bo:300;Finn:300
2026-10-31,October groceries (Bo and Finn on tour),Asha,800,EUR,equal,all-Bo-Finn,
2026-10-31,Electricity Sep-Oct (Bo and Finn on tour),Chen,600,EUR,equal,all-Bo-Finn,
2026-10-20,Second-hand sofa (Dev and Ema's part),Asha,250,EUR,exact,Dev;Ema,Dev:150;Ema:100
FILE:scripts/settle_up.py
#!/usr/bin/env python3
"""Shared expense bill splitter and settle-up planner (Python 3.8+ standard library only).
Reads a CSV ledger of shared costs (a trip, a flat, an event), splits every line in
integer cents, and finds the SMALLEST possible number of transfers that settles the group
(exact search over zero-sum subgroups, not just "at most people - 1").
CSV columns (header row required, extra columns ignored):
date,description,paid_by,amount,currency,split,participants,details
paid_by Ana one payer
Ana:40;Ben:20 several payers (amounts in the row currency, must add up)
amount total in the row currency; negative = refund received by paid_by
currency blank = base currency
split equal | shares | exact | percent | itemized | payment
participants all | Ana;Ben;Cem | all-Eli (everyone except Eli) | blank = names in details
details shares: Ana:3;Ben:2 (people in participants but not listed get 1)
exact: Ana:30;Ben:45 (rest, if any, split equally among the other participants)
percent: Ana:50;Ben:30;Cem:20 (must total 100)
itemized: Ana:18;Ben:22.50;shared:12 (item prices before tax/tip; "shared"
items are split equally; amount - items = tax/service/tip, split in
proportion to what each person ordered)
payment: (none) paid_by gave `amount` to the one person in participants
Comment lines at the top set the group and the rates (or use the CLI flags):
# people: Ana, Ben, Cem
# base: EUR
# rates: USD=0.92, GBP=1.16 (1 unit of that currency = rate units of base)
Usage:
python3 settle_up.py ledger.csv [--base EUR] [--rates USD=0.92,GBP=1.16] [--people Ana,Ben]
[--detail Ana] [--json]
python3 settle_up.py --self-test
Exit codes: 0 = settled plan printed, 2 = bad input (unknown split, sums that do not
match, missing exchange rate, unknown person in a strict list).
"""
import argparse
import csv
import io
import json
import re
import sys
from decimal import Decimal, ROUND_HALF_UP, InvalidOperation
MAX_EXACT = 18 # people with a non-zero balance for the exact minimum search (2^18 states)
SPLITS = ("equal", "shares", "exact", "percent", "itemized", "payment")
class LedgerError(ValueError):
pass
def dec(s, what):
try:
return Decimal(str(s).replace(",", "").strip())
except (InvalidOperation, AttributeError):
raise LedgerError("%s: %r is not a number" % (what, s))
def to_cents(amount):
return int((amount * 100).quantize(Decimal("1"), rounding=ROUND_HALF_UP))
def fmt(cents, cur=""):
sign = "-" if cents < 0 else ""
c = abs(cents)
s = "%s%d.%02d" % (sign, c // 100, c % 100)
s = re.sub(r"(\d)(?=(\d{3})+\.)", r"\1,", s)
return (s + " " + cur).strip()
def allocate(total, weights, order):
"""Split integer `total` cents in proportion to `weights` (dict name -> Decimal >= 0).
Largest remainder method; ties go to the earlier name in `order`. Sum is exact."""
names = [n for n in order if n in weights]
wsum = sum(weights[n] for n in names)
if wsum <= 0:
raise LedgerError("weights add up to zero")
sign = -1 if total < 0 else 1
t = abs(total)
raw = {n: Decimal(t) * weights[n] / wsum for n in names}
base = {n: int(raw[n]) for n in names}
left = t - sum(base.values())
rank = sorted(names, key=lambda n: (-(raw[n] - base[n]), order.index(n)))
for n in rank[:left]:
base[n] += 1
return {n: sign * v for n, v in base.items() if v}
def parse_pairs(text, what):
out = {}
for part in [p for p in re.split(r"[;|]", text or "") if p.strip()]:
if ":" not in part:
raise LedgerError("%s: %r should look like Name:value" % (what, part.strip()))
k, v = part.split(":", 1)
k = k.strip()
out[k] = out.get(k, Decimal(0)) + dec(v, what)
return out
class Ledger:
def __init__(self, text, base=None, rates=None, people=None):
self.warnings = []
self.base = base
self.rates = {}
self.people = []
self._canon = {}
header_people = None
body = []
for line in text.splitlines():
s = line.strip()
if s.startswith("#"):
m = re.match(r"#\s*(people|base|rates?)\s*:\s*(.*)$", s, re.I)
if m:
key, val = m.group(1).lower(), m.group(2)
if key == "people":
header_people = [p.strip() for p in re.split(r"[,;]", val) if p.strip()]
elif key == "base" and not self.base:
self.base = val.strip().upper()
elif key.startswith("rate"):
self._add_rates(val)
continue
body.append(line)
self.base = (self.base or "EUR").upper()
if rates:
self._add_rates(rates)
self.rates[self.base] = Decimal(1)
for p in (people or header_people or []):
self._person(p, declare=True)
self.strict = bool(people or header_people)
rows = list(csv.DictReader(io.StringIO("\n".join(body))))
if not rows:
raise LedgerError("no expense rows found (need a header row and at least one line)")
need = {"description", "paid_by", "amount", "split"}
cols = {c.strip().lower() for c in rows[0].keys() if c}
if not need <= cols:
raise LedgerError("missing CSV columns: %s" % ", ".join(sorted(need - cols)))
self.rows = []
for r in rows:
r = {(k or "").strip().lower(): (v or "").strip() for k, v in r.items()}
if not any(r.values()):
continue
self.rows.append(r)
# first pass: learn every name when no people list was given
if not self.strict:
for r in self.rows:
for p in self._names_in(r):
self._person(p, declare=True)
self.lines = [self._line(n, r) for n, r in enumerate(self.rows, 1)]
self._check_duplicates()
# -- people and rates
def _add_rates(self, text):
for part in re.split(r"[,;]", text):
if not part.strip():
continue
if "=" not in part:
raise LedgerError("rate %r should look like USD=0.92" % part.strip())
k, v = part.split("=", 1)
r = dec(v, "rate " + k.strip())
if r <= 0:
raise LedgerError("rate for %s must be positive" % k.strip())
self.rates[k.strip().upper()] = r
def _person(self, name, declare=False):
key = name.strip().lower()
if not key:
raise LedgerError("empty person name")
if key in self._canon:
canon = self._canon[key]
if canon != name.strip() and declare:
self.warnings.append("'%s' and '%s' treated as the same person" % (canon, name.strip()))
return canon
if not declare:
raise LedgerError("unknown person %r (not in the people list)" % name.strip())
self._canon[key] = name.strip()
self.people.append(name.strip())
return name.strip()
def _names_in(self, r):
names = []
pb = r.get("paid_by", "")
names += list(parse_pairs(pb, "paid_by").keys()) if ":" in pb else [pb]
part = r.get("participants", "")
if part and not part.lower().startswith("all"):
names += [p for p in re.split(r"[;|]", part) if p.strip()]
if r.get("split", "").lower() != "payment":
names += [k for k in parse_pairs(r.get("details", ""), "details") if k.lower() != "shared"]
return [n for n in names if n.strip()]
def _participants(self, r, ln):
part = r.get("participants", "").strip()
if not part:
return None
if part.lower().startswith("all"):
rest = part[3:].strip()
excl = []
if rest:
rest = re.sub(r"^(except|but|without)\s+", "", rest.lstrip("-").strip(), flags=re.I)
excl = [self._person(x) for x in re.split(r"[-;|,]", rest) if x.strip()]
return [p for p in self.people if p not in excl]
return [self._person(p) for p in re.split(r"[;|]", part) if p.strip()]
# -- one CSV line -> paid / share in base cents
def _line(self, ln, r):
desc = r.get("description") or "line %d" % ln
where = "line %d (%s)" % (ln, desc)
split = (r.get("split") or "equal").lower()
if split not in SPLITS:
raise LedgerError("%s: unknown split %r (use %s)" % (where, split, ", ".join(SPLITS)))
cur = (r.get("currency") or self.base).upper()
if cur not in self.rates:
raise LedgerError("%s: no exchange rate for %s (add '# rates: %s=...' or --rates)" % (where, cur, cur))
amount = dec(r.get("amount"), where + " amount")
if amount == 0:
self.warnings.append("%s has amount 0 and was skipped" % where)
total = to_cents(amount * self.rates[cur])
# payers
pb = r.get("paid_by", "")
if ":" in pb:
pays = {self._person(k): v for k, v in parse_pairs(pb, where + " paid_by").items()}
if sum(pays.values()) != amount:
raise LedgerError("%s: payers add up to %s but amount is %s" % (where, sum(pays.values()), amount))
paid = allocate(total, {k: abs(v) for k, v in pays.items()}, self.people) if total else {}
if total < 0:
paid = {k: -abs(v) for k, v in paid.items()}
else:
paid = {self._person(pb): total} if total else {}
people = self._participants(r, ln)
details = parse_pairs(r.get("details", ""), where + " details") if split != "payment" else {}
share = {}
if split == "payment":
if not people or len(people) != 1:
raise LedgerError("%s: a payment needs exactly one recipient in participants" % where)
share = {people[0]: total}
elif split == "equal":
people = people or self.people
share = allocate(total, {p: Decimal(1) for p in people}, self.people)
elif split == "shares":
d = {self._person(k): v for k, v in details.items()}
people = people or list(d)
w = {p: d.get(p, Decimal(1)) for p in people}
extra = [p for p in d if p not in people]
if extra:
raise LedgerError("%s: %s in details but not in participants" % (where, ", ".join(extra)))
if any(v < 0 for v in w.values()):
raise LedgerError("%s: shares cannot be negative" % where)
share = allocate(total, w, self.people)
elif split == "percent":
d = {self._person(k): v for k, v in details.items()}
if sum(d.values()) != 100:
raise LedgerError("%s: percentages add up to %s, not 100" % (where, sum(d.values())))
people = list(d)
share = allocate(total, d, self.people)
elif split == "exact":
d = {self._person(k): v for k, v in details.items()}
people = people or list(d)
fixed = sum(d.values())
rest_people = [p for p in people if p not in d]
if fixed > abs(amount) or (fixed != abs(amount) and not rest_people):
raise LedgerError("%s: exact amounts add up to %s but the bill is %s" % (where, fixed, amount))
w = dict(d)
if rest_people:
each = (abs(amount) - fixed) / len(rest_people)
for p in rest_people:
w[p] = each
share = allocate(total, w, self.people)
elif split == "itemized":
people = people or self.people
shared = details.pop("shared", details.pop("Shared", Decimal(0)))
d = {self._person(k): v for k, v in details.items()}
items = sum(d.values()) + shared
if items > abs(amount):
raise LedgerError("%s: items add up to %s, more than the bill %s" % (where, items, amount))
per = {p: d.get(p, Decimal(0)) + (shared / len(people) if shared else 0) for p in people}
for p in d:
if p not in per:
per[p] = d[p]
if sum(per.values()) <= 0:
raise LedgerError("%s: no items to split" % where)
# tax/tip proportional to each person's items == allocate the total by item weights
share = allocate(total, per, self.people)
rec = {"n": ln, "date": r.get("date", ""), "desc": desc, "split": split, "currency": cur,
"amount": amount, "total": total, "paid": paid, "share": share,
"among": sorted(share, key=self.people.index)}
if split == "itemized":
rec["extra_pct"] = (abs(amount) - items) / items * 100 if items else Decimal(0)
if sum(paid.values()) != sum(share.values()):
raise LedgerError("%s: internal rounding error" % where) # never expected
return rec
def _check_duplicates(self):
seen = {}
for l in self.lines:
key = (l["date"], l["desc"].lower(), l["total"], tuple(sorted(l["paid"])))
if key in seen:
self.warnings.append("line %d looks like a duplicate of line %d (%s, %s)" % (l["n"], seen[key], l["desc"], fmt(l["total"], self.base)))
else:
seen[key] = l["n"]
def balances(self):
b = {p: {"paid": 0, "share": 0, "sent": 0, "received": 0} for p in self.people}
for l in self.lines:
if l["split"] == "payment":
for p, c in l["paid"].items():
b[p]["sent"] += c
for p, c in l["share"].items():
b[p]["received"] += c
else:
for p, c in l["paid"].items():
b[p]["paid"] += c
for p, c in l["share"].items():
b[p]["share"] += c
for p in b:
b[p]["net"] = b[p]["paid"] + b[p]["sent"] - b[p]["share"] - b[p]["received"]
return b
# ----------------------------------------------------------------------------- settle-up
def greedy(net, order):
"""Largest debtor pays largest creditor until everyone is even (at most k-1 transfers)."""
cred = {p: v for p, v in net.items() if v > 0}
debt = {p: -v for p, v in net.items() if v < 0}
out = []
while cred and debt:
c = max(cred, key=lambda p: (cred[p], -order.index(p)))
d = max(debt, key=lambda p: (debt[p], -order.index(p)))
x = min(cred[c], debt[d])
out.append((d, c, x))
cred[c] -= x
debt[d] -= x
if not cred[c]:
del cred[c]
if not debt[d]:
del debt[d]
return out
def minimal(net, order):
"""Fewest transfers: n - (max number of disjoint zero-sum groups). Returns (transfers, groups, exact)."""
people = [p for p in order if net.get(p)]
n = len(people)
if n == 0:
return [], [], True
if n > MAX_EXACT:
return greedy(net, order), [people], False
vals = [net[p] for p in people]
size = 1 << n
sums = [0] * size
for m in range(1, size):
low = m & -m
sums[m] = sums[m ^ low] + vals[low.bit_length() - 1]
dp = [0] * size
for m in range(1, size):
best = 0
mm = m
while mm:
low = mm & -mm
v = dp[m ^ low]
if v > best:
best = v
mm ^= low
dp[m] = best + (1 if sums[m] == 0 else 0)
# walk down, cutting a group at each zero-sum checkpoint
groups, m, last = [], size - 1, size - 1
while m:
mm, pick = m, None
target = dp[m] - (1 if sums[m] == 0 else 0)
while mm:
low = mm & -mm
if dp[m ^ low] == target:
pick = low
break
mm ^= low
m ^= pick
if sums[m] == 0:
groups.append(last ^ m)
last = m
out, named = [], []
for g in reversed(groups):
members = [people[i] for i in range(n) if g >> i & 1]
named.append(members)
out += greedy({p: net[p] for p in members}, order)
return out, named, True
# ----------------------------------------------------------------------------- output
def render(led, detail=None):
b = led.balances()
net = {p: b[p]["net"] for p in led.people}
tr, groups, exact = minimal(net, led.people)
gr = greedy(net, led.people)
B = led.base
o = ["# Settle-up plan", "",
"Base currency: %s People: %d Lines: %d Total spent: %s" % (
B, len(led.people), len(led.lines),
fmt(sum(l["total"] for l in led.lines if l["split"] != "payment"), B))]
others = sorted(c for c in led.rates if c != B)
if others:
o.append("Rates used: " + ", ".join("1 %s = %s %s" % (c, led.rates[c].normalize(), B) for c in others))
o += ["", "## Expenses", "", "| # | Date | What | Paid by | Amount | In %s | Split | Among |" % B, "|---|---|---|---|---|---|---|---|"]
for l in led.lines:
payer = ", ".join("%s %s" % (p, fmt(c)) if len(l["paid"]) > 1 else p for p, c in l["paid"].items())
among = "all" if len(l["among"]) == len(led.people) and l["split"] != "payment" else ", ".join(l["among"])
split = l["split"] + (" (+%.1f%% tax/tip)" % l["extra_pct"] if l["split"] == "itemized" else "")
if l["split"] == "payment":
among = "to " + among
o.append("| %d | %s | %s | %s | %s %s | %s | %s | %s |" % (l["n"], l["date"], l["desc"].replace("|", "/"), payer,
fmt(to_cents(l["amount"])), l["currency"], fmt(l["total"]), split, among))
o += ["", "## Balances", "", "| Person | Paid | Share | Sent | Received | Net |", "|---|---|---|---|---|---|"]
for p in led.people:
x = b[p]
state = "gets back" if x["net"] > 0 else ("owes" if x["net"] < 0 else "even")
o.append("| %s | %s | %s | %s | %s | %s (%s) |" % (p, fmt(x["paid"]), fmt(x["share"]), fmt(x["sent"]), fmt(x["received"]),
fmt(x["net"]), state))
o.append("")
o.append("Check: nets add up to %s (paid %s = shares %s)." % (fmt(sum(net.values())), fmt(sum(x["paid"] for x in b.values())),
fmt(sum(x["share"] for x in b.values()))))
nz = sum(1 for v in net.values() if v)
o += ["", "## Transfers (%d)" % len(tr), ""]
if not tr:
o.append("Everyone is even. Nothing to pay.")
else:
for i, (d, c, x) in enumerate(tr, 1):
o.append("%d. %s pays %s **%s**" % (i, d, c, fmt(x, B)))
o.append("")
if exact:
if len(groups) > 1:
o.append("Minimum possible: %d transfers. The group splits into %d sets that settle among themselves (%s), so %d people need only %d transfers; paying largest debt to largest credit would take %d." % (
len(tr), len(groups), "; ".join(" + ".join(g) for g in groups), nz, len(tr), len(gr)))
else:
o.append("Minimum possible: %d transfers for %d people with a balance (no smaller subgroup evens out on its own)." % (len(tr), nz))
else:
o.append("%d people have a balance; exact minimum search skipped (limit %d), greedy plan uses at most %d transfers." % (nz, MAX_EXACT, nz - 1))
if detail:
p = led._person(detail)
o += ["", "## Detail: %s" % p, "", "| # | What | Paid | Share | Running net |", "|---|---|---|---|---|"]
run = 0
for l in led.lines:
pd, sh = l["paid"].get(p, 0), l["share"].get(p, 0)
if not pd and not sh:
continue
run += pd - sh
o.append("| %d | %s | %s | %s | %s |" % (l["n"], l["desc"], fmt(pd), fmt(sh), fmt(run)))
if led.warnings:
o += ["", "## Warnings", ""] + ["- " + w for w in led.warnings]
o += ["", "## Message for the group chat", "", "```"]
msg = ["Settle-up (%s, %d lines, rates: %s):" % (B, len(led.lines), ", ".join("%s %s" % (c, led.rates[c].normalize()) for c in others) or "none")]
msg += ["- %s -> %s: %s" % (d, c, fmt(x, B)) for d, c, x in tr] or ["- everyone is even"]
msg.append("Full table in the shared sheet. Shout within 2 days if a line is wrong.")
o += msg + ["```"]
return "\n".join(o) + "\n"
def as_json(led):
b = led.balances()
net = {p: b[p]["net"] for p in led.people}
tr, groups, exact = minimal(net, led.people)
return {"base": led.base, "people": led.people, "balances_cents": b,
"transfers": [{"from": d, "to": c, "cents": x} for d, c, x in tr],
"groups": groups, "exact_minimum": exact, "warnings": led.warnings}
# ----------------------------------------------------------------------------- self-test
def self_test():
import random
cases = []
def case(name, fn):
try:
ok, err = bool(fn()), ""
except Exception as e: # noqa
ok, err = False, repr(e)
cases.append((name, ok, err))
H = "date,description,paid_by,amount,currency,split,participants,details\n"
def L(rows, **kw):
return Ledger(H + rows, **kw)
def nets(led):
b = led.balances()
return {p: b[p]["net"] for p in led.people}
def raises(fn):
try:
fn()
except LedgerError:
return True
return False
case("equal split to the cent", lambda: nets(L(",Taxi,Ana,10.00,,equal,Ana;Ben;Cem,\n")) == {"Ana": 666, "Ben": -333, "Cem": -333})
case("remainder cent goes to first in order", lambda: L(",X,Ana,0.10,,equal,Ana;Ben;Cem,\n").lines[0]["share"] == {"Ana": 4, "Ben": 3, "Cem": 3})
case("all minus exclusion", lambda: Ledger("# people: Ana, Ben, Cem\n" + H + ",X,Ana,30,,equal,all-Cem,\n").lines[0]["among"] == ["Ana", "Ben"])
case("all except words", lambda: Ledger("# people: Ana, Ben, Cem\n" + H + ",X,Ana,30,,equal,all except Ben,\n").lines[0]["among"] == ["Ana", "Cem"])
case("shares weights", lambda: L(",Room,Ana,100,,shares,,Ana:3;Ben:1\n").lines[0]["share"] == {"Ana": 7500, "Ben": 2500})
case("shares default 1 for unlisted participants", lambda: L(",Room,Ana,90,,shares,Ana;Ben;Cem,Ana:2;Ben:0\n").lines[0]["share"] == {"Ana": 6000, "Cem": 3000})
case("exact amounts", lambda: L(",Tickets,Ana,75,,exact,,Ana:30;Ben:45\n").lines[0]["share"] == {"Ana": 3000, "Ben": 4500})
case("exact with rest split equally", lambda: L(",T,Ana,100,,exact,Ana;Ben;Cem,Ana:40\n").lines[0]["share"] == {"Ana": 4000, "Ben": 3000, "Cem": 3000})
case("exact mismatch rejected", lambda: raises(lambda: L(",T,Ana,80,,exact,,Ana:30;Ben:45\n")))
case("percent", lambda: L(",Wine,Ana,36,,percent,,Ana:25;Ben:25;Cem:50\n").lines[0]["share"] == {"Ana": 900, "Ben": 900, "Cem": 1800})
case("percent not 100 rejected", lambda: raises(lambda: L(",W,Ana,36,,percent,,Ana:25;Ben:25\n")))
case("itemized with shared and tax/tip", lambda: L(",Dinner,Ana,66,,itemized,Ana;Ben,Ana:20;Ben:30;shared:10\n").lines[0]["share"] == {"Ana": 2750, "Ben": 3850})
case("itemized over bill rejected", lambda: raises(lambda: L(",D,Ana,40,,itemized,Ana;Ben,Ana:20;Ben:30\n")))
case("payment row", lambda: nets(L(",Food,Ana,20,,equal,Ana;Ben,\n,Paid back,Ben,10,,payment,Ana,\n")) == {"Ana": 0, "Ben": 0})
case("payment needs one recipient", lambda: raises(lambda: L(",P,Ben,10,,payment,Ana;Cem,\n")))
case("several payers", lambda: L(",Train,Ana:40;Ben:20,60,,equal,Ana;Ben;Cem,\n").lines[0]["paid"] == {"Ana": 4000, "Ben": 2000})
case("several payers must add up", lambda: raises(lambda: L(",Train,Ana:40;Ben:10,60,,equal,Ana;Ben,\n")))
case("refund (negative amount)", lambda: nets(L(",Museum refund,Ben,-24,,equal,Ben;Cem,\n")) == {"Ben": -1200, "Cem": 1200})
case("currency conversion", lambda: L(",Surf,Ana,100,USD,equal,Ana;Ben,\n", rates="USD=0.92").lines[0]["total"] == 9200)
case("rates from comment line", lambda: Ledger("# base: EUR\n# rates: USD=0.92, GBP=1.16\n" + H + ",S,Ana,10,GBP,equal,Ana;Ben,\n").lines[0]["total"] == 1160)
case("missing rate rejected", lambda: raises(lambda: L(",S,Ana,10,CHF,equal,Ana;Ben,\n")))
case("unknown split rejected", lambda: raises(lambda: L(",S,Ana,10,,halves,Ana;Ben,\n")))
case("strict people list rejects typo", lambda: raises(lambda: Ledger("# people: Ana, Ben\n" + H + ",S,Anna,10,,equal,all,\n")))
case("case-insensitive names merge", lambda: L(",A,Ana,10,,equal,ana;Ben,\n").people == ["Ana", "Ben"])
case("duplicate line warning", lambda: any("duplicate" in w for w in L("1,Taxi,Ana,10,,equal,Ana;Ben,\n1,Taxi,Ana,10,,equal,Ana;Ben,\n").warnings))
case("missing columns rejected", lambda: raises(lambda: Ledger("what,who\nx,y\n")))
case("bad number rejected", lambda: raises(lambda: L(",S,Ana,ten,,equal,Ana;Ben,\n")))
# minimum transfers
case("zero-sum pairs found (4 people -> 2 transfers)", lambda: len(minimal({"A": 500, "B": -500, "C": 300, "D": -300}, list("ABCD"))[0]) == 2)
case("no zero-sum subgroup -> people - 1 transfers", lambda: len(greedy({"A": 600, "B": 400, "C": -500, "D": -500}, list("ABCD"))) == 3 and len(minimal({"A": 600, "B": 400, "C": -500, "D": -500}, list("ABCD"))[0]) == 3)
case("min beats greedy on 6 people", lambda: (lambda n: len(minimal(n, list("ABCDEF"))[0]) == 4 and len(greedy(n, list("ABCDEF"))) == 5)({"A": 700, "B": 300, "C": 250, "D": -500, "E": -450, "F": -300}))
case("everyone even -> no transfers", lambda: minimal({"A": 0, "B": 0}, ["A", "B"])[0] == [])
def brute_min(net):
ps = [p for p in net if net[p]]
best = len(ps) - 1 if ps else 0
for parts in _partitions(ps):
if all(sum(net[p] for p in g) == 0 for g in parts):
best = min(best, len(ps) - len(parts))
return best
def check_random():
rnd = random.Random(7)
for _ in range(60):
k = rnd.randint(2, 7)
vals = [rnd.choice([-1, 1]) * rnd.choice([100, 200, 300, 500, 250, 50]) for _ in range(k - 1)]
vals.append(-sum(vals))
net = {chr(65 + i): v for i, v in enumerate(vals)}
tr = minimal(net, list(net))[0]
bal = dict(net)
for d, c, x in tr:
assert x > 0
bal[d] += x
bal[c] -= x
if any(bal.values()) or len(tr) != brute_min(net):
return False
return True
case("minimal == brute force on 60 random groups and settles everyone", check_random)
case("transfers settle the example-like ledger", lambda: _settles(L(",Flat,Ana,840,,shares,,Ana:3;Ben:3;Cem:2\n,Food,Cem,63.75,,equal,all,\n,Wine,Ben,36,,percent,,Ana:25;Ben:25;Cem:50\n")))
case("render has transfers and chat message", lambda: "Message for the group chat" in render(L(",Taxi,Ana,10,,equal,Ana;Ben,\n")))
case("detail view", lambda: "Detail: Ben" in render(L(",Taxi,Ana,10,,equal,Ana;Ben,\n"), "ben"))
case("json output", lambda: as_json(L(",Taxi,Ana,10,,equal,Ana;Ben,\n"))["transfers"] == [{"from": "Ben", "to": "Ana", "cents": 500}])
case("format thousands", lambda: fmt(123456789, "EUR") == "1,234,567.89 EUR" and fmt(-5) == "-0.05")
passed = sum(1 for _, ok, _ in cases if ok)
for name, ok, err in cases:
print(("PASS " if ok else "FAIL ") + name + ((" " + err) if err else ""))
print("%d/%d passed" % (passed, len(cases)))
return 0 if passed == len(cases) else 1
def _partitions(items):
if not items:
yield []
return
first, rest = items[0], items[1:]
for p in _partitions(rest):
for i in range(len(p)):
yield p[:i] + [[first] + p[i]] + p[i + 1:]
yield [[first]] + p
def _settles(led):
b = led.balances()
net = {p: b[p]["net"] for p in led.people}
for d, c, x in minimal(net, led.people)[0]:
net[d] += x
net[c] -= x
return not any(net.values())
def main(argv=None):
ap = argparse.ArgumentParser(description="Split shared expenses and plan the fewest settle-up transfers.")
ap.add_argument("file", nargs="?", help="CSV ledger ('-' = stdin)")
ap.add_argument("--base", default=None, help="base currency (default: '# base:' line or EUR)")
ap.add_argument("--rates", default=None, help="USD=0.92,GBP=1.16 (1 unit = rate units of base)")
ap.add_argument("--people", default=None, help="comma-separated group members (strict: typos are errors)")
ap.add_argument("--detail", default=None, help="show the line-by-line breakdown for one person")
ap.add_argument("--json", action="store_true")
ap.add_argument("--self-test", action="store_true")
a = ap.parse_args(argv)
if a.self_test:
return self_test()
if not a.file:
ap.error("give a CSV ledger or --self-test")
try:
text = sys.stdin.read() if a.file == "-" else open(a.file, encoding="utf-8-sig").read()
people = [p.strip() for p in a.people.split(",")] if a.people else None
led = Ledger(text, a.base, a.rates, people)
out = json.dumps(as_json(led), indent=2) + "\n" if a.json else render(led, a.detail)
except (OSError, LedgerError) as e:
print("error: %s" % e, file=sys.stderr)
return 2
sys.stdout.write(out)
return 0
if __name__ == "__main__":
sys.exit(main())
Risograph travel poster in sunflower yellow, fluorescent pink, teal, and navy: about seventeen patterned hot air balloons (stripes, zigzags, polka dots, a checkerboard) over cone-shaped fairy chimney rock towers with glowing cave windows, a big pink sun behind teal hills, with paper grain, halftone speckle, and slight misregistration. 来源:https://prompts.chat/prompts/cmvxhsmbu000ql507ix4r5v2z
A risograph print poster of hot air balloons drifting over the fairy chimneys of Cappadocia at sunrise, vertical portrait 3:4. Limited ink palette of sunflower yellow, fluorescent pink, teal, and deep navy on uncoated paper. The whole sky is flat sunflower yellow. About seventeen hot air balloons of different sizes float across the upper two thirds, near and far, each with a small basket below: some with horizontal pink and navy stripes, some with vertical stripes, zigzag and chevron bands, navy polka dots, and one with a navy-and-yellow checkerboard pattern; the largest navy balloon with pink stripes sits near the top center. A large fluorescent pink sun disc sits low on the left behind rolling teal hills. The lower third is filled with tall cone-shaped fairy chimney rock towers in navy, teal, pink, and yellow, carved with many small square and arched cave windows and doorways, a few glowing yellow, the tallest on the right. Teal hills and a valley stretch behind them, and dark teal shrubs fill the bottom edge. Visible paper grain, halftone speckle, overprinted inks, and slight color misregistration, a bold, cheerful, retro travel poster feel. No text, no logos.
Turn a short idea into an image-ready and motion-ready brief for one hero shot of a floating market at sunrise: vendors in conical straw hats paddling long wooden boats piled with tropical fruit along a calm, misty canal lined with palms and a stilt house. Covers the boats and vendors, fruit cargo, canal and reflections, banks, mist and light, fixed details, a motion map, and two prompt seeds: a 16:9 still image and an image-to-video animation. 来源:https://prompts.chat/prompts/cmvxhur070001kz08evzx950s
Act as a cinematic travel scene designer who writes image-ready and motion-ready scene briefs. Help me design one hero shot of a floating market at sunrise: long wooden boats piled with tropical fruit gliding along a calm, misty canal lined with palms and a wooden stilt house. The shot will first be generated as a still image and then animated into a short video that uses that image as its first frame. Your brief must make the still image rich in elements that can move naturally (vendors paddling, boats gliding slowly, soft wakes and ripples, golden mist drifting between the palms, light shimmering on the water) while keeping the composition calm, balanced, readable, and easy to animate. My starting idea: a quiet floating market at sunrise, with women vendors in conical straw hats paddling wooden boats full of fruit along a misty tropical canal My starting choices: - Boats: five long, narrow wooden boats, each with one vendor, three in the foreground and two smaller ones further back, plus one tiny boat far away in the mist - Cargo: bananas, pineapples, green mangoes, limes, pomelos, coconuts, and pink dragon fruit piled high - Vendors: women in conical straw hats and long-sleeve patterned shirts, holding wooden paddles - Canal: a calm brown-green canal running straight away from the camera into the distance - Left bank: a weathered wooden stilt house with a rusty corrugated tin roof and a balcony full of potted plants - Banks and trees: tall coconut palms and dense tropical greenery on both banks, fading into the mist - Time and light: just after sunrise, soft golden backlight from the top right, warm haze - Visual style: photoreal travel and documentary photography, natural colors - Mood words: peaceful, warm, lively but unhurried, timeless First ask me, in one short message, for anything missing: the camera height (water level, eye level from a boat, or a little above), how many boats and vendors I want and how close the nearest ones are, which fruits must be visible, how thick the mist should be, whether the boats should glide toward the camera or across the frame in the video, whether more boats may appear in the distance as the shot settles, and anything to avoid (signs, text, logos, motors, modern clothing, brand packaging, recognizable faces, or copying a specific real market, photograph, or named landmark). Then produce the brief with these sections: 1. **Scene Overview**: two or three sentences on the place, the moment, the light, and the feeling. Describe an imagined floating market in the spirit of a tropical river delta, not a copy of a specific real market or a famous photograph. 2. **The Boats and Vendors**: how many boats, their shape and wood, their positions in the frame, how they are spaced, each vendor's hat, clothing, and pose, and the paddles. 3. **The Fruit Cargo**: what each boat carries, how it is piled, the colors that should stand out (yellow bananas, pink dragon fruit, green limes and mangoes, golden pineapples), and how the light catches it. 4. **The Canal and Reflections**: the water color, how calm it is, the soft wakes and reflections around the boats, and where the water catches the golden light. 5. **Banks, Stilt House, and Palms**: the stilt house on the left bank with its tin roof, balcony, and potted plants, the palms and greenery on both banks, and how they fade into the distance. 6. **Mist and Light**: how thick the morning mist is, where it lies (between the palms, over the far canal, softening the background), the direction and warmth of the backlight, and how it should read as soft morning haze rather than smoke. 7. **Fixed Visual Details**: a numbered list of 8 to 10 details that must stay identical in the still image and in the video (camera position, canal line, stilt house on the left bank, palm lines, boat count and order, vendors and hats, fruit on each boat, light direction, framing, mist zone). 8. **Motion Map**: a table of every element that can move in the video, with columns: element, type of motion, direction, speed (very slow, slow, medium), and how strongly it should move. Include the paddles and the vendors' arms, the boats gliding forward, the wakes and ripples, the shimmering reflections, the mist, palm fronds swaying slightly, any small boats appearing far back, and the camera move. Keep total motion subtle and physically plausible. 9. **Prompt Seed A - Hero Still Image**: a ready-to-paste image prompt under 170 words for a wide landscape 16:9 frame, with the fruit-laden wooden boats, the vendors in conical hats, and the misty canal at sunrise in the first sentence, ending with: no text, no signs, no logos. 10. **Prompt Seed B - Image-to-Video Animation**: a ready-to-paste video prompt under 120 words that starts from the hero still as the first frame, describes the vendors paddling and the boats gliding slowly toward the camera for about 6 seconds, gentle wakes and ripples spreading, reflections shimmering, golden mist drifting between the palms, a very slight camera push-in, and says to keep the stilt house, banks, palms, boats, fruit, and framing exactly as in the image with no new close-up objects. Rules: no text, signs, or logos; no motorboats, phones, or modern brand packaging; no fast camera moves or cuts; and no motion that breaks physics (boats move only in the direction they are paddled and keep their shape and cargo, paddles enter and leave the water with small splashes, wakes spread outward and fade, the stilt house and banks never move, mist drifts slowly and does not swirl violently, the light does not flicker or jump). Use short paragraphs and lists.

Photoreal sunrise scene: five long wooden boats piled with bananas, pineapples, limes, mangoes, pomelos, and pink dragon fruit, each paddled by a vendor in a conical straw hat, on a calm brown-green canal with a rusty-roofed wooden stilt house on the left bank, coconut palms on both banks, golden morning mist, and soft backlight on the water. Step 2 of the Floating Market at Sunrise workflow. 来源:https://prompts.chat/prompts/cmvxhvu7q0001i908vxs7g3c4
Long wooden boats piled with tropical fruit gliding along a calm, misty canal at a floating market at sunrise, seen from eye level on the water looking straight down the canal, in a wide landscape 16:9 frame. On the left bank stands a weathered wooden stilt house with a rusty corrugated tin roof and a balcony with railings full of potted plants, above lush green bushes. Tall coconut palms and dense tropical greenery line both banks and fade into soft golden morning mist in the distance. Five long, narrow wooden boats are on the brown-green water, each paddled by one woman vendor in a conical straw hat and a long-sleeve patterned shirt: the front-left boat carries yellow bananas, green mangoes and limes, and pink dragon fruit; the front-center boat carries golden pineapples and big green pomelos and coconuts; the front-right boat is piled with green limes and yellow mangoes; two smaller boats further back in the center carry pineapples and mixed fruit; and one tiny boat sits far away in the mist. Soft golden backlight comes from the top right, with warm reflections and gentle wakes on the water. Photoreal travel and documentary photography, natural colors, peaceful, warm, and timeless mood. No text, no signs, no logos.
Animate the step 2 floating market image as the first frame into a calm 6-second shot: vendors in conical straw hats paddle and the fruit-laden boats glide slowly toward the camera, gentle wakes and ripples spread and reflections shimmer, more small boats appear far back in the misty canal, and golden mist drifts between the palms with a very slight push-in. Step 3 of the Floating Market at Sunrise workflow. 来源:https://prompts.chat/prompts/cmvxhwy6p000ul507grrnf5nw
Start from the step 2 image "Floating Market Boats Laden with Tropical Fruit on a Misty Canal at Sunrise" as the exact first frame, and animate it into a calm 6-second cinematic shot. Keep the weathered stilt house with its rusty tin roof and potted plants on the left bank, the coconut palms and tropical greenery on both banks, the brown-green canal, the wooden boats with their vendors in conical straw hats, the bananas, pineapples, limes, mangoes, and dragon fruit on each boat, the golden backlight from the top right, and the composition exactly as in the image. The vendors paddle steadily with wooden paddles, and the boats glide slowly forward toward the camera, keeping roughly their formation. Gentle ripples and wakes spread across the water around each boat, and the reflections shimmer. As the scene settles, a few more small boats become visible further back in the misty canal. Golden morning mist drifts slowly between the palms, while the camera makes a very slight, steady push-in. The shot ends calm in warm sunrise light. Natural, realistic motion, no cuts, no text, no signs. Soft sound of paddles dipping into the water, quiet lapping of small waves, and distant birdsong.
Impressionist painting with thick, textured strokes: a Paris cafe with a red scalloped awning and glowing amber windows, rattan bistro chairs on the wet terrace, an ornate street lamp, and a rainy cobblestone street of Haussmann buildings fading into blue-violet mist, with people under umbrellas and gold and red reflections. 来源:https://prompts.chat/prompts/cmvyxdgd10009jq086ap1npt6
An impressionist painting of a Parisian cafe terrace on a rainy evening, landscape 4:3, with thick, visible, textured brushstrokes like an oil or pastel painting. On the left, a cafe with a large red scalloped awning glows from within through tall amber windows, with two round potted green shrubs by the facade. Small round bistro tables with woven rattan chairs stand on the wet pavement in the foreground. In the center, an ornate black street lamp with a glowing lantern rises above the curb. On the right, a long wet cobblestone street recedes into a misty blue-violet distance between tall Haussmann-style buildings dotted with small warm lights. A person in a brown coat holding a dark umbrella walks away from the viewer down the street, with two more figures under umbrellas further back. Rain falls softly, and the glossy cobblestones are full of broken reflections of gold, amber, and red. Blue-violet dusk sky, warm light against cool shadows, romantic and quiet mood. No readable signs, no text, no logos.
Turn a short idea into an image-ready and motion-ready brief for one hero shot of glass igloos under the northern lights in Lapland: glass-domed cabins glowing with warm light in deep snow among snow-laden spruces, under a swirling green and violet aurora. Covers the igloos, snow, trail and signpost, the forest, aurora and stars, light and color, fixed details, a motion map, and two prompt seeds: a 16:9 still image and an image-to-video animation. 来源:https://prompts.chat/prompts/cmvyxeiig0001l908f05ah7h3
Act as a cinematic travel scene designer who writes image-ready and motion-ready scene briefs. Help me design one hero shot of glass igloos under the northern lights in Lapland: glass-domed cabins glowing with warm light in deep snow among snow-laden spruce trees, under a swirling green and violet aurora and a sky full of stars. The shot will first be generated as a still image and then animated into a short video that uses that image as its first frame. Your brief must make the still image rich in elements that can move naturally (the aurora rippling and shifting, stars twinkling, light snow drifting, powder snow sliding off a branch, warm light glowing in the igloos, a slow camera move along a path) while keeping the composition calm, balanced, readable, and easy to animate. My starting idea: a quiet arctic night at a small glass igloo village in a snowy spruce forest, with a bright aurora overhead and one igloo glowing close to the camera My starting choices: - Igloos: three glass-domed igloo cabins with metal frames, one large one on the right-center close to the camera and two smaller ones further back on the left and in the center - Inside the big igloo: warm golden light, a lit glass door, a cozy bed and armchairs visible through the glass - Snow and ground: deep fresh powder snow with a trail of footprints leading from the camera toward the big igloo - Trees: tall spruce trees heavily loaded with snow framing both sides and a dark forest line behind - Small detail: a wooden signpost with three blank arrow boards in front of the big igloo - Sky: a vivid green and violet aurora swirling in a wide arc across the upper half, with many stars - Time and light: deep night, cold blue snow lit by the aurora and starlight, warm amber light from the igloos - Visual style: photoreal travel photography, long-exposure night look, natural but vivid colors - Mood words: magical, peaceful, cozy, silent, once-in-a-lifetime First ask me, in one short message, for anything missing: the camera height (snow level, eye level, or a little above), how many igloos I want and how close the nearest one is, how much of the interior should be visible, how bright and which colors the aurora should be, whether snow should be falling or the night should be clear, whether the camera should push in along the path or stay still in the video, whether more igloos may come into view in the distance as the camera moves, and anything to avoid (people, faces, text, signs with words, logos, brand names, cars or snowmobiles, smoke, or copying a specific real resort, photograph, or named place). Then produce the brief with these sections: 1. **Scene Overview**: two or three sentences on the place, the moment, the light, and the feeling. Describe an imagined glass igloo village in the spirit of Finnish Lapland, not a copy of a specific real resort or a famous photograph. 2. **The Glass Igloos**: how many igloos, their size, glass panels and frames, their positions in the frame, how they are spaced, which one is the hero, and what can be seen through the glass and the door. 3. **Snow, Trail, and Signpost**: the depth and texture of the snow, the footprint trail and where it leads, the snowy base around each igloo, and the wooden signpost with blank arrow boards. 4. **The Spruce Forest**: the snow-laden trees framing both sides, the big tree closest to the camera, the dark forest line behind, and how the trees catch the aurora and the warm cabin light. 5. **Aurora and Stars**: the shape, colors, and brightness of the aurora, where it sits in the frame, the star field, and how to keep it natural rather than neon or fake. 6. **Light and Color**: the contrast between cold blue snow and warm amber igloo light, light spill from the doors and glass onto the snow, and the overall exposure of a clear arctic night. 7. **Fixed Visual Details**: a numbered list of 8 to 10 details that must stay identical in the still image and in the video (camera position, igloo count and positions, hero igloo on the right-center, lit door, interior furniture, footprint trail, signpost, framing trees, aurora shape and colors, framing). 8. **Motion Map**: a table of every element that can move in the video, with columns: element, type of motion, direction, speed (very slow, slow, medium), and how strongly it should move. Include the aurora ripples and shifts, the twinkling stars, light snow drifting in the air, a puff of powder snow falling from a spruce branch, the warm glow in the igloos, any small igloos coming into view far back, and the camera move. Keep total motion subtle and physically plausible. 9. **Prompt Seed A - Hero Still Image**: a ready-to-paste image prompt under 170 words for a wide landscape 16:9 frame, with the glowing glass igloos, the deep snow and spruces, and the green and violet aurora in the first sentence, ending with: no people, no text, no logos. 10. **Prompt Seed B - Image-to-Video Animation**: a ready-to-paste video prompt under 120 words that starts from the hero still as the first frame, describes the aurora rippling and shifting slowly for about 6 seconds, stars twinkling, light snow drifting, a puff of powder snow falling from a spruce on the right, warm light glowing in the igloos, a slow, smooth camera push-in along the footprint trail toward the big igloo, and says to keep the igloos, trees, trail, signpost, and framing exactly as in the image with no people and no new close-up objects. Rules: no people, faces, text, signs with words, or logos; no vehicles, smoke, or modern brand objects; no fast camera moves or cuts; and no motion that breaks physics (the igloos, trees, trail, and signpost never move or change shape, the aurora moves in slow ripples and curtains and does not flash or strobe, snow falls downward and drifts gently, powder snow slides off a branch and falls naturally, stars twinkle without jumping, the warm light stays steady and does not flicker like fire). Use short paragraphs and lists.

Photoreal arctic night: three glass-domed igloo cabins glowing with warm golden light in deep snow, the largest with a lit door and cozy furniture inside, a footprint trail and a wooden signpost with blank arrows, snow-laden spruces on both sides, and a vivid green and violet aurora swirling across a starry sky. Step 2 of the Glass Igloos Under the Northern Lights in Lapland workflow. 来源:https://prompts.chat/prompts/cmvyxfjmr000jl908neorpxyd
Glass-domed igloo cabins glowing with warm golden light in deep fresh snow among heavily snow-laden spruce trees under a swirling green and violet aurora in Lapland at night, wide landscape 16:9, seen from eye level. The largest glass igloo stands on the right-center with a metal-framed dome, a lit glass door, and a cozy bed and armchairs visible inside, resting on a snowy base. Two smaller glowing glass igloos sit further back, one on the far left and one in the center, half-hidden between the trees. A trail of footprints runs through the deep snow from the bottom center of the frame toward the big igloo. A wooden signpost with three blank arrow boards stands in the snow on the right, just in front of the big igloo. Tall spruces thick with snow frame both sides, with a dark forest line behind. The upper half of the sky is filled with a vivid green and violet aurora swirling in a wide arc, over a deep blue sky full of stars. Cold blue snow against warm amber cabin light, photoreal long-exposure night travel photography, magical, peaceful, and cozy mood. No people, no text, no logos.
Animate the step 2 glass igloo image as the first frame into a calm 6-second shot: the green and violet aurora ripples and shifts, stars twinkle, light snow drifts, a puff of powder snow falls from a spruce, warm light glows in the igloos, and the camera pushes in slowly along the footprint trail toward the big igloo. Step 3 of the Glass Igloos Under the Northern Lights in Lapland workflow. 来源:https://prompts.chat/prompts/cmvyxjf4g000nl908t65bes17
Start from the step 2 image "Glass Igloos Glowing Under a Green and Violet Aurora in Snowy Lapland" as the exact first frame, and animate it into a calm 6-second cinematic shot. Keep the large glass igloo on the right-center with its lit door and cozy interior, the two smaller glowing igloos further back, the snow-laden spruce trees on both sides, the footprint trail in the deep snow, the wooden signpost with blank arrow boards, the colors, and the composition exactly as in the image. The green and violet aurora ripples and shifts slowly across the sky in soft curtains, and the stars twinkle. Light snow drifts gently through the air, and a small puff of powder snow slides off a spruce branch on the right and falls softly. Warm golden light glows steadily inside the igloos. The camera makes a slow, smooth push-in along the footprint trail toward the big igloo, and a few more small glowing igloos come into view far back among the trees. The shot ends calm and magical in the cold blue night. Natural, realistic motion, no people, no cuts, no text. Soft sound of a gentle wind, faint snow falling, and deep arctic silence.
A photo-plus-scrapbook collage prompt that turns food and travel snapshots into a warm vintage travel diary: two connected scenes, a Japanese seaside meal and a cozy window-side café table, each shown as a realistic food photograph above a cream journal page of cut-out dishes, small photos, handwritten labels, dotted routes, pins and doodles, on ivory textured paper with soft sunlight and film grain in a vertical 3:4 layout. 来源:https://prompts.chat/prompts/cmvz3q4hf0007l708wu63dtjt
Inputs (optional): attach your own food, café and travel photos as reference images. Without references, the two scenes below are generated from the text alone. Transform the reference images into a beautiful vintage lifestyle and travel diary collage, combining cozy food photography with an artistic scrapbook journal layout. Create two connected scenes in a warm, nostalgic editorial aesthetic. Scene 1 – Japanese Seaside Food Diary: Show a beautifully arranged traditional Japanese meal on a dark wooden table overlooking a sparkling blue ocean. Include ceramic bowls of udon noodles, miso soup, seasoned rice, fried seafood, pickles, and small side dishes in blue-and-white Japanese tableware. In the background, feature a seaside balcony, black metal railing, distant green islands, and clear summer skies. Below the photograph, create a cream-colored scrapbook page featuring individually arranged food items, small seaside photographs, handwritten labels, dotted travel paths, location pins, delicate botanical sketches, and handwritten notes. Scene 2 – Cozy Café Moments: Show a warm café table beside a large window with two woven baskets filled with freshly baked pastries, sandwiches, and takeaway coffee cups. Include a freshly prepared latte, cappuccino, golden flaky bread, soft sunlight, cream curtains, and a charming city street visible through the window. Below the photograph, create another vintage scrapbook journal page with isolated food cutouts, coffee cups, pastries, small window-view photographs, handwritten annotations, arrows, decorative doodles, and torn-paper notes. Use warm ivory and beige textured paper, subtle film grain, soft natural sunlight, muted earthy colors, delicate shadows, elegant handwritten typography, vintage travel magazine styling, and realistic food photography. Maintain a beautiful balance between realistic photography and handmade scrapbook illustrations. The overall design should feel like a personal travel journal documenting little moments of food, places, coffee, and happiness. Premium editorial art direction, highly detailed, vertical 3:4 composition.

A fill-in-the-country template for a photoreal vintage travel poster: oversized letterpress country name, postal stamps and an "ARRIVED" customs stamp, a kraft souvenir box with ten culturally authentic miniature keepsakes, an illustrated route map, a train or plane ticket, a landmark sticker and a facts strip (language, capital, currency, best time), all shot as real objects on textured white paper. Change one variable to make a poster for any country. 来源:https://prompts.chat/prompts/cmvz3ruay000bl708mxzva87c
Create an ultra-realistic vintage travel poster for Japan, combining retro travel advertising, postal memorabilia, and a nostalgic magazine-cover aesthetic. Generate everything entirely from text, without requiring a reference image. Automatically incorporate authentic country-specific elements: native language, capital, currency, coordinates, famous landmarks, national animal or symbol, traditional crafts, iconic souvenirs, signature food and drink, cultural ornaments, and flag colors. BACKGROUND & TYPOGRAPHY Use a pure white (#FFFFFF) matte paper background with subtle paper grain and barely visible aging. Keep it white, without cream, beige, yellow, or sepia tones. At the top, add "COLLECT MEMORIES NOT THINGS." in small tracked vintage serif lettering, with its native-language translation where appropriate. Below, display Japan in oversized distressed brick-red (#B5432E) vintage slab-serif typography with authentic worn letterpress texture. VINTAGE POSTAL DETAILS Add a circular national-symbol rubber stamp and a "SOUVENIR BOX SERIES" postal tag on the left. On the right, include a hand-painted postage stamp featuring a famous landmark, plus a distressed red "ARRIVED" customs stamp showing the country, capital, plausible date, and airport code. Include accurate capital coordinates. CENTRAL SOUVENIR BOX Feature a large open kraft-cardboard shipping box in the center, viewed from a gentle top-down angle. Include outward-folded flaps, corrugated edges, realistic shadows, and 8–10 compartments lined with crinkled tissue paper. Arrange 10 miniature, photorealistic souvenirs representing the country: a famous landmark, traditional doll, lucky charm, tableware, national animal, traditional textile, local food or drink, folk craft, keychain, and traditional hat or clothing accessory. Make every object culturally authentic, recognizable, and beautifully detailed. Add "SOUVENIRS FROM Japan" in vintage dark-brown lettering on the front flap. BOTTOM TRAVEL COLLAGE Below the box, arrange: - A folded illustrated map titled "EXPLORE Japan", featuring 3–4 destinations, dotted travel routes, landmark illustrations, and a compass rose. - A vintage railway or airplane ticket showing a capital-to-city route, date, seat, and serial number. - A die-cut travel sticker depicting an iconic national landmark. - One small traditional folk-craft object. COUNTRY INFORMATION FOOTER Add a small national-symbol badge and a historical founding year where applicable. Include a neatly arranged information strip: LANGUAGE: [NATIVE LANGUAGE] | CAPITAL: [CITY] | CURRENCY: [CURRENCY] | BEST TIME: [SEASON] Finish with a circular "MADE IN Japan" stamp, miniature national-symbol postage stamp, tiny airplane with a dashed flight path, and the national motto in small italic lettering. VISUAL STYLE & QUALITY Use restrained national flag colors, realistic paper fibers, distressed ink, hand-painted illustrations, natural contact shadows, soft studio lighting, and slightly desaturated vintage colors. Every element must look like a real physical object photographed on textured white paper, not flat digital artwork. AVOID: Cream or yellow backgrounds, modern graphics, glossy plastic, artificial 3D-render aesthetics, halftone dots, incorrect cultural details, random text, illegible lettering, watermarks, and signatures. OUTPUT: 3:4 portrait, minimum 2048 × 2731 resolution, premium vintage editorial composition, ultra-detailed photorealism.
Protect yourself from unfair rental car charges, as strict JSON: a pickup inspection checklist, a photo and video evidence plan, fuel and mileage checks, a return inspection, a damage claim response that asks for proof, a deposit hold tracker, insurance and card coverage questions to confirm, polite and firm dispute letters, a deadline timeline, and next steps. Practical help, not legal advice. 来源:https://prompts.chat/prompts/cmw0ct2c50001i607ov95ltpl
1{2 "role": "Calm, detail-focused rental car inspection and dispute assistant who helps travelers check a rental car at pickup and return, record clear photo and video evidence, check fuel and mileage, review damage claims and deposit holds, and write polite, firm dispute letters, without inventing rental company policies, fees, laws, or insurance terms",3 "task": "Turn my rental booking details, what I see at pickup and return, my evidence, and any damage claim or deposit hold into a single strict JSON inspection and dispute report: a summary, a pickup inspection checklist, a photo and video evidence plan, fuel and mileage checks, a return inspection checklist, a damage claim response, a deposit hold check, insurance and coverage questions to confirm, ready-to-send letters, a timeline of deadlines, and a next steps list. Never invent rental company policies, fees, repair costs, insurance coverage, or laws.",4 "context": {5 "rental_company_and_location": "${company:a major rental company at an airport location}",6 "booking_details": "${booking:compact car, 5 days, pickup Monday 10:00, return Saturday 18:00 at the same airport}",7 "stage": "${stage:pickup | return | after_return_claim}",8 "pickup_condition_notes": "${pickup_notes:a small scratch on the rear bumper and a chip in the windshield, both marked on the pickup form}",9 "return_condition_notes": "${return_notes:returned after hours using the key drop box, the car was clean and undamaged as far as I could see}",10 "fuel_and_mileage": "${fuel:full-to-full fuel policy, pickup mileage 23,410 km, unlimited mileage included}",...+165 more lines

Hand-painted Delft blue tile panel in cobalt on milky white glaze: a 6 by 4 grid of tiles with corner ornaments, a three-masted sailing ship with billowing sails on white-capped waves on the left, rows of tulip fields and a village with a single church spire on the right shore, puffy clouds and seagulls above, and a fine crackle in the glaze. 来源:https://prompts.chat/prompts/cmw0cveh10001jz08m5yg94ay
A hand-painted Delft blue tile panel showing a three-masted sailing ship on choppy waves beside a shore of tulip fields and a small Dutch village, wide landscape 16:9. The panel is a grid of 6 by 4 square glazed tiles with thin grout lines, each tile edge decorated with small cobalt corner ornaments, and larger curling flourishes in the four outer corners. On the left, a tall wooden three-masted ship with billowing square sails, rigging lines, and small pennants on the mastheads sails through rolling, white-capped waves that fill the whole bottom row of tiles. On the right, a flat shoreline stretches across the middle of the panel with long, straight rows of tulip fields leading toward a village of gabled houses and trees with a single slender church spire. Puffy, softly shaded clouds float across a pale sky, with a few seagulls gliding between them. Painted only in cobalt blue on milky white glaze, with soft brush washes, fine line detail, and a delicate crackle in the glaze, traditional Dutch pottery look. No text, no lettering, no logos.

Photoreal tall view inside a narrow sandstone slot canyon: a single shaft of sunlight pours from a crack at the top and lands as a glowing spot on the sandy floor, sparkling dust swirls in the beam, and smooth wave-like walls glow deep orange and red, fading to violet in the shadows, with no people. 来源:https://prompts.chat/prompts/cmw0cwdxp0001l508i0w573c9
A photorealistic photograph of a single beam of sunlight falling into a narrow sandstone slot canyon, tall portrait 3:4. A bright shaft of light pours down from a small crack in the rock at the top center and lands as a glowing round spot on the soft sandy floor near the bottom. Fine dust and sand particles swirl and sparkle inside the beam, making it look solid and misty. The canyon walls rise steeply on both sides in smooth, flowing, wave-like curves and layered stripes, glowing deep orange and red where the light bounces and fading to cool violet and plum in the shadows. The narrow passage curves away behind the beam into darkness. Low, wide-angle view from the canyon floor, long exposure, rich warm colors, high dynamic range, fine detail in the rock texture, quiet, sacred, awe-filled mood. No people, no text, no logos.
Turn a short idea into an image-ready and motion-ready brief for one hero shot of a whitewashed Aegean cliffside village at sunset: white cube houses with blue doors, a blue-domed chapel, a stone stairway with bougainvillea, and a calm sea with a small ferry. Covers the village, chapel, stairway, cliff, sea and ferry, sky and sun, light and color, fixed details, a motion map, and two prompt seeds: a 16:9 still image and an image-to-video animation. 来源:https://prompts.chat/prompts/cmw0cyfqv0008i607n9ohoka1
Act as a cinematic travel scene designer who writes image-ready and motion-ready scene briefs. Help me design one hero shot of a whitewashed Aegean cliffside village at sunset: white cube houses with blue doors cascading down a steep volcanic cliff, a blue-domed chapel at the top, a winding stone stairway with magenta bougainvillea, and a calm deep blue sea with a small ferry under an orange and pink sky. The shot will first be generated as a still image and then animated into a short video that uses that image as its first frame. Your brief must make the still image rich in elements that can move naturally (the ferry gliding and leaving a wake, sunlight glittering on the sea, lamps and windows lighting up, soft clouds drifting, bougainvillea stirring in a light breeze, a slow camera move toward the stairway) while keeping the composition calm, balanced, readable, and easy to animate. My starting idea: a quiet summer evening in a whitewashed village on a Greek island cliff, with the sun touching the horizon and a small ferry crossing the sea below My starting choices: - Village: white cube houses with flat roofs, blue doors, and small terraces stacked down a steep cliff on the left side of the frame - Chapel: a small white chapel with a bright blue dome and a cross at the top-left - Stairway: a winding stone stairway with low white walls leading down through the village in the lower left-center - Flowers: big clusters of magenta bougainvillea along the walls and the stairway - Sea and boat: a calm deep blue sea filling the right side, with one small white ferry mid-right leaving a thin wake - Distance: dark volcanic cliffs curving away and hazy islands and headlands on the horizon - Sky and sun: the sun just above the horizon on the right, an orange, pink, and violet sky with long thin clouds - Lights: a few windows and wall lanterns already glowing warm in the village - Visual style: photoreal travel photography, golden hour, natural but rich colors - Mood words: warm, peaceful, romantic, timeless, summer evening First ask me, in one short message, for anything missing: the camera height and position (on a terrace, on the stairway, or above the village), how much of the frame the village and the sea should take, how many boats I want and where, how low the sun should be, how many lights should be on, whether the camera should push in toward the stairway or stay still in the video, where the camera move should end (for example a lit doorway with lanterns), and anything to avoid (people, faces, text, signs with words, logos, brand names, cars, crowds, or copying a specific real hotel, photograph, or named place). Then produce the brief with these sections: 1. **Scene Overview**: two or three sentences on the place, the moment, the light, and the feeling. Describe an imagined village in the spirit of the Greek Cycladic islands, not a copy of a specific real village, hotel, or famous photograph. 2. **The Village and Chapel**: the white cube houses, blue doors and window frames, terraces, how the buildings step down the cliff, and the blue-domed chapel at the top-left. 3. **Stairway, Walls, and Bougainvillea**: the winding stone steps, the low white walls, the lit doorways and wall lanterns, and where the magenta bougainvillea grows. 4. **Cliff, Sea, and Ferry**: the dark volcanic cliff face, the calm deep blue sea, the small white ferry and its wake, and the distant islands and headlands. 5. **Sky and Sun**: the position of the sun above the horizon, the colors and shapes of the clouds, and the path of sunlight on the water. 6. **Light and Color**: warm sunset light on white walls, cool blue shadows, glowing windows and lanterns, and the overall exposure of golden hour without blown-out whites. 7. **Fixed Visual Details**: a numbered list of 8 to 10 details that must stay identical in the still image and in the video (camera position, village on the left, chapel top-left, stairway lower left-center, bougainvillea clusters, sea on the right, ferry mid-right, sun position, horizon line, framing). 8. **Motion Map**: a table of every element that can move in the video, with columns: element, type of motion, direction, speed (very slow, slow, medium), and how strongly it should move. Include the ferry gliding to the right with its wake, sunlight glittering on the sea, lamps and windows glowing brighter, clouds drifting, bougainvillea stirring, and the camera move. Keep total motion subtle and physically plausible. 9. **Prompt Seed A - Hero Still Image**: a ready-to-paste image prompt under 170 words for a wide landscape 16:9 frame, with the whitewashed cliffside village, the blue-domed chapel, the stone stairway with bougainvillea, and the sea with the ferry at sunset in the first sentence, ending with: no people, no text, no logos. 10. **Prompt Seed B - Image-to-Video Animation**: a ready-to-paste video prompt under 120 words that starts from the hero still as the first frame, describes a slow, smooth camera push-in for about 6 seconds toward the village and the stone stairway that ends close on a lit doorway with wall lanterns and bougainvillea, the ferry gliding slowly to the right, sunlight glittering on the sea, more lamps glowing warm, and says to keep the houses, chapel, stairway, cliff, and colors exactly as in the image with no people. Rules: no people, faces, text, signs with words, or logos; no cars, crowds, or modern brand objects; no fast camera moves or cuts; and no motion that breaks physics (the houses, chapel, stairway, and cliff never move or change shape, the ferry moves forward smoothly in one direction and its wake trails behind it, the sun stays near the horizon, lamps glow steadily and do not flicker like fire, flowers stir only gently). Use short paragraphs and lists.

Photoreal golden hour: white cube houses with blue doors stepping down a steep volcanic cliff, a blue-domed chapel at the top-left, a winding stone stairway lined with magenta bougainvillea, glowing windows and lamps, and a calm deep blue sea with a small white ferry under an orange and pink sky with the sun on the horizon. Step 2 of the Aegean Cliffside Village at Sunset workflow. 来源:https://prompts.chat/prompts/cmw0czatp0001l50846diec76
A whitewashed Aegean cliffside village at sunset, with white cube houses and blue doors cascading down a steep volcanic cliff, a blue-domed chapel, a winding stone stairway with magenta bougainvillea, and a calm deep blue sea with a small white ferry, wide landscape 16:9. The village fills the left side of the frame, stepping down the cliff in terraces with flat roofs, low white walls, and small courtyards. A small white chapel with a bright blue dome and a cross stands at the top-left. A winding stone stairway with low white walls leads down through the village in the lower left-center, lined with big clusters of magenta bougainvillea. A few windows, doorways, and wall lamps glow warm. The dark rocky cliff drops into a calm deep blue sea that fills the right side, where one small white ferry sails mid-right, leaving a thin wake. The sun sits just above the horizon on the right, casting a golden path on the water under an orange, pink, and violet sky with long thin clouds, and hazy islands and headlands line the horizon. Photoreal golden hour travel photography, warm, peaceful, romantic mood. No people, no text, no logos.
Animate the step 2 Aegean village image as the first frame into a calm 6-second shot: the camera pushes in slowly toward the village and the stone stairway, ending close on a lit doorway with wall lanterns and bougainvillea, while the small ferry glides to the right, sunlight glitters on the sea, and more lamps glow warm. Step 3 of the Aegean Cliffside Village at Sunset workflow. 来源:https://prompts.chat/prompts/cmw0d0e8z0005l50810uhf5hn
Start from the step 2 image "Whitewashed Aegean Cliffside Village with a Blue-Domed Chapel at Sunset" as the exact first frame, and animate it into a calm 6-second cinematic shot. Keep the white cube houses with blue doors on the left, the blue-domed chapel at the top-left, the winding stone stairway with magenta bougainvillea, the dark cliff, the calm deep blue sea, the sun just above the horizon, the colors, and the style exactly as in the image. The camera makes a slow, smooth push-in and gentle drift toward the village and the stone stairway, ending close on a lit doorway with warm wall lanterns and bougainvillea beside the steps. The small white ferry glides slowly to the right across the sea, leaving its thin wake. Sunlight glitters on the water, the clouds drift slightly, and more windows and lamps begin to glow warm in the village. The shot ends warm, peaceful, and romantic in the golden evening light. Natural, realistic motion, no people, no cuts, no text. Soft sound of gentle waves, a light sea breeze, and distant evening calm.Turn a short idea into an image-ready and motion-ready brief for one hero shot of a blue-washed stepped alley in a Moroccan mountain town at sunrise: blue stone stairs, terracotta pots of red geraniums, an arched studded wooden door, and two cats resting on the steps. Covers the alley and walls, the door, flowers, the two cats, light and color, fixed details, a motion map, and two prompt seeds: a 16:9 still image and an image-to-video animation. 来源:https://prompts.chat/prompts/cmw1scu0j0001l808sfal68cs
Act as a cinematic travel scene designer who writes image-ready and motion-ready scene briefs. Help me design one hero shot of a blue-washed stepped alley in a Moroccan mountain town like Chefchaouen at sunrise: bright blue walls and stone stairs climbing away from the camera, terracotta pots of red geraniums along the steps, a large arched wooden door studded with iron nails, and two street cats resting on the stairs, with the first golden sunlight touching the rooftops. The shot will first be generated as a still image and then animated into a short video that uses that image as its first frame. Your brief must make the still image rich in elements that can move or change naturally (a slow camera move up the stairs, a cat turning its head or flicking its tail, geranium leaves stirring in a light breeze, sunlight slowly warming the upper walls) while keeping the composition calm, balanced, readable, and easy to animate. My starting idea: a quiet early morning in a blue mountain town alley, before anyone is awake, with two cats enjoying the first sun on the steps My starting choices: - Alley and stairs: wide blue stone stairs rising from the bottom center of the frame toward the back of the alley, with low blue walls on the left - Walls and houses: blue-washed walls on both sides, a blue house with a small blue window and an iron wall lantern at the upper left, sandy-colored rooftops and chimneys at the top - Door: a large arched dark wooden door studded with iron nails, set in a deep blue arch on the right - Flowers: terracotta pots with red geraniums on both sides of the stairs, and a big pot of geraniums beside the door at the bottom right - Cats: a ginger tabby cat sitting in the middle of the stairs facing the camera, and a white cat curled up asleep on a lower step at the left - Plants: a climbing green vine on the right wall above the stairs - Sky and sun: a pale clear morning sky, low sunrise light hitting only the rooftops and upper walls - Light: warm golden light above, cool blue shade on the lower stairs - Visual style: photoreal travel photography, natural but rich colors, low camera at the bottom of the stairs - Mood words: peaceful, sleepy, charming, fresh, timeless First ask me, in one short message, for anything missing: the camera height and position (at the bottom of the stairs, on a step, or looking down from above), how much of the frame the stairs, door, and walls should take, how many cats I want and where they sit or lie, how many flower pots and on which side, how strong the sunrise light should be, whether the camera should push up the stairs or stay still in the video, where the camera move should end, and anything to avoid (people, faces, text, shop signs, logos, brand names, laundry with prints, trash, or copying a specific real street, photograph, or named house). Then produce the brief with these sections: 1. **Scene Overview**: two or three sentences on the place, the moment, the light, and the feeling. Describe an imagined alley in the spirit of blue mountain towns in northern Morocco, not a copy of a specific real street, house, or famous photograph. 2. **Alley, Stairs, and Walls**: the stone steps and their worn edges, how they climb toward the back, the low walls, the blue-washed houses, the window and wall lantern, and the rooftops and chimneys at the top. 3. **The Door**: the arched dark wooden door, its iron studs and handle, and the deep blue arch around it. 4. **Flowers and Plants**: where the terracotta pots stand, the red geraniums, the big pot by the door, and the climbing vine. 5. **The Two Cats**: each cat's color, pose, position on the stairs, and what it is looking at, keeping both calm and natural. 6. **Light and Color**: warm golden sunrise light on the rooftops and upper walls, cool blue shade on the lower stairs, the many shades of blue, and the terracotta and red accents, without blown-out highlights. 7. **Fixed Visual Details**: a numbered list of 8 to 10 details that must stay identical in the still image and in the video (camera position, stairs from bottom center, door on the right, lantern upper left, pot positions, ginger cat mid-stairs, white cat on the lower left step, rooftops at the top, light direction, framing). 8. **Motion Map**: a table of every element that can move in the video, with columns: element, type of motion, direction, speed (very slow, slow, medium), and how strongly it should move. Include the camera move up the stairs, the ginger cat turning its head slightly, the white cat breathing while it sleeps, geranium leaves stirring, and the sunlight slowly warming. Keep total motion subtle and physically plausible. 9. **Prompt Seed A - Hero Still Image**: a ready-to-paste image prompt under 170 words for a wide landscape 16:9 frame, with the blue stepped alley, the red geraniums in terracotta pots, the arched studded door, and the two cats on the stairs at sunrise in the first sentence, ending with: no people, no text, no logos. 10. **Prompt Seed B - Image-to-Video Animation**: a ready-to-paste video prompt under 120 words that starts from the hero still as the first frame, describes a slow, smooth camera push-in for about 6 seconds up the blue stairs toward the back of the alley, the ginger cat staying seated and turning its head slightly, the white cat staying curled asleep, the door and geraniums on the right drifting out past the frame edge as the camera moves forward, and says to keep the walls, stairs, door, cats, and colors exactly as in the image with no people. Rules: no people, faces, text, shop signs, or logos; no cars, scooters, crowds, or modern brand objects; no fast camera moves or cuts; and no motion that breaks physics (the walls, stairs, door, and pots never move or change shape, the cats move only a little and stay where they are, no new animals appear, the light changes slowly and does not flicker, leaves stir only gently). Use short paragraphs and lists.

Photoreal morning scene: wide blue stone stairs climb a blue-washed alley lined with terracotta pots of red geraniums, a ginger cat sits mid-stairs facing the camera, a white cat sleeps curled on a lower step, an arched studded wooden door stands on the right, and golden sunrise light warms the rooftops and upper walls. Step 2 of the Chefchaouen Blue Alley at Sunrise workflow. 来源:https://prompts.chat/prompts/cmw1sdr1q0001ku08vi2i8m3r
A blue-washed stepped alley in a Moroccan mountain town at sunrise, with bright blue stone stairs, terracotta pots of red geraniums, a large arched wooden door studded with iron nails, and two cats resting on the steps, wide landscape 16:9. Wide blue stairs rise from the bottom center of the frame toward the back of the alley, lined on both sides with terracotta pots of red geraniums. A ginger tabby cat sits in the middle of the stairs facing the camera, and a white cat lies curled up asleep on a lower step at the left beside a geranium pot. On the right, a dark wooden door with rows of iron studs sits in a deep blue arch, with a big terracotta pot of red geraniums beside it at the bottom right. A blue house with a small blue window and an iron wall lantern stands at the upper left, and a green vine climbs the right wall. Low golden sunrise light warms the sandy rooftops, chimneys, and upper walls under a pale clear sky, while the lower stairs rest in cool blue shade. Low camera at the bottom of the stairs, photoreal travel photography, peaceful, charming morning mood. No people, no text, no logos.
Animate the step 2 blue alley image as the first frame into a calm 6-second shot: the camera pushes slowly up the blue stairs toward the back of the alley while the ginger cat stays seated and turns its head, the white cat sleeps on the lower step, the studded door and geraniums drift out of frame on the right, and the sunrise light stays warm. Step 3 of the Chefchaouen Blue Alley at Sunrise workflow. 来源:https://prompts.chat/prompts/cmw1seqfq0004jv08yygpmlc0
Start from the step 2 image "Blue Stepped Alley in Chefchaouen with Two Cats at Sunrise" as the exact first frame, and animate it into a calm 6-second cinematic shot. Keep the blue-washed walls, the blue stone stairs, the terracotta pots of red geraniums, the arched studded wooden door on the right, the wall lantern at the upper left, the sunlit rooftops, the colors, and the style exactly as in the image. The camera makes a slow, smooth push-in up the stairs toward the back of the alley. The ginger tabby cat stays sitting in the middle of the stairs and turns its head slightly, and the white cat stays curled asleep on the lower left step. As the camera moves forward, the door and the geranium pot on the right drift out past the edge of the frame. Golden sunrise light stays warm on the upper walls and rooftops, and the geranium leaves stir gently in a light breeze. Natural, realistic motion, no people, no cuts, no text. Soft sound of a quiet morning, distant birdsong, and a light breeze.Plan a family road trip from start to finish, as YAML: a route overview with estimated distances, a day-by-day driving plan within your daily limit plus a time buffer, rest and dog-walk stops, overnight stays, a fuel or charging plan with backups, a budget with a reserve, a pre-trip car check, packing lists by person and for the car, picnic and snack plans, screen-free games, driver rotation, rules to confirm, and a backup plan for delays and breakdowns. 来源:https://prompts.chat/prompts/cmw37wpc50001jw08q0ua8hu1
1role: Practical, calm road trip planner who helps families and friends turn a road trip idea into a realistic day-by-day driving plan, covering routes and driving limits, rest stops, overnight stays, a fuel or charging plan, a budget, a packing list, car checks, entertainment for passengers, and a backup plan for delays, so the trip stays safe, relaxed, and on budget2task: >3 Turn my route idea, my travel dates, my group, my car, my budget, and any bookings I already4 have into a complete road trip plan as YAML: a summary with the main risks, a route overview,5 a day-by-day driving plan with realistic driving times and breaks, a rest stop plan, overnight6 stays, a fuel or charging plan, a budget by category, a pre-trip car check, a packing list by7 person and by car, a food and snack plan, passenger entertainment, a driver rotation and rest8 plan, documents and rules to confirm, a delay and breakdown backup plan, and a final9 departure checklist.10...+154 more lines

Tall painterly impasto oil painting with thick brushstrokes and no text: a rainy stone-paved street in old Kyoto at dusk, lined with dark wooden machiya townhouses and glowing red paper lanterns, wet stones reflecting warm orange light, a lone figure with a red paper umbrella walking away up the middle, and a five-story pagoda silhouette in the misty blue distance under a deep blue cloudy sky. 来源:https://prompts.chat/prompts/cmw37z9pg0007jw08p409vaj2
A painterly impasto oil painting of a rainy stone-paved street in old Kyoto at dusk, tall portrait 3:4, with thick visible brushstrokes and a heavy textured paint surface. Dark wooden two-story machiya townhouses with lattice windows and tiled eaves line both sides of the street, with glowing red paper lanterns hanging along the eaves, larger and closer on the left, smaller and fading into the distance. The wet paving stones shine and reflect warm orange lantern light in long, broken streaks. A lone figure in a long dark coat, holding a red paper umbrella, walks away from the viewer up the middle of the street. At the far end, the silhouette of a tall five-story pagoda rises into the misty blue distance. Above, a deep blue cloudy evening sky with a faint warm glow near the horizon. Rich deep blues against warm orange and red, quiet, nostalgic, rainy mood. No text, no lettering, no logos.
Turn a short idea into an image-ready and motion-ready brief for one hero shot of a red wooden canoe tied to a weathered dock on a mirror-still alpine lake at autumn sunrise: dark pines and golden larches on the shores, three snow-capped peaks glowing pink and gold, and low mist over the water. Covers the dock and canoe, lake and mist, shores, mountains and sky, light and color, fixed details, a motion map, and two prompt seeds: a 16:9 still image and an image-to-video animation. 来源:https://prompts.chat/prompts/cmw380zyw0005jr07apgta3ix
Act as a cinematic landscape scene designer who writes image-ready and motion-ready scene briefs. Help me design one hero shot of a red wooden canoe tied to a small weathered wooden dock on a mirror-still alpine lake at autumn sunrise: dark green pines on one shore, golden-orange larches on the other, three jagged snow-capped peaks glowing pink and gold in the first light, low mist drifting over the water, and a perfect reflection of the peaks and trees. The shot will first be generated as a still image and then animated into a short video that uses that image as its first frame. Your brief must make the still image rich in elements that can move or change naturally (a slow camera drift toward the canoe, mist sliding across the water, the canoe rocking very slightly on its rope, soft ripples in the reflection) while keeping the composition calm, balanced, readable, and easy to animate. My starting idea: a silent autumn morning at a mountain lake, just before anyone arrives, with a single red canoe waiting at the end of the dock My starting choices: - Dock: a short weathered wooden dock pointing out into the lake from the bottom center of the frame - Canoe: a red wooden canoe with wooden seats, tied to the end of the dock by a rope or chain, floating on the LEFT side of the dock - Lake: a mirror-still alpine lake filling the middle of the frame, with low mist floating just above the water - Left shore: dark green pine forest on a rocky shoreline - Right shore: golden-orange autumn larches on a rocky shoreline with dry grass - Mountains: three jagged snow-capped peaks in the center background, lit pink and gold by the sunrise - Sky: a pale clear morning sky with a soft warm glow near the horizon - Light: warm sunrise light on the peaks and larch tops, soft cool light on the water and dock - Visual style: photoreal landscape photography, natural but rich colors, low camera just behind the dock - Mood words: calm, crisp, quiet, fresh, timeless First ask me, in one short message, for anything missing: the camera height and position (on the dock, just behind it, or from the shore), how much of the frame the dock, canoe, lake, and mountains should take, which side of the dock the canoe floats on and which way it points, how many peaks I want and how much snow they carry, how thick the mist should be, how strong the sunrise light should be, whether the camera should drift forward or stay still in the video, where the camera move should end, and anything to avoid (people, paddlers, boats with logos, houses, roads, power lines, text, brand names, or copying a specific real lake, photograph, or famous viewpoint). Then produce the brief with these sections: 1. **Scene Overview**: two or three sentences on the place, the moment, the light, and the feeling. Describe an imagined alpine lake in the spirit of high mountain lakes in autumn, not a copy of a specific real lake, viewpoint, or famous photograph. 2. **Dock and Canoe**: the weathered planks and posts of the dock, its length and angle, the red canoe's color, wooden seats, and position, and how it is tied to the end of the dock. 3. **Lake and Mist**: the still water, the mirror reflection of the peaks and trees, and how the low mist lies over the water and thins toward the shores. 4. **Shores and Trees**: the dark green pines on the left shore, the golden-orange larches on the right shore, the rocky shorelines, and how the trees step back toward the mountains. 5. **Mountains and Sky**: the three jagged peaks, their snow and rock, the pink and gold sunrise glow on their faces, and the pale clear sky. 6. **Light and Color**: warm sunrise light on the peaks and larch tops, cool soft light on the water and dock, the red canoe as the main color accent, and the green, gold, and blue palette, without blown-out highlights. 7. **Fixed Visual Details**: a numbered list of 8 to 10 details that must stay identical in the still image and in the video (camera position, dock from the bottom center, canoe on the left of the dock and tied at its end, pines on the left shore, larches on the right shore, three peaks in the center, mist on the water, reflection, light direction, framing). 8. **Motion Map**: a table of every element that can move in the video, with columns: element, type of motion, direction, speed (very slow, slow, medium), and how strongly it should move. Include the camera drifting forward and slightly down toward the canoe and dock, mist sliding softly across the water, the canoe rocking very slightly on its rope, gentle ripples in the reflection, and the sunrise glow holding on the peaks. Keep total motion subtle and physically plausible. 9. **Prompt Seed A - Hero Still Image**: a ready-to-paste image prompt under 170 words for a wide landscape 16:9 frame, with the red canoe tied to the end of the wooden dock, the mirror-still alpine lake, the pines and golden larches, and the snow-capped peaks at sunrise in the first sentence, ending with: no people, no text, no logos. 10. **Prompt Seed B - Image-to-Video Animation**: a ready-to-paste video prompt under 120 words that starts from the hero still as the first frame, describes a slow, smooth camera drift for about 6 seconds forward and slightly down toward the canoe and dock, the mist drifting softly across the water, the canoe staying tied and rocking only very slightly, the reflections rippling gently, the peaks staying lit pink and gold, and says to keep the dock, canoe, trees, mountains, and colors exactly as in the image with no people. Rules: no people, paddlers, faces, text, signs, or logos; no houses, roads, cars, power lines, or other boats; no fast camera moves or cuts; and no motion that breaks physics (the dock, shores, trees, and mountains never move or change shape, the canoe stays tied in place and only rocks a little, no animals or birds suddenly appear, the light changes slowly and does not flicker, the water stays calm with only gentle ripples). Use short paragraphs and lists.

Photoreal sunrise scene: a red wooden canoe is tied to the end of a short weathered wooden dock that points out from the bottom center into a mirror-still alpine lake, with dark green pines on the left shore, golden-orange larches on the right, three jagged snow-capped peaks lit pink and gold in the center, low mist over the water, and a perfect reflection. Step 2 of the Alpine Lake Red Canoe at Autumn Sunrise workflow. 来源:https://prompts.chat/prompts/cmw381tfk0001jp08ku7fnhfv
A red wooden canoe tied to the end of a short weathered wooden dock on a mirror-still alpine lake at autumn sunrise, with snow-capped peaks, dark green pines, and golden larches reflected in the water, wide landscape 16:9. The gray wooden dock points out into the lake from the bottom center of the frame, and the red canoe with wooden seats floats on the left side of the dock, tied to its end by a short chain. Low mist drifts just above the calm water. Dark green pines line the rocky left shore, and golden-orange autumn larches stand on the rocky right shore with dry grass. Three jagged snow-capped peaks rise in the center background, their faces lit pink and gold by the first sunrise light, under a pale clear sky with a soft warm glow near the horizon. The still lake holds a perfect reflection of the peaks and the trees. Low camera just behind the dock, photoreal landscape photography, crisp, calm, quiet morning mood. No people, no text, no logos.