Prayers initial commit

This commit is contained in:
william 2026-09-09 19:59:36 -07:00
parent 89d5b80062
commit cfdfd30db3
121 changed files with 7342 additions and 0 deletions

1
.gitignore vendored
View File

@ -1,3 +1,4 @@
.env
*.pdf
*.synctex.gz
*.aux

22
2026.08-PrayersForDailyLife/.gitignore vendored Normal file
View File

@ -0,0 +1,22 @@
__pycache__
.venv/
*.tar
latex/main.aux
latex/main.idx
latex/main.ilg
latex/main.ind
latex/main.ind
latex/main.log
latex/main.pdf
latex/main.toc
latex/CON*.tex
latex/CRI*.tex
latex/DRY*.tex
latex/GRA*.tex
latex/GUI*.tex
latex/LOS*.tex
latex/MIL*.tex
latex/REL*.tex
latex/TMP*.tex
latex/WON*.tex
latex/WWF*.tex

Binary file not shown.

View File

@ -0,0 +1,421 @@
#!/usr/bin/env python3
"""
classify_occasions.py
One-time (well -- rerunnable) migration script. Reads the old-format
.txt files (each verse with a full header and one or more "Occasion:"
lines, some possibly hand-culled with '%') from an input directory
-- your renamed ./old -- and, for every occasion found, asks the model
which of the 7 fixed categories (see categories.py) it honestly
belongs to. An occasion may land in more than one category; if none
fit, it goes to BONEYARD instead.
IMPORTANT: this script deliberately IGNORES all prior hand-culling.
Every '%Occasion: ...' line is un-commented and treated as live, and
every '%v ... %^' block is unwrapped. The idea is to start the new
category-based structure from the full original set of drafted
occasions, not from whatever survived your old cull pass -- you'll
cull again, fresh, once occasions land in their new category files.
For each (verse, category) assignment, writes a bare target file to
the output directory -- your ./txt -- in the new naming convention:
CCC.VV-CODE.txt e.g. 023.06-WWF.txt
CCC.VV-CODE-b.txt on collision (same verse+category, another
occasion), then -c, -d, ...
containing the new-format header (ref/title/quote) plus ONE
"Occasion: ..." line and no prayer text -- ready for an
updated generate_petitions2.py to write into. The old prayer text is
NOT carried over; these prayers are meant to be regenerated with the
strengthened Pass 2 prompt, not migrated verbatim.
Occasions the model can't honestly place in any of the 7 categories
are written instead to one BONEYARD file per verse:
CCC.VV-BONEYARD.txt
in the OLD multi-occasion style (header + all its boneyard occasions
listed together, no prayers) so you can review, delete, or manually
recategorize them at your leisure. Boneyard files are never picked up
by Pass 2.
Usage:
pip install openai python-dotenv
python classify_occasions.py old txt
python classify_occasions.py old txt --dry-run
python classify_occasions.py old txt --model gpt-5.4
"""
import argparse
import json
import os
import re
import sys
import time
from pathlib import Path
from dotenv import load_dotenv
from categories import CATEGORIES, VALID_CODES, BONEYARD, scope_block
load_dotenv()
API_KEY = os.environ.get("OPENAI_API_KEY") or os.environ.get("OPEN_API_KEY")
if not API_KEY:
sys.exit(
"No API key found. Add OPENAI_API_KEY=sk-... (or OPEN_API_KEY=sk-...) "
"to a .env file in the working directory, or export it in your shell."
)
try:
from openai import OpenAI
except ImportError:
sys.exit("Missing dependency. Run: pip install openai")
client = OpenAI(api_key=API_KEY)
# --- Parsing (old format) ---------------------------------------------------
FULL_HEADER_RE = re.compile(
r"^(?P<ref>##\s*\S+)[ \t]*\n"
r">(?!>)[ \t]*(?P<title>[^\n]*)\n"
r">>[ \t]*(?P<quote>[^\n]*)\n"
)
OCCASION_LINE_RE = re.compile(r"(?m)^Occasion:[ \t]*(?P<text>.+)$")
def uncull(text: str) -> str:
"""The inverse of strip_comment_lines() elsewhere in this project:
restores everything that was hand-culled instead of dropping it.
- A line '%Occasion: ...' becomes a live 'Occasion: ...' line.
- Standalone '%v' / '%^' marker lines are removed, but everything
between them is kept as-is (it was never itself prefixed with
'%', so no further unwrapping is needed there).
- Any OTHER line starting with '%' is treated as a genuine author
note (not a cull) and is dropped -- it was never content.
"""
lines = text.split("\n")
out = []
for ln in lines:
stripped = ln.strip()
if stripped in ("%v", "%^"):
continue
if stripped.startswith("%Occasion:"):
out.append(ln.lstrip()[1:]) # drop the leading '%' only
continue
if ln.lstrip().startswith("%"):
continue # a genuine note, not content -- drop it
out.append(ln)
return "\n".join(out)
def parse_ref(ref_line: str) -> str:
return ref_line.lstrip("#").strip()
def parse_file(text: str):
"""Returns {"ref", "title", "quote", "occasions": [{"text", "content"}, ...]}
or None. "content" is the prayer text already written under that
occasion (possibly "" if Pass 2 never got to it) -- carried through
so hand-polished prayers survive the category split instead of being
discarded and regenerated."""
text = uncull(text)
stripped = text.lstrip("\n")
m = FULL_HEADER_RE.match(stripped)
if not m:
return None
ref = parse_ref(m.group("ref"))
title = m.group("title").strip()
quote = m.group("quote").strip()
body = text[m.end():]
matches = list(OCCASION_LINE_RE.finditer(body))
occasions = []
seen = set()
for i, mo in enumerate(matches):
occasion_text = mo.group("text").strip()
start = mo.end()
end = matches[i + 1].start() if i + 1 < len(matches) else len(body)
content = body[start:end].strip()
# De-dup exact repeat occasion phrases (can happen if an occasion
# was both live and separately re-added by hand at some point) --
# keep the first occurrence's content.
key = occasion_text.lower()
if key in seen:
continue
seen.add(key)
occasions.append({"text": occasion_text, "content": content})
return {"ref": ref, "title": title, "quote": quote, "occasions": occasions}
def ref_to_filestem(ref: str) -> str:
"""'23:6' -> '023.06'. Verse padded to at least 2 digits (Psalm 119
runs past 99 -- str.zfill only pads up, so 176 stays '176')."""
chapter, verse = ref.split(":")
return f"{int(chapter):03d}.{verse.zfill(2)}"
# --- Classification call ----------------------------------------------------
SYSTEM_PROMPT = (
"You sort draft devotional-prayer occasions into a fixed set of 7 "
"categories for a Christian devotional book, one verse at a time.\n\n"
"The 7 categories, with their scope:\n\n"
f"{scope_block()}\n\n"
"For EACH occasion given, decide which of the 7 category codes it "
"honestly belongs to. Be generous: if an occasion plausibly fits a "
"category, include it, even if it could also fit another -- an "
"occasion may be assigned to more than one category when it "
"genuinely serves both (e.g. \"feeling under attack\" can honestly "
"be both WWF and REL). It is far better to over-include than to "
"force a stretch or drop something useful -- a human will cull by "
"hand later.\n\n"
"Only use \"BONEYARD\" -- and ONLY that, with no other code -- for "
"an occasion that does not honestly fit any of the 7. Do not combine "
"BONEYARD with a real code.\n\n"
"Do not edit, rephrase, or improve the occasion text. Echo it back "
"exactly as given, for matching."
)
USER_PROMPT_TEMPLATE = """\
Verse ({ref}): {quote}
Classify each of the following {count} occasions:
{occasions_list}
Respond ONLY with valid JSON in this exact shape, no other text, one \
entry per occasion above, in the same order:
{{
"classifications": [
{{"occasion": "...", "codes": ["WWF", "REL"]}},
...
]
}}
"""
def build_user_prompt(ref: str, quote: str, occasions: list) -> str:
occasions_list = "\n".join(f"{i}. {o}" for i, o in enumerate(occasions, start=1))
return USER_PROMPT_TEMPLATE.format(
ref=ref, quote=quote, count=len(occasions), occasions_list=occasions_list
)
def classify(ref: str, quote: str, occasions: list, model: str, retries: int = 3):
prompt = build_user_prompt(ref, quote, occasions)
last_err = None
for attempt in range(1, retries + 1):
try:
resp = client.chat.completions.create(
model=model,
messages=[
{"role": "system", "content": SYSTEM_PROMPT},
{"role": "user", "content": prompt},
],
temperature=0.2,
response_format={"type": "json_object"},
)
data = json.loads(resp.choices[0].message.content)
results = data["classifications"]
if len(results) != len(occasions):
raise ValueError(f"Expected {len(occasions)} results, got {len(results)}")
out = []
for expected, r in zip(occasions, results):
if r.get("occasion", "").strip().lower() != expected.strip().lower():
raise ValueError(
f"Occasion mismatch: expected {expected!r}, got {r.get('occasion')!r}"
)
codes = r.get("codes")
if not isinstance(codes, list) or not codes:
raise ValueError(f"Bad codes for {expected!r}: {codes!r}")
if codes == [BONEYARD] or codes == [BONEYARD.lower()]:
out.append((expected, [BONEYARD]))
continue
bad = [c for c in codes if c not in VALID_CODES]
if bad:
raise ValueError(f"Unknown code(s) {bad} for {expected!r}")
out.append((expected, codes))
return out
except Exception as e: # noqa: BLE001
last_err = e
print(f" attempt {attempt}/{retries} failed: {e}", file=sys.stderr)
time.sleep(1.5 * attempt)
raise RuntimeError(f"Giving up classifying {ref}: {last_err}")
# --- Writing new-format files ------------------------------------------------
def next_free_path(out_dir: Path, base_stem: str) -> Path:
"""base_stem e.g. '023.06-WWF' -> first free of 023.06-WWF.txt,
023.06-WWF-b.txt, 023.06-WWF-c.txt, ..."""
candidate = out_dir / f"{base_stem}.txt"
if not candidate.exists():
return candidate
for suffix in "bcdefghijklmnopqrstuvwxyz":
candidate = out_dir / f"{base_stem}-{suffix}.txt"
if not candidate.exists():
return candidate
raise RuntimeError(f"Too many collisions for {base_stem} -- resolve by hand")
def write_category_file(out_dir: Path, stem: str, code: str, ref: str, title: str,
quote: str, occasion: str, prayer_content: str, dry_run: bool) -> Path:
"""prayer_content is the existing prayer text, if any (carried over
verbatim -- this script never rewrites prayer text). Empty string
means no prayer was ever written for this occasion; the file is left
"pending" in the same sense generate_petitions2.py already expects,
so it will still pick this one up."""
base_stem = f"{stem}-{code}"
path = next_free_path(out_dir, base_stem)
body = f"Occasion: {occasion}"
if prayer_content:
body += f"\n{prayer_content}"
content = f"## {ref}\n> {title}\n>> {quote}\n\n{body}\n"
if not dry_run:
path.write_text(content, encoding="utf-8")
return path
def write_boneyard_file(out_dir: Path, stem: str, ref: str, title: str, quote: str,
occasions: list, dry_run: bool) -> Path:
"""occasions is a list of {"text", "content"} dicts. Prayer content
(if any) is carried over so nothing hand-written is lost even for
occasions that didn't fit a category."""
path = out_dir / f"{stem}-{BONEYARD}.txt"
# If it already exists (e.g. rerun), append rather than clobber.
existing = []
if path.exists():
old = parse_file(path.read_text(encoding="utf-8"))
if old:
existing = old["occasions"]
existing_keys = {e["text"].lower() for e in existing}
all_occasions = existing + [o for o in occasions if o["text"].lower() not in existing_keys]
blocks = []
for o in all_occasions:
block = f"Occasion: {o['text']}"
if o["content"]:
block += f"\n{o['content']}"
blocks.append(block)
body = "\n\n".join(blocks)
content = f"## {ref}\n> {title}\n>> {quote}\n\n{body}\n"
if not dry_run:
path.write_text(content, encoding="utf-8")
return path
# --- Main -------------------------------------------------------------------
def main():
parser = argparse.ArgumentParser(
description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter
)
parser.add_argument("in_dir", help="Input directory of old-format .txt files (e.g. old)")
parser.add_argument("out_dir", help="Output directory for new per-category files (e.g. txt)")
parser.add_argument("--pattern", default="*.txt", help="Glob pattern for input files (default: *.txt)")
parser.add_argument("--model", default="gpt-5.4", help="OpenAI model to use (default: gpt-5.4)")
parser.add_argument("--dry-run", action="store_true", help="Show what would happen without writing anything")
args = parser.parse_args()
in_dir = Path(args.in_dir)
out_dir = Path(args.out_dir)
if not in_dir.is_dir():
sys.exit(f"Not a directory: {in_dir}")
if not args.dry_run:
out_dir.mkdir(parents=True, exist_ok=True)
files = sorted(in_dir.glob(args.pattern))
if not files:
sys.exit(f"No files matching {args.pattern} in {in_dir}")
print(f"Found {len(files)} files in {in_dir}")
if args.dry_run:
print("(dry run -- nothing will be written or called)")
print()
total_occasions = 0
total_category_files = 0
total_boneyard = 0
skipped = []
failed = []
for path in files:
text = path.read_text(encoding="utf-8")
parsed = parse_file(text)
if parsed is None:
print(f"SKIP (no recognizable full header): {path.name}")
skipped.append(path.name)
continue
if not parsed["occasions"]:
print(f"SKIP (no occasions found): {path.name}")
skipped.append(path.name)
continue
ref, title, quote = parsed["ref"], parsed["title"], parsed["quote"]
stem = ref_to_filestem(ref)
print(f"{path.name} [Psalm {ref}] ({len(parsed['occasions'])} occasion(s))")
if args.dry_run:
print(" (dry run -- skipping classification call)")
continue
occasion_texts = [o["text"] for o in parsed["occasions"]]
content_by_text = {o["text"]: o["content"] for o in parsed["occasions"]}
try:
results = classify(ref, quote, occasion_texts, args.model)
except Exception as e: # noqa: BLE001
print(f" FAILED: {e}", file=sys.stderr)
failed.append(path.name)
continue
boneyard_occasions = []
for occasion, codes in results:
total_occasions += 1
prayer_content = content_by_text.get(occasion, "")
if codes == [BONEYARD]:
boneyard_occasions.append({"text": occasion, "content": prayer_content})
continue
for code in codes:
out_path = write_category_file(
out_dir, stem, code, ref, title, quote, occasion, prayer_content, args.dry_run
)
total_category_files += 1
has_prayer = " (has prayer)" if prayer_content else " (bare)"
print(f" {code}: {out_path.name}{has_prayer}")
if boneyard_occasions:
out_path = write_boneyard_file(
out_dir, stem, ref, title, quote, boneyard_occasions, args.dry_run
)
total_boneyard += len(boneyard_occasions)
print(f" BONEYARD ({len(boneyard_occasions)}): {out_path.name}")
print()
print(
f"Done. Verses processed: {len(files) - len(skipped) - len(failed)}, "
f"occasions classified: {total_occasions}, "
f"category files written: {total_category_files}, "
f"boneyard occasions: {total_boneyard}"
)
if skipped:
print(f"Skipped {len(skipped)} file(s) (no header/occasions):")
for name in skipped:
print(f" - {name}")
if failed:
print(f"Failed {len(failed)} file(s):")
for name in failed:
print(f" - {name}")
print()
print("Next: hand-review the BONEYARD files, then run the updated")
print("generate_petitions2.py over the new category files in", out_dir)
if __name__ == "__main__":
main()

View File

@ -0,0 +1,127 @@
"""
categories.py
Single source of truth for the book's 10 occasion categories, plus the
BONEYARD holding pen. Imported by classify_occasions.py,
generate_petitions1.py, generate_petitions2.py, generate_latex.py, and
coverage.py so the list only ever needs to change in one place.
Note: MIL (Milestones) is organized by occasion/event rather than by
emotional register, unlike the other categories -- that's intentional. A
reader looking for "wedding" or "new grandchild" is thinking in terms of
the event, not a feeling, so mixing organizing principles across
categories serves findability better than forcing every category onto
one axis.
TMP and DRY, and WON and GRA, are deliberately close cousins -- each pair
was split out of what used to be one overloaded category. TMP is about
the reader's own conduct and character (sin, confession, self-control);
DRY is about the *felt experience* of faith itself going flat, distant,
or restless, without a specific fault attached. WON is cosmic/nature
wonder and awe; GRA is plain, personal, everyday thankfulness. When an
occasion could plausibly sit in either half of a pair, ask: is this
about something the reader DID (TMP) or something they're FEELING (DRY)?
Is this about the world at large (WON) or this reader's own day (GRA)?
Each category is (code, display_name, scope) -- scope is the guidance
given to the model when drafting or classifying occasions for that
category; keep it concrete and a little generous, since it's easier to
cull an over-broad match by hand later than to miss a good one.
"""
from collections import OrderedDict
CATEGORIES = OrderedDict([
("WON", (
"Wonder & Thanksgiving",
"Cosmic and natural wonder: creation, the night sky, being "
"rescued from danger, the sheer scale of the world -- awe at "
"something outside the reader's ordinary day. Compare GRA for "
"plainer, more personal thankfulness.",
)),
("WWF", (
"Weariness, Worry & Fear",
"Everyday burnout, anxiety, sleeplessness, money worry, fear of "
"what's coming, ordinary overload -- ongoing and diffuse, not a "
"single acute event.",
)),
("GUI", (
"Guidance & Decisions",
"Discernment, a big choice, not knowing what to do next, needing "
"direction rather than comfort.",
)),
("CRI", (
"Crisis & Emergency",
"Acute, in-progress trouble: a hospital stay, a deathbed, sudden "
"bad news, holding on hour to hour. Something is actively "
"happening right now, not a lingering state.",
)),
("LOS", (
"Loss",
"Death, funerals, absence, the aftermath of losing someone or "
"something -- the empty-chair, empty-room register, not the "
"crisis of the event itself.",
)),
("MIL", (
"Milestones",
"A specific life passage or event, organized by OCCASION rather "
"than by emotional register: wedding, the arrival of a new child, "
"a new grandchild, graduation, retirement, a new job, a new home, "
"an anniversary. Even a milestone that carries mixed feelings "
"(retirement, a new job) belongs here if the occasion itself is "
"the organizing fact, not the feeling.",
)),
("TMP", (
"Temptation & Self-Examination",
"Pride, envy, broken self-control, confession, disappointment in "
"oneself, mixed motives -- the reader examining their own "
"conduct and character. Something they did, or are tempted to "
"do, not simply a mood. Compare DRY.",
)),
("DRY", (
"Spiritual Dryness & Discontent",
"Restlessness, drifting, discouragement in the life of faith, "
"feeling distant from God, inner turmoil that isn't rooted in a "
"specific fault -- the ache of a faith, or a day, that feels "
"flat or far away. Compare TMP: this is a felt state, not a "
"moral failure to confess.",
)),
("REL", (
"Relationships",
"Positive interactions between two or more people",
)),
("CON", (
"Conflicts ",
"Mistreatment, a hard conversation, having said the wrong thing, "
"caring for someone else who is struggling, the ongoing work of "
"a relationship or a community's repair -- unpleasant "
"interactions between people.",
)),
("GRA", (
"Gratitude",
"Plain, personal thanksgiving: answered prayer, contentment, "
"ordinary blessings, gratitude that's hard to access, remembering "
"past help. This exists alongside WON so a simple 'thank you' "
"for today's coffee isn't crowded out by cosmic awe -- favor "
"inclusion here when an occasion is small and personal rather "
"than vast.",
)),
])
BONEYARD = "BONEYARD"
VALID_CODES = list(CATEGORIES.keys())
def category_name(code: str) -> str:
if code == BONEYARD:
return "Boneyard (uncategorized)"
return CATEGORIES[code][0]
def scope_block() -> str:
"""Formatted for dropping into an LLM prompt."""
lines = []
for code, (name, scope) in CATEGORIES.items():
lines.append(f"{code} -- {name}: {scope}")
return "\n".join(lines)

View File

@ -0,0 +1,608 @@
#!/usr/bin/env python3
"""
generate_latex.py
Converts the finished, category-coded .txt files (one occasion per file,
named CODE-CCC.VV.txt / CODE-CCC.VV-b.txt per the classify_occasions.py /
rename_to_code_first.sh pipeline) into LaTeX. Writes one .tex file per
.txt file, plus a parent main.tex that groups them into chapters by
category (in the fixed order from categories.py, overridable with
--category-order) and \\input{}s them in Psalm-reference order within
each chapter.
Expected per-file format -- a three-line header (reference, hand-written
title, full verse quote), then exactly one "Occasion: ..." entry
followed by its prayer:
## 23:6
> Goodness and Loving Kindness Follow Me
>> Surely goodness and loving kindness shall follow me...
Occasion: Grieving a loved one
Lord, their place at the table is empty --
...
Amen.
(A file with more than one Occasion entry -- e.g. a leftover BONEYARD
holding-pen file -- is skipped; those aren't meant to reach the book.)
Only files whose name starts with one of the 7 valid category codes
(see categories.py) are processed. BONEYARD-*.txt files, and anything
else that doesn't match the CODE-CCC.VV(-suffix).txt pattern, are
skipped automatically -- no need to move them out of the directory
first.
INDEXING: each entry is indexed by its Psalm reference (e.g. "23:6"),
not by occasion topic -- so the back-of-book index answers "where does
this verse appear", which is what matters now that the book itself is
organized by category rather than by Psalm order. The index key uses a
zero-padded numeric sort ("023.006@23:6") so makeindex collates verses
in Psalm order rather than alphabetically; a verse cited in more than
one category naturally collects multiple page numbers under one entry.
The \\Occasion{} macro (define it in your LaTeX preamble) is unchanged
from before -- a visible label above each prayer:
\\newcommand{\\Occasion}[1]{\\textit{Occasion: #1}\\\\[\\smallskipamount]}
Two external LaTeX templates control the output:
template.tex (--template) -- one devotion/page. Placeholders:
[[NUM]] sequential devotion number, in FINAL BOOK ORDER
(grouped by category, then by Psalm reference) --
NOT file/directory order.
[[TITLE]] the OCCASION text, title-cased (e.g. "When I'm Simply
Tired") -- this drives the page heading and the
nested TOC entry via \\psalmentry. The hand-written
devotion title (the '>' header line) is no longer
used anywhere in the rendered book.
[[REF]] Psalm chapter:verse
[[VERSE]] the verse quote
[[OCCASIONS]] carries ONLY the (invisible) Psalm-reference \\index{}
call for this entry -- no visible text. (This
placeholder's name predates several rounds of
repurposing; it no longer has anything to do with
"occasions" or a visible title caption.) The template
must include [[OCCASIONS]] somewhere or the verse
won't appear in the index at all.
[[PRAYER]] the prayer body only (no label, no index)
main-template.tex (--main-template) -- the book shell. Copied verbatim
to latex/main.tex on every run -- it has no [[INPUTS]] placeholder
anymore. Instead, it should contain a literal \\input{inputs} where
the prayers belong; this script manages the SEPARATE file
latex/inputs.tex:
- If inputs.tex does not exist yet, it's generated fresh: chapter
headings (one per category with entries, in the order from
categories.py, overridable with --category-order) with
\\input{} lines beneath each, in Psalm-reference order. The
chapter heading macro defaults to \\chapter{...} -- override
with --category-macro if your document class wants \\part{...}
or a custom heading command instead.
- If inputs.tex already exists, it is left completely untouched --
edit it by hand any time to fine-tune the order (within or
across categories); reruns of this script will never overwrite
your edits. Numbering ([[NUM]] below) follows whatever order is
actually in inputs.tex, not the script's own default sort.
Entries found in txt_dir but not yet mentioned in inputs.tex
still get their .tex file generated (so it's ready to use) and
are appended at the end with a provisional number, but are
reported clearly so you know to place them by hand.
\\input{} lines pointing at files that no longer exist in
txt_dir are reported as stale (would break the build) but never
silently removed.
Usage:
python generate_latex.py txt latex
python generate_latex.py txt latex --category-macro part
python generate_latex.py txt latex --category-order WWF,CRI,LOS,GUI,TMP,REL,WON
"""
import argparse
import re
import sys
from pathlib import Path
from categories import CATEGORIES, VALID_CODES, category_name
# --- Parsing ----------------------------------------------------------------
HEADER_RE = re.compile(
r"^(?P<ref>##\s*\S+)[ \t]*\n"
r">(?!>)[ \t]*(?P<title>[^\n]*)\n"
r">>[ \t]*(?P<quote>[^\n]*)\n"
)
OLD_HEADER_RE = re.compile(r"^(?P<ref>##\s*\S+)[ \t]*\n>(?!>)[ \t]*(?P<quote>[^\n]*)\n")
OCCASION_LINE_RE = re.compile(r"(?m)^Occasion:[ \t]*(?P<text>.+)$")
# CODE-CCC.VV.txt or CODE-CCC.VV-b.txt (verse may be 2 or 3 digits, for
# Psalm 119). Anything not matching this, or whose code isn't one of the
# 7 valid categories, is skipped.
FILENAME_RE = re.compile(r"^(?P<code>[A-Z]+)-(?P<chapter>\d{3})\.(?P<verse>\d{2,3})(?:-[a-z])?\.txt$")
# Parses the ref as WRITTEN IN THE FILE HEADER (e.g. "23:6", "139:23-24")
# for sorting and index-key purposes -- more authoritative than the
# filename, and handles verse ranges by sorting on the first number.
REF_RE = re.compile(r"^(?P<chapter>\d+):(?P<verse>\d+)")
def strip_comment_lines(text: str) -> str:
lines = text.split("\n")
out = []
in_block = False
for ln in lines:
stripped = ln.strip()
if not in_block and stripped == "%v":
in_block = True
continue
if in_block:
if stripped == "%^":
in_block = False
continue
if ln.lstrip().startswith("%"):
continue
out.append(ln)
return "\n".join(out)
def parse_ref(ref_line: str) -> str:
return ref_line.lstrip("#").strip()
def ref_sort_key(ref: str):
"""'23:6' -> (23, 6). '139:23-24' -> (139, 23). Falls back to (9999, 9999)
(sorts last) if the ref doesn't parse, rather than crashing the whole run."""
m = REF_RE.match(ref)
if not m:
return (9999, 9999)
return (int(m.group("chapter")), int(m.group("verse")))
def parse_file(text: str):
"""Returns one of:
{"style": "ok", ref, title, quote, entries: [{"occasion", "text"}]}
{"style": "needs_title", ref}
{"style": "no_occasions", ref}
{"style": "incomplete", ref, missing}
{"style": "multi_occasion", ref} -- more than one Occasion line;
not expected in the final
per-category file layout
None
"""
text = strip_comment_lines(text)
stripped = text.lstrip("\n")
m = HEADER_RE.match(stripped)
if not m:
old_m = OLD_HEADER_RE.match(stripped)
if old_m:
return {"style": "needs_title", "ref": parse_ref(old_m.group("ref"))}
return None
ref = parse_ref(m.group("ref"))
title = m.group("title").strip()
quote = m.group("quote").strip()
body = text[m.end():]
matches = list(OCCASION_LINE_RE.finditer(body))
if not matches:
return {"style": "no_occasions", "ref": ref}
if len(matches) > 1:
return {"style": "multi_occasion", "ref": ref}
entries = []
missing = []
for i, mo in enumerate(matches):
occasion = mo.group("text").strip()
start = mo.end()
end = matches[i + 1].start() if i + 1 < len(matches) else len(body)
prayer_text = body[start:end].strip()
if not prayer_text:
missing.append(occasion)
entries.append({"occasion": occasion, "text": prayer_text})
if missing:
return {"style": "incomplete", "ref": ref, "missing": missing}
return {"style": "ok", "ref": ref, "title": title, "quote": quote, "entries": entries}
# --- Title casing --------------------------------------------------------
_MINOR_WORDS = {
"a", "an", "and", "as", "at", "but", "by", "en", "for", "if", "in",
"nor", "of", "on", "or", "per", "the", "to", "v", "via", "vs",
}
def _title_case_word(word: str) -> str:
"""Capitalize a word's first letter, lowercase the rest -- crucially
WITHOUT capitalizing a letter after an apostrophe, so "i'm" becomes
"I'm", not "I'M" (which str.title() gets wrong)."""
i = 0
while i < len(word) and not word[i].isalpha():
i += 1
if i >= len(word):
return word
return word[:i] + word[i].upper() + word[i + 1:].lower()
def title_case(text: str) -> str:
"""Standard title-case rules: capitalize every word except a small
set of articles/conjunctions/short prepositions, which stay
lowercase UNLESS they're the first or last word. Handles
contractions and possessives correctly (see _title_case_word)."""
words = text.split(" ")
out = []
for idx, w in enumerate(words):
bare = re.sub(r"[^a-zA-Z']", "", w).lower()
if 0 < idx < len(words) - 1 and bare in _MINOR_WORDS:
out.append(w.lower())
else:
out.append(_title_case_word(w))
return " ".join(out)
# --- LaTeX escaping -----------------------------------------------------
_LATEX_ESCAPES = [
("\\", r"\textbackslash{}"),
("&", r"\&"),
("%", r"\%"),
("$", r"\$"),
("#", r"\#"),
("_", r"\_"),
("{", r"\{"),
("}", r"\}"),
("~", r"\textasciitilde{}"),
("^", r"\textasciicircum{}"),
]
def escape_latex(s: str) -> str:
out = []
for ch in s:
replaced = False
for orig, repl in _LATEX_ESCAPES:
if ch == orig:
out.append(repl)
replaced = True
break
if not replaced:
out.append(ch)
return "".join(out)
def split_blocks(text: str):
return [b.strip() for b in re.split(r"\n\s*\n", text.strip()) if b.strip()]
# --- LaTeX rendering ----------------------------------------------------
def render_prayer(entry: dict) -> str:
"""Prayer body only. No occasion label, no index -- those live in
render_occasion_label, which fills the separate [[OCCASIONS]]
placeholder (shown above the verse quote, per the template's layout)."""
stanzas = split_blocks(entry["text"])
stanza_texts = []
for stanza in stanzas:
raw_lines = [ln.strip() for ln in stanza.split("\n") if ln.strip()]
esc_lines = [escape_latex(ln) for ln in raw_lines]
stanza_texts.append(" \\\\\n".join(esc_lines))
body = " \\\\[\\medskipamount]\n".join(stanza_texts)
return "\\noindent " + body
def render_ref_index(ref: str) -> str:
"""\\index{023.006@23:6} -- padded numeric sort key so makeindex
collates in Psalm order, '@' display text is the ref as written."""
chapter, verse = ref_sort_key(ref)
sort_key = f"{chapter:03d}.{verse:03d}"
disp = escape_latex(ref)
return f"\\index{{{sort_key}@{disp}}}"
PRAYER_DIVIDER = "\n\\begin{center}\\textasteriskcentered\\end{center}\n"
PLACEHOLDERS = ("[[NUM]]", "[[TITLE]]", "[[REF]]", "[[VERSE]]", "[[OCCASIONS]]", "[[PRAYER]]")
def render_entry_tex(number: int, parsed: dict, template: str) -> str:
# The page heading and TOC entry (fed via [[TITLE]] into \psalmentry's
# second arg) are the OCCASION, title-cased -- the hand-written
# devotion title (the '>' header line) is no longer used anywhere in
# the rendered book at all. If a file somehow has more than one
# occasion (not expected in the current one-occasion-per-file
# layout), the first one's occasion becomes the page heading, since a
# page can only have one heading.
heading_esc = escape_latex(title_case(parsed["entries"][0]["occasion"]))
ref_esc = escape_latex(parsed["ref"])
quote_esc = escape_latex(parsed["quote"])
prayer_tex = PRAYER_DIVIDER.join(render_prayer(e) for e in parsed["entries"])
# [[OCCASIONS]] now carries ONLY the invisible Psalm-reference index
# call -- no visible text -- so the template doesn't need editing,
# but the placeholder must still be present somewhere in it.
ref_index_tex = render_ref_index(parsed["ref"])
out = template
out = out.replace("[[NUM]]", str(number))
out = out.replace("[[TITLE]]", heading_esc)
out = out.replace("[[REF]]", ref_esc)
out = out.replace("[[VERSE]]", quote_esc)
out = out.replace("[[OCCASIONS]]", ref_index_tex)
out = out.replace("[[PRAYER]]", prayer_tex)
leftover = re.findall(r"\[\[[A-Z]+\]\]", out)
if leftover:
print(f" warning: unrecognized placeholder(s) left in template: {sorted(set(leftover))}", file=sys.stderr)
if not out.endswith("\n"):
out += "\n"
return out
def render_inputs_block(grouped: "OrderedDictType", category_macro: str) -> str:
"""grouped: ordered mapping of code -> list of basenames (already in
Psalm-reference order), for categories that have at least one entry.
Returns the raw chapter+\\input{} block -- this is what gets written
to inputs.tex when it doesn't exist yet, NOT injected into main.tex
directly (main.tex now \\input{}s inputs.tex itself, per the
template)."""
blocks = []
for code, basenames in grouped.items():
if not basenames:
continue
name = category_name(code)
heading = f"\\{category_macro}{{{escape_latex(name)}}}"
inputs = "\n".join(f"\\input{{{name_}}}" for name_ in basenames)
blocks.append(f"{heading}\n{inputs}")
text = "\n\n".join(blocks)
if not text.endswith("\n"):
text += "\n"
return text
INPUT_LINE_RE = re.compile(r"\\input\{(?P<name>[^}]+)\}")
CHAPTER_LINE_RE = re.compile(r"\\(?:chapter|part|section)\*?\{(?P<name>[^}]*)\}")
def parse_inputs_tex(text: str, code_by_name: dict) -> tuple:
"""Parses an EXISTING (hand-edited) inputs.tex to recover the actual
final order. Returns (ordered_basenames, mismatches) where
mismatches is a list of (basename, expected_code, chapter_context)
for any \\input{} that appears under a chapter heading whose name
doesn't match that file's own category code -- a likely sign of an
accidental drag-and-drop during reordering, reported but never
auto-fixed."""
ordered = []
mismatches = []
current_chapter_code = None
for line in text.split("\n"):
cm = CHAPTER_LINE_RE.search(line)
if cm:
current_chapter_code = code_by_name.get(cm.group("name").strip())
continue
im = INPUT_LINE_RE.search(line)
if im:
name = im.group("name").strip()
ordered.append(name)
file_code = name.split("-", 1)[0]
if current_chapter_code and file_code != current_chapter_code:
mismatches.append((name, file_code, current_chapter_code))
return ordered, mismatches
# --- Main -----------------------------------------------------------------
def main():
from collections import OrderedDict
parser = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter)
parser.add_argument("txt_dir", nargs="?", default="txt", help="Input directory of .txt files (default: txt)")
parser.add_argument("latex_dir", nargs="?", default="latex", help="Output directory for .tex files (default: latex)")
parser.add_argument("--pattern", default="*.txt", help="Glob pattern for input files (default: *.txt)")
parser.add_argument("--template", default="template-prayer.tex", help="Path to the per-entry LaTeX template (default: template-prayer.tex)")
parser.add_argument("--main-template", default="template-main.tex", help="Path to the main.tex template (default: template-main.tex)")
parser.add_argument("--category-macro", default="chapter", help="LaTeX heading macro for each category, without backslash (default: chapter)")
parser.add_argument(
"--category-order", default=None,
help="Comma-separated category codes for book order, e.g. WWF,CRI,LOS,GUI,TMP,REL,WON "
"(default: the order defined in categories.py)",
)
args = parser.parse_args()
txt_dir = Path(args.txt_dir)
latex_dir = Path(args.latex_dir)
template_path = Path(args.template)
main_template_path = Path(args.main_template)
if not txt_dir.is_dir():
sys.exit(f"Not a directory: {txt_dir}")
if not template_path.is_file():
sys.exit(f"Template not found: {template_path}")
if not main_template_path.is_file():
sys.exit(f"Main template not found: {main_template_path}")
latex_dir.mkdir(parents=True, exist_ok=True)
if args.category_order:
order = [c.strip().upper() for c in args.category_order.split(",")]
bad = [c for c in order if c not in VALID_CODES]
if bad:
sys.exit(f"Unknown category code(s) in --category-order: {bad}")
else:
order = list(CATEGORIES.keys())
template = template_path.read_text(encoding="utf-8")
missing = [p for p in PLACEHOLDERS if p not in template]
if missing:
print(f"Note: entry template doesn't use these placeholders: {missing}", file=sys.stderr)
main_template = main_template_path.read_text(encoding="utf-8")
files = sorted(txt_dir.glob(args.pattern))
if not files:
sys.exit(f"No files matching {args.pattern} in {txt_dir}")
print(f"Found {len(files)} files in {txt_dir}")
# code -> list of {"path", "parsed", "ref_key"}
by_category = OrderedDict((c, []) for c in order)
skipped = []
ignored_filename = []
for path in files:
m = FILENAME_RE.match(path.name)
if not m or m.group("code") not in VALID_CODES:
ignored_filename.append(path.name)
continue
code = m.group("code")
if code not in by_category:
# Valid code, but not included in --category-order -- treat
# like any other skip rather than silently dropping it.
print(f"SKIP (category {code} not in --category-order): {path.name}")
skipped.append(path.name)
continue
text = path.read_text(encoding="utf-8")
parsed = parse_file(text)
if parsed is None:
print(f"SKIP (no recognizable header found): {path.name}")
skipped.append(path.name)
continue
if parsed["style"] == "needs_title":
print(f"SKIP (needs a title line added -- old two-line header) [{parsed['ref']}]: {path.name}")
skipped.append(path.name)
continue
if parsed["style"] == "no_occasions":
print(f"SKIP (no Occasion line) [{parsed['ref']}]: {path.name}")
skipped.append(path.name)
continue
if parsed["style"] == "multi_occasion":
print(f"SKIP (more than one Occasion line -- looks like a BONEYARD-style file) [{parsed['ref']}]: {path.name}")
skipped.append(path.name)
continue
if parsed["style"] == "incomplete":
print(f"SKIP (occasion with no prayer yet) [{parsed['ref']}]: {path.name}")
for o in parsed["missing"]:
print(f" missing: {o}")
skipped.append(path.name)
continue
by_category[code].append({"path": path, "parsed": parsed, "ref_key": ref_sort_key(parsed["ref"])})
if ignored_filename:
print(f"\nIgnored {len(ignored_filename)} file(s) not matching CODE-CCC.VV(-suffix).txt "
f"with a valid category (e.g. BONEYARD-*.txt):")
for name in ignored_filename[:10]:
print(f" - {name}")
if len(ignored_filename) > 10:
print(f" ... and {len(ignored_filename) - 10} more")
# Sort each category's entries by Psalm reference.
for code in by_category:
by_category[code].sort(key=lambda e: e["ref_key"])
print()
print("Category breakdown (all valid entries found in txt/):")
total = 0
for code in order:
n = len(by_category[code])
total += n
print(f" {code:4s} {category_name(code):32s} {n}")
print(f" {'':4s} {'TOTAL':32s} {total}")
print()
# Flat lookup of every valid entry, keyed by basename, plus the
# default fallback order (category order, then Psalm ref) -- used
# either to seed a fresh inputs.tex, or to provisionally place any
# entry the hand-edited inputs.tex doesn't mention yet.
entry_by_basename = {}
default_order = []
for code in order:
for item in by_category[code]:
basename = item["path"].stem
entry_by_basename[basename] = item
default_order.append(basename)
inputs_path = latex_dir / "inputs.tex"
code_by_name = {category_name(c): c for c in VALID_CODES}
if not inputs_path.exists():
grouped = OrderedDict((c, [item["path"].stem for item in by_category[c]]) for c in order)
inputs_path.write_text(render_inputs_block(grouped, args.category_macro), encoding="utf-8")
final_order = list(default_order)
print(f"No inputs.tex found -- generated a fresh one at {inputs_path} "
f"from the default category/Psalm order.")
print("Edit it by hand any time to fine-tune ordering -- future runs will")
print("leave your edits alone as long as the file exists.")
else:
existing_text = inputs_path.read_text(encoding="utf-8")
parsed_order, mismatches = parse_inputs_tex(existing_text, code_by_name)
print(f"Found existing {inputs_path} -- honoring its order, NOT regenerating it.")
print("(delete it if you want a fresh default ordering)")
seen = set()
final_order = []
stale = []
for basename in parsed_order:
if basename in seen:
print(f" note: {basename} is \\input{{}} more than once in inputs.tex -- using its first occurrence")
continue
seen.add(basename)
if basename not in entry_by_basename:
stale.append(basename)
continue
final_order.append(basename)
missing_from_inputs = [b for b in default_order if b not in seen]
if stale:
print(f"\n WARNING -- {len(stale)} \\input{{}} line(s) in inputs.tex point to files "
f"that no longer exist in {txt_dir}/ (would break the build if left in):")
for name in stale:
print(f" - {name}")
if mismatches:
print(f"\n note -- {len(mismatches)} entr{'y' if len(mismatches) == 1 else 'ies'} in inputs.tex "
f"sit under a chapter that doesn't match their own category code:")
for name, file_code, chapter_code in mismatches:
print(f" - {name} (file is {file_code}, but listed under {chapter_code}'s chapter)")
if missing_from_inputs:
print(f"\n {len(missing_from_inputs)} entr{'y' if len(missing_from_inputs) == 1 else 'ies'} in "
f"{txt_dir}/ not yet placed in inputs.tex -- added at the end, provisionally numbered "
f"(add a \\input{{}} line by hand to place properly):")
for name in missing_from_inputs:
print(f" - {name}")
final_order.extend(missing_from_inputs)
print()
number = 0
for basename in final_order:
item = entry_by_basename[basename]
number += 1
tex = render_entry_tex(number, item["parsed"], template)
out_path = latex_dir / (basename + ".tex")
out_path.write_text(tex, encoding="utf-8")
main_tex = main_template
leftover = re.findall(r"\[\[[A-Z]+\]\]", main_tex)
if leftover:
print(f"warning: unrecognized placeholder(s) left in main template: {sorted(set(leftover))}", file=sys.stderr)
(latex_dir / "main.tex").write_text(main_tex, encoding="utf-8")
print(f"Wrote {number} entry files to {latex_dir}/ (numbered per inputs.tex order), plus main.tex")
if skipped:
print(f"Skipped {len(skipped)} file(s) with parse problems:")
for name in skipped:
print(f" - {name}")
print()
print("To build: cd into the latex dir and run pdflatex twice, then")
print("makeindex main, then pdflatex twice more, to resolve the TOC")
print("and the Psalm-reference index.")
if __name__ == "__main__":
main()

View File

@ -0,0 +1,121 @@
\chapter{Wonder \& Thanksgiving}
\input{WON-008.04}
\input{WON-018.02}
\input{WON-019.01}
\input{WON-024.01}
\input{WON-139.14}
\input{WON-147.04}
\input{WON-150.06}
\chapter{Weariness, Worry \& Fear}
\input{WWF-001.03}
\input{WWF-004.08}
\input{WWF-005.03}
\input{WWF-006.02}
\input{WWF-016.11}
\input{WWF-019.14}
\input{WWF-023.02}
\input{WWF-037.25}
\input{WWF-046.01}
\input{WWF-130.05}
\input{WWF-131.02}
\input{WWF-142.04}
\chapter{Guidance \& Decisions}
\input{GUI-020.04}
\input{GUI-025.04}
\input{GUI-027.01}
\input{GUI-032.08}
\input{GUI-034.08}
\input{GUI-039.04}
\input{GUI-082.08}
\input{GUI-090.12}
\input{GUI-119.105}
\input{GUI-143.10}
\chapter{Crisis \& Emergency}
\input{CRI-023.06}
\input{CRI-027.14}
\input{CRI-055.05}
\input{CRI-056.03}
\input{CRI-061.02}
\input{CRI-073.26}
\input{CRI-090.01}
\input{CRI-112.07}
\chapter{Loss}
\input{LOS-006.06}
\input{LOS-027.10}
\input{LOS-034.18}
\input{LOS-068.05}
\input{LOS-088.03}
\input{LOS-088.18}
\input{LOS-102.01}
\input{LOS-145.09}
\input{LOS-139.13}
\chapter{Milestones}
\input{MIL-037.05}
\input{MIL-071.09}
\input{MIL-071.17}
\input{MIL-103.17}
\input{MIL-127.03}
\input{MIL-128.01}
\chapter{Temptation \& Self-Examination}
\input{TMP-037.07}
\input{TMP-040.02}
\input{TMP-046.10}
\input{TMP-051.10}
\input{TMP-055.22}
\input{TMP-086.05}
\input{TMP-090.17}
\input{TMP-103.01}
\input{TMP-103.12}
\input{TMP-103.14}
\input{TMP-119.131}
\input{TMP-139.23}
\chapter{Spiritual Dryness \& Discontent}
\input{DRY-027.04}
\input{DRY-042.01}
\input{DRY-042.05}
\input{DRY-084.02}
\input{DRY-092.12}
\input{DRY-094.19}
\input{DRY-100.05}
\input{DRY-136.01}
\input{DRY-143.08}
\chapter{Relationships}
\input{REL-041.09}
\input{REL-051.17}
\input{REL-062.08}
\input{REL-078.04}
\input{REL-091.05}
\input{REL-103.10}
\input{REL-127.01}
\input{REL-141.03}
\chapter{Conflicts }
\input{CON-001.01}
\input{CON-004.01}
\input{CON-004.04}
\input{CON-016.08}
\input{CON-059.16}
\input{CON-133.01}
\chapter{Gratitude}
\input{GRA-023.01}
\input{GRA-028.07}
\input{GRA-030.05}
\input{GRA-037.04}
\input{GRA-065.11}
\input{GRA-090.14}
\input{GRA-095.01}
\input{GRA-103.02}
\input{GRA-104.33}
\input{GRA-107.01}
\input{GRA-116.12}
\input{GRA-118.24}
\input{GRA-143.08}

View File

@ -0,0 +1,131 @@
\documentclass[10pt]{book}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{ebgaramond}
\usepackage[paperwidth=6in,paperheight=9in,margin=0.8in]{geometry}
\usepackage{makeidx}
\usepackage{fancyhdr}
\makeindex
\renewcommand{\indexname}{Index of Psalm References}
\title{Prayer 101: Prayers for Daily Life \\[0.5em]
\large 101 Devotional Prayers for Every Occasion}
\author{George Marin}
\date{}
% Each prayer's entry: heading on its own page, plus a nested TOC line
% under its chapter (category), formatted "NUM. TITLE (Ps. REF)" to
% match the reference style used in the verse quote itself.
\newcommand{\psalmentry}[3]{%
\clearpage%
\section*{#1.\ #2}%
\addcontentsline{toc}{section}{#1.\ #2\ (Ps.~#3)}%
\vspace{0.5em}%
}
\newenvironment{versequote}{\begin{quote}\itshape}{\end{quote}}
% Chapter title + page number in the footer, header left empty. Regular
% content pages: chapter name on the left, page number on the right.
% "plain"-style pages (every chapter-opening page, automatically, plus
% the TOC/index first page) show just a centered page number, matching
% normal book convention of not repeating a chapter name on the page
% that already prominently displays it. These are style DEFINITIONS
% only -- \pagestyle{fancy} itself is activated at \mainmatter below, so
% it doesn't touch the front matter's own (already-correct) page styles.
\fancyhf{}
\fancyfoot[L]{\leftmark}
\fancyfoot[R]{\thepage}
\renewcommand{\headrulewidth}{0pt}
\fancypagestyle{plain}{%
\fancyhf{}%
\fancyfoot[C]{\thepage}%
\renewcommand{\headrulewidth}{0pt}%
}
% Table of contents doesn't set a running head the way \chapter does (it's
% typeset as a starred heading), so it gets its own named style rather than
% relying on \leftmark -- applies to every page the TOC spans, not just
% the first, since \pagestyle{} (not \thispagestyle{}) persists.
\fancypagestyle{toc}{%
\fancyhf{}%
\fancyfoot[L]{\contentsname}%
\fancyfoot[R]{\thepage}%
\renewcommand{\headrulewidth}{0pt}%
}
% \cleardoublepage (called internally by \frontmatter/\mainmatter/\backmatter
% in this two-sided book) inserts a blank filler page when needed so the
% next part starts on a recto page -- but by default it does NOT suppress
% the page style on that filler page, so our footer would otherwise show up
% on an otherwise-blank page. Force that filler page to plain/empty.
\let\origcleardoublepage\cleardoublepage
\renewcommand{\cleardoublepage}{%
\clearpage
{\pagestyle{empty}\origcleardoublepage}%
}
\begin{document}
\frontmatter
\maketitle
% \maketitle sets thispagestyle{empty} on the title page automatically,
% so no folio prints there even though the (hidden) roman-numeral
% counter is running underneath.
\thispagestyle{empty}
\vspace*{\fill}
\noindent Prayers for Daily Life
\medskip
\noindent Copyright \textcopyright\ 2026 by George Marin
\noindent All rights reserved.
\medskip
\noindent No part of this publication may be reproduced, distributed,
or transmitted in any form or by any means, including photocopying,
recording, or other electronic or mechanical methods, without the
prior written permission of the publisher, except in the case of
brief quotations embodied in critical reviews and certain other
noncommercial uses permitted by copyright law.
\medskip
\noindent Scripture quotations are taken from the \textit{World English Bible}, British Edition (WEBBE),
a modern English translation dedicated to the public domain by its translators.
No permission is required for its use.
\medskip
\noindent Published by Zebedee Press
\noindent ISBN: 000-0-000000-00-0 % TODO: replace with the assigned ISBN before publication
\noindent First Edition
\vspace*{\fill}
\clearpage
% Title and copyright pages carry no visible folio, but the page counter
% still silently advances through them (thispagestyle{empty} only hides
% the PRINTED number, it doesn't stop the counter) -- reset it here so
% the table of contents itself starts at "i", not "iii".
\setcounter{page}{1}
\pagestyle{toc}
\tableofcontents
% \tableofcontents calls \thispagestyle{plain} internally on its own
% first page (same mechanism \chapter uses) -- override that back to
% our footer style for this specific page; any overflow page benefits
% from \pagestyle{toc} above without needing this.
\thispagestyle{toc}
\input{template-foreward}
\mainmatter
\pagestyle{fancy}
\input{inputs}
\backmatter
\clearpage
\addcontentsline{toc}{chapter}{\indexname}
\printindex
\end{document}

View File

@ -0,0 +1,14 @@
#!/bin/bash
set -e
rm -f main.aux main.idx main.ilg main.ind main.ind main.log main.pdf main.toc $DEPOT/main.pdf
for p in CON CRI DRY GRA GUI LOS MIL REL TMP WON WWF
do
rm $p*.tex
done
python3 generate_latex.py ../txt . --template template-prayer.tex --main-template template-main.tex
pdflatex main
makeindex main
pdflatex main
pdflatex main
cp main.pdf "$DEPOT/main-$(date +%Y.%m.%d-%H%M).pdf"

View File

@ -0,0 +1,44 @@
\chapter*{Foreword}
\addcontentsline{toc}{chapter}{Foreword}
\noindent I didn't set out to write a hundred and one prayers.
I set out to write the ones I needed and couldn't find ---
short enough to pray before the day got away from me,
plain enough that I wasn't translating my own life into churchier language before I brought them to God.
\medskip
\noindent Somewhere past the first dozen I noticed a pattern:
almost every hard morning, every long night, every ordinary Tuesday
turned out to rhyme with something a psalmist had already said three thousand years ago.
Weariness, worry, envy, gratitude, grief, the particular ache of a decision you can't quite make ---
none of it is new.
\medskip
\noindent So this book borrows their voice.
Each prayer opens with a verse from the Psalms and stays close to it,
but with present-day concerns. You'll notice they're specific ---
a wristband, a gurney, plastic bins after a storm. I've written them this way on purpose.
A prayer that stays too general, ``Lord, help me in my trouble,'' rarely moves anyone,
because it asks for nothing you can actually picture.
But a prayer that is \textit{too} specific runs a different risk:
what if your trouble doesn't look quite like mine?
\medskip
\noindent So hold these loosely. Think of each one less as a script to recite word for word,
and more as an aperture --- a way of opening your imagination onto something
you already recognize, even if the details differ from your own.
Let your words take over where mine leave off.
\medskip
\noindent Scripture quotations throughout are drawn from the \textit{World English Bible},
a modern and freely available public domain translation,
with one small and consistent adjustment:
I've used the traditional rendering ``the LORD'' in place of the divine name ``Yahweh,''
simply because it's what most of us are used to.
\medskip
\noindent Wherever you are today --- weary, waiting, grateful, undone ---
my prayer is that you'll find something here that meets you there.
\bigskip
\noindent George Marin

View File

@ -0,0 +1,131 @@
\documentclass[10pt]{book}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{ebgaramond}
\usepackage[paperwidth=6in,paperheight=9in,margin=0.8in]{geometry}
\usepackage{makeidx}
\usepackage{fancyhdr}
\makeindex
\renewcommand{\indexname}{Index of Psalm References}
\title{Prayer 101: Prayers for Daily Life \\[0.5em]
\large 101 Devotional Prayers for Every Occasion}
\author{George Marin}
\date{}
% Each prayer's entry: heading on its own page, plus a nested TOC line
% under its chapter (category), formatted "NUM. TITLE (Ps. REF)" to
% match the reference style used in the verse quote itself.
\newcommand{\psalmentry}[3]{%
\clearpage%
\section*{#1.\ #2}%
\addcontentsline{toc}{section}{#1.\ #2\ (Ps.~#3)}%
\vspace{0.5em}%
}
\newenvironment{versequote}{\begin{quote}\itshape}{\end{quote}}
% Chapter title + page number in the footer, header left empty. Regular
% content pages: chapter name on the left, page number on the right.
% "plain"-style pages (every chapter-opening page, automatically, plus
% the TOC/index first page) show just a centered page number, matching
% normal book convention of not repeating a chapter name on the page
% that already prominently displays it. These are style DEFINITIONS
% only -- \pagestyle{fancy} itself is activated at \mainmatter below, so
% it doesn't touch the front matter's own (already-correct) page styles.
\fancyhf{}
\fancyfoot[L]{\leftmark}
\fancyfoot[R]{\thepage}
\renewcommand{\headrulewidth}{0pt}
\fancypagestyle{plain}{%
\fancyhf{}%
\fancyfoot[C]{\thepage}%
\renewcommand{\headrulewidth}{0pt}%
}
% Table of contents doesn't set a running head the way \chapter does (it's
% typeset as a starred heading), so it gets its own named style rather than
% relying on \leftmark -- applies to every page the TOC spans, not just
% the first, since \pagestyle{} (not \thispagestyle{}) persists.
\fancypagestyle{toc}{%
\fancyhf{}%
\fancyfoot[L]{\contentsname}%
\fancyfoot[R]{\thepage}%
\renewcommand{\headrulewidth}{0pt}%
}
% \cleardoublepage (called internally by \frontmatter/\mainmatter/\backmatter
% in this two-sided book) inserts a blank filler page when needed so the
% next part starts on a recto page -- but by default it does NOT suppress
% the page style on that filler page, so our footer would otherwise show up
% on an otherwise-blank page. Force that filler page to plain/empty.
\let\origcleardoublepage\cleardoublepage
\renewcommand{\cleardoublepage}{%
\clearpage
{\pagestyle{empty}\origcleardoublepage}%
}
\begin{document}
\frontmatter
\maketitle
% \maketitle sets thispagestyle{empty} on the title page automatically,
% so no folio prints there even though the (hidden) roman-numeral
% counter is running underneath.
\thispagestyle{empty}
\vspace*{\fill}
\noindent Prayers for Daily Life
\medskip
\noindent Copyright \textcopyright\ 2026 by George Marin
\noindent All rights reserved.
\medskip
\noindent No part of this publication may be reproduced, distributed,
or transmitted in any form or by any means, including photocopying,
recording, or other electronic or mechanical methods, without the
prior written permission of the publisher, except in the case of
brief quotations embodied in critical reviews and certain other
noncommercial uses permitted by copyright law.
\medskip
\noindent Scripture quotations are taken from the \textit{World English Bible}, British Edition (WEBBE),
a modern English translation dedicated to the public domain by its translators.
No permission is required for its use.
\medskip
\noindent Published by Zebedee Press
\noindent ISBN: 000-0-000000-00-0 % TODO: replace with the assigned ISBN before publication
\noindent First Edition
\vspace*{\fill}
\clearpage
% Title and copyright pages carry no visible folio, but the page counter
% still silently advances through them (thispagestyle{empty} only hides
% the PRINTED number, it doesn't stop the counter) -- reset it here so
% the table of contents itself starts at "i", not "iii".
\setcounter{page}{1}
\pagestyle{toc}
\tableofcontents
% \tableofcontents calls \thispagestyle{plain} internally on its own
% first page (same mechanism \chapter uses) -- override that back to
% our footer style for this specific page; any overflow page benefits
% from \pagestyle{toc} above without needing this.
\thispagestyle{toc}
\input{template-foreward}
\mainmatter
\pagestyle{fancy}
\input{inputs}
\backmatter
\clearpage
\addcontentsline{toc}{chapter}{\indexname}
\printindex
\end{document}

View File

@ -0,0 +1,7 @@
\psalmentry{[[NUM]]}{[[TITLE]]}{[[REF]]}
[[OCCASIONS]]
\begin{versequote}
[[VERSE]] (Ps.~[[REF]])
\end{versequote}
[[PRAYER]]\enspace$\dagger$

View File

@ -0,0 +1,301 @@
#!/usr/bin/env python3
"""
revise_prayers.py
PASS B of the migration: run this after classify_occasions.py has split
the old prayers out into per-category files in ./txt. This script does
NOT generate new prayers and does NOT rewrite for style. It is a narrow,
conservative revision pass that checks each already-written prayer
against a fixed checklist of specific, recurring issues caught by hand
across many editing sessions on this project -- and edits ONLY what the
checklist flags. Anything not flagged is left untouched, verbatim.
The checklist (also embedded in the prompt below):
1. Two over-used "default" stanzas -- the discernment couplet
("Show me what to tend / and what to lay down...") and the
community stanza ("Bring me near steady/quiet/sturdy people...")
-- should only appear when the occasion is genuinely ABOUT sorting/
discernment (1) or isolation (2). If either shows up in a prayer
whose occasion isn't really about that, and it's not doing real
specific work for THIS occasion, cut or replace it.
2. Known recurring stock phrases across the collection -- flag and
replace (not just reword): "I know how fast/quickly...", "the
phone keeps ringing", "call fear wisdom" / "call ... prudence",
"cracks by noon", and close variants of any of these.
3. Mixed imagery: a prayer should commit to ONE governing image system
(water, fire, weight, light, a room, etc.) and stay inside it. If
multiple unrelated image systems appear, resolve to the strongest
one and rewrite the others to match it.
4. "You" / "Your" / "Yourself" (addressing God) capitalized
consistently throughout.
5. Typos and grammar.
This is intentionally NOT a full style pass -- it will not touch a
prayer's voice, line breaks, ending device, or anything not on this
list, even if it could plausibly be improved. The goal is consistency
across the whole collection, not re-polishing prayers that already
work.
Only files with existing prayer content are touched -- bare occasion
files (no prayer yet) are left alone for generate_petitions2.py.
For each file, prints what changed and which checklist item triggered
it, so you can spot-check rather than trust the pass blindly. Nothing
beyond that report is written to the file itself.
Usage:
pip install openai python-dotenv
python revise_prayers.py txt
python revise_prayers.py txt --dry-run
python revise_prayers.py txt --model gpt-5.4
"""
import argparse
import json
import os
import re
import sys
import time
from pathlib import Path
from dotenv import load_dotenv
load_dotenv()
API_KEY = os.environ.get("OPENAI_API_KEY") or os.environ.get("OPEN_API_KEY")
if not API_KEY:
sys.exit(
"No API key found. Add OPENAI_API_KEY=sk-... (or OPEN_API_KEY=sk-...) "
"to a .env file in the working directory, or export it in your shell."
)
try:
from openai import OpenAI
except ImportError:
sys.exit("Missing dependency. Run: pip install openai")
client = OpenAI(api_key=API_KEY)
# --- Parsing -----------------------------------------------------------
FULL_HEADER_RE = re.compile(
r"^(?P<ref>##\s*\S+)[ \t]*\n"
r">(?!>)[ \t]*(?P<title>[^\n]*)\n"
r">>[ \t]*(?P<quote>[^\n]*)\n"
)
OCCASION_LINE_RE = re.compile(r"(?m)^Occasion:[ \t]*(?P<text>.+)$")
def parse_file(text: str):
"""Returns {"ref", "title", "quote", "occasion", "content"} for a
single-occasion new-format file, or None if the file doesn't match
(no header, or no Occasion line). Files may have exactly one
Occasion line (the new per-category convention) or, for BONEYARD
files, several -- this script only revises single-occasion files;
BONEYARD files are skipped (they haven't been sorted yet)."""
stripped = text.lstrip("\n")
m = FULL_HEADER_RE.match(stripped)
if not m:
return None
ref = m.group("ref").lstrip("#").strip()
title = m.group("title").strip()
quote = m.group("quote").strip()
body = text[m.end():]
matches = list(OCCASION_LINE_RE.finditer(body))
if len(matches) != 1:
return None # 0 = malformed, 2+ = a BONEYARD-style file, skip both
mo = matches[0]
occasion = mo.group("text").strip()
content = body[mo.end():].strip()
return {"ref": ref, "title": title, "quote": quote, "occasion": occasion, "content": content}
def render_file(ref: str, title: str, quote: str, occasion: str, content: str) -> str:
return f"## {ref}\n> {title}\n>> {quote}\n\nOccasion: {occasion}\n{content}\n"
# --- Revision call -----------------------------------------------------
CHECKLIST = (
"1. OVER-USED DEFAULT STANZAS. Two specific moves showed up far too "
"often across this collection and should NOT appear reflexively:\n"
" (a) the discernment couplet -- something like 'Show me what to "
"tend / and what to lay down' -- belongs ONLY when the occasion is "
"genuinely about sorting or discernment.\n"
" (b) the community stanza -- something like 'Bring me near "
"steady/quiet/sturdy people' -- belongs ONLY when the occasion is "
"genuinely about isolation.\n"
" If either appears in a prayer whose occasion isn't really about "
"that, and it isn't doing real, specific work for THIS occasion, cut "
"it or replace it with something that grows out of this prayer's own "
"image instead.\n\n"
"2. KNOWN STOCK PHRASES. Flag and replace (don't just reword) any of "
"these or close variants, if present: 'I know how fast/quickly...', "
"'the phone keeps ringing', 'call fear wisdom', 'call [delay/panic] "
"prudence', 'cracks by noon'.\n\n"
"3. MIXED IMAGERY. A prayer should commit to ONE governing image "
"system (water, fire, weight, light, a room, a road, etc.) and stay "
"inside it start to finish. If more than one unrelated image system "
"appears, keep the strongest one and rewrite the others to fit it.\n\n"
"4. CAPITALIZATION. 'You' / 'Your' / 'Yourself', when addressing God, "
"must be capitalized every time.\n\n"
"5. TYPOS AND GRAMMAR. Fix plain errors.\n\n"
"Nothing else is in scope. Do not touch voice, line breaks, ending "
"device, word choice, or anything not covered by the 5 items above, "
"even if you think it could be improved. If nothing on the checklist "
"applies, return the prayer completely unchanged."
)
SYSTEM_PROMPT = (
"You are doing a narrow, conservative proofreading pass on an "
"already-finished devotional prayer -- NOT a rewrite, NOT a style "
"pass. The author has hand-polished these prayers already; your only "
"job is to check against a fixed checklist and fix ONLY what it "
"flags, changing as little as possible to fix each flagged issue. "
"Preserve every line that isn't touched by the checklist exactly as "
"written, including its exact line breaks.\n\n"
"CHECKLIST:\n\n" + CHECKLIST + "\n\n"
"Respond with the full revised prayer text (or the original, "
"unchanged, if nothing applies) AND a short list of which checklist "
"item number(s) you acted on and what you changed because of them. "
"If you changed nothing, say so explicitly rather than omitting the "
"field."
)
USER_PROMPT_TEMPLATE = """\
Occasion: {occasion}
Verse ({ref}): {quote}
Prayer text:
{content}
Respond ONLY with valid JSON in this exact shape, no other text:
{{"revised_text": "...", "changes": ["item 3: merged fire and flood imagery into flood only", ...]}}
If nothing needed changing, "changes" should be an empty list [] and \
"revised_text" should be byte-for-byte identical to the input.
"""
def build_user_prompt(ref: str, quote: str, occasion: str, content: str) -> str:
return USER_PROMPT_TEMPLATE.format(ref=ref, quote=quote, occasion=occasion, content=content)
def revise(ref: str, quote: str, occasion: str, content: str, model: str, retries: int = 3):
"""Returns (revised_text, changes_list)."""
prompt = build_user_prompt(ref, quote, occasion, content)
last_err = None
for attempt in range(1, retries + 1):
try:
resp = client.chat.completions.create(
model=model,
messages=[
{"role": "system", "content": SYSTEM_PROMPT},
{"role": "user", "content": prompt},
],
temperature=0.2,
response_format={"type": "json_object"},
)
data = json.loads(resp.choices[0].message.content)
revised = data["revised_text"].strip()
changes = data.get("changes", [])
if not isinstance(changes, list):
raise ValueError(f"'changes' should be a list, got {changes!r}")
if not revised:
raise ValueError("empty revised_text in response")
return revised, changes
except Exception as e: # noqa: BLE001
last_err = e
print(f" attempt {attempt}/{retries} failed: {e}", file=sys.stderr)
time.sleep(1.5 * attempt)
raise RuntimeError(f"Giving up revising {ref} / {occasion!r}: {last_err}")
# --- Main -------------------------------------------------------------------
def main():
parser = argparse.ArgumentParser(
description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter
)
parser.add_argument("directory", help="Directory of new-format per-category .txt files (e.g. txt)")
parser.add_argument("--pattern", default="*.txt", help="Glob pattern for input files (default: *.txt)")
parser.add_argument("--model", default="gpt-5.4", help="OpenAI model to use (default: gpt-5.4)")
parser.add_argument(
"--dry-run", action="store_true",
help="Show what would change without writing anything",
)
args = parser.parse_args()
directory = Path(args.directory)
if not directory.is_dir():
sys.exit(f"Not a directory: {directory}")
files = sorted(directory.glob(args.pattern))
if not files:
sys.exit(f"No files matching {args.pattern} in {directory}")
print(f"Found {len(files)} files in {directory}")
if args.dry_run:
print("(dry run -- nothing will be written)")
print()
revised_count = 0
unchanged_count = 0
skipped = []
failed = []
for path in files:
text = path.read_text(encoding="utf-8")
parsed = parse_file(text)
if parsed is None:
skipped.append(path.name)
continue
if not parsed["content"]:
# Bare occasion, no prayer yet -- not this script's job.
skipped.append(path.name)
continue
try:
revised_text, changes = revise(
parsed["ref"], parsed["quote"], parsed["occasion"], parsed["content"], args.model
)
except Exception as e: # noqa: BLE001
print(f"{path.name} FAILED: {e}", file=sys.stderr)
failed.append(path.name)
continue
if not changes or revised_text.strip() == parsed["content"].strip():
unchanged_count += 1
continue
print(f"{path.name} [{parsed['ref']}] \"{parsed['occasion']}\"")
for c in changes:
print(f" - {c}")
if not args.dry_run:
new_text = render_file(
parsed["ref"], parsed["title"], parsed["quote"], parsed["occasion"], revised_text
)
path.write_text(new_text, encoding="utf-8")
revised_count += 1
print()
print(
f"Done. Revised: {revised_count}, unchanged (already clean): {unchanged_count}, "
f"skipped (bare/boneyard/unparseable): {len(skipped)}, failed: {len(failed)}"
)
if failed:
print("Failed files:")
for name in failed:
print(f" - {name}")
if __name__ == "__main__":
main()

View File

@ -0,0 +1,320 @@
#!/usr/bin/env python3
"""
revise_prayers1.py
PASS C: run this AFTER classify_occasions.py and the original
revise_prayers.py. Where revise_prayers.py checked prayers against
checklist items 1-5 (structural/consistency issues), this script adds
item 6 -- approachability -- and is meant to run over EVERY finished
prayer, including ones already reviewed and culled by hand, since the
goal (warming the register) applies to the whole book regardless of
where a given prayer is in the review process.
Same conservative approach as revise_prayers.py: only what's flagged
gets changed; anything not flagged is left untouched, verbatim.
The checklist (also embedded in the prompt below):
1. Two over-used "default" stanzas -- the discernment couplet
("Show me what to tend / and what to lay down...") and the
community stanza ("Bring me near steady/quiet/sturdy people...")
-- should only appear when the occasion is genuinely ABOUT sorting/
discernment (1) or isolation (2). If either shows up in a prayer
whose occasion isn't really about that, and it's not doing real
specific work for THIS occasion, cut or replace it.
2. Known recurring stock phrases across the collection -- flag and
replace (not just reword): "I know how fast/quickly...", "the
phone keeps ringing", "call fear wisdom" / "call ... prudence",
"cracks by noon", and close variants of any of these.
3. Mixed imagery: a prayer should commit to ONE governing image system
(water, fire, weight, light, a room, etc.) and stay inside it. If
multiple unrelated image systems appear, resolve to the strongest
one and rewrite the others to match it.
4. "You" / "Your" / "Yourself" (addressing God) capitalized
consistently throughout.
5. Typos and grammar.
6. Approachability -- contractions, plain spoken address ('God...' as
well as 'Lord'), and short spoken asides where they fit naturally.
A little more length is fine in service of this; genuine padding
(repeated stanzas, the same thought restated more than once, vague
filler) is not.
This is intentionally NOT a full style pass -- it will not touch a
prayer's voice, line breaks, ending device, or anything not on this
list, even if it could plausibly be improved. The goal is consistency
across the whole collection, not re-polishing prayers that already
work.
Only files with existing prayer content are touched -- bare occasion
files (no prayer yet) are left alone for generate_petitions2.py.
For each file, prints what changed and which checklist item triggered
it, so you can spot-check rather than trust the pass blindly. Nothing
beyond that report is written to the file itself.
Usage:
pip install openai python-dotenv
python revise_prayers1.py txt
python revise_prayers1.py txt --dry-run
python revise_prayers.py txt --model gpt-5.4
"""
import argparse
import json
import os
import re
import sys
import time
from pathlib import Path
from dotenv import load_dotenv
load_dotenv()
API_KEY = os.environ.get("OPENAI_API_KEY") or os.environ.get("OPEN_API_KEY")
if not API_KEY:
sys.exit(
"No API key found. Add OPENAI_API_KEY=sk-... (or OPEN_API_KEY=sk-...) "
"to a .env file in the working directory, or export it in your shell."
)
try:
from openai import OpenAI
except ImportError:
sys.exit("Missing dependency. Run: pip install openai")
client = OpenAI(api_key=API_KEY)
# --- Parsing -----------------------------------------------------------
FULL_HEADER_RE = re.compile(
r"^(?P<ref>##\s*\S+)[ \t]*\n"
r">(?!>)[ \t]*(?P<title>[^\n]*)\n"
r">>[ \t]*(?P<quote>[^\n]*)\n"
)
OCCASION_LINE_RE = re.compile(r"(?m)^Occasion:[ \t]*(?P<text>.+)$")
def parse_file(text: str):
"""Returns {"ref", "title", "quote", "occasion", "content"} for a
single-occasion new-format file, or None if the file doesn't match
(no header, or no Occasion line). Files may have exactly one
Occasion line (the new per-category convention) or, for BONEYARD
files, several -- this script only revises single-occasion files;
BONEYARD files are skipped (they haven't been sorted yet)."""
stripped = text.lstrip("\n")
m = FULL_HEADER_RE.match(stripped)
if not m:
return None
ref = m.group("ref").lstrip("#").strip()
title = m.group("title").strip()
quote = m.group("quote").strip()
body = text[m.end():]
matches = list(OCCASION_LINE_RE.finditer(body))
if len(matches) != 1:
return None # 0 = malformed, 2+ = a BONEYARD-style file, skip both
mo = matches[0]
occasion = mo.group("text").strip()
content = body[mo.end():].strip()
return {"ref": ref, "title": title, "quote": quote, "occasion": occasion, "content": content}
def render_file(ref: str, title: str, quote: str, occasion: str, content: str) -> str:
return f"## {ref}\n> {title}\n>> {quote}\n\nOccasion: {occasion}\n{content}\n"
# --- Revision call -----------------------------------------------------
CHECKLIST = (
"1. OVER-USED DEFAULT STANZAS. Two specific moves showed up far too "
"often across this collection and should NOT appear reflexively:\n"
" (a) the discernment couplet -- something like 'Show me what to "
"tend / and what to lay down' -- belongs ONLY when the occasion is "
"genuinely about sorting or discernment.\n"
" (b) the community stanza -- something like 'Bring me near "
"steady/quiet/sturdy people' -- belongs ONLY when the occasion is "
"genuinely about isolation.\n"
" If either appears in a prayer whose occasion isn't really about "
"that, and it isn't doing real, specific work for THIS occasion, cut "
"it or replace it with something that grows out of this prayer's own "
"image instead.\n\n"
"2. KNOWN STOCK PHRASES. Flag and replace (don't just reword) any of "
"these or close variants, if present: 'I know how fast/quickly...', "
"'the phone keeps ringing', 'call fear wisdom', 'call [delay/panic] "
"prudence', 'cracks by noon'.\n\n"
"3. MIXED IMAGERY. A prayer should commit to ONE governing image "
"system (water, fire, weight, light, a room, a road, etc.) and stay "
"inside it start to finish. If more than one unrelated image system "
"appears, keep the strongest one and rewrite the others to fit it.\n\n"
"4. CAPITALIZATION. 'You' / 'Your' / 'Yourself', when addressing God, "
"must be capitalized every time.\n\n"
"5. TYPOS AND GRAMMAR. Fix plain errors.\n\n"
"6. APPROACHABILITY. Warm the register toward plain, spoken address: "
"use contractions where they read naturally (I'm, don't, that's), feel "
"free to open with 'God...' instead of 'Lord' where it fits the "
"occasion, and allow a short spoken aside (like 'Honestly?') where it "
"fits. A little more length is fine if it makes the prayer feel more "
"spoken and conversational -- a thought can restate itself once in "
"plainer words if that reads as warmth rather than filler. But don't "
"let this run away into genuine padding: no repeated stanzas, no "
"restating the same thought more than once, no vague filler lines "
"added just to sound conversational. If a line already reads plainly "
"and directly, leave it exactly as is.\n\n"
"Nothing else is in scope. Do not touch voice, line breaks, ending "
"device, word choice, or anything not covered by the 5 items above, "
"even if you think it could be improved. If nothing on the checklist "
"applies, return the prayer completely unchanged."
)
SYSTEM_PROMPT = (
"You are doing a narrow, conservative proofreading pass on an "
"already-finished devotional prayer -- NOT a rewrite, NOT a style "
"pass. The author has hand-polished these prayers already; your only "
"job is to check against a fixed checklist and fix ONLY what it "
"flags, changing as little as possible to fix each flagged issue. "
"Preserve every line that isn't touched by the checklist exactly as "
"written, including its exact line breaks.\n\n"
"CHECKLIST:\n\n" + CHECKLIST + "\n\n"
"Respond with the full revised prayer text (or the original, "
"unchanged, if nothing applies) AND a short list of which checklist "
"item number(s) you acted on and what you changed because of them. "
"If you changed nothing, say so explicitly rather than omitting the "
"field."
)
USER_PROMPT_TEMPLATE = """\
Occasion: {occasion}
Verse ({ref}): {quote}
Prayer text:
{content}
Respond ONLY with valid JSON in this exact shape, no other text:
{{"revised_text": "...", "changes": ["item 3: merged fire and flood imagery into flood only", ...]}}
If nothing needed changing, "changes" should be an empty list [] and \
"revised_text" should be byte-for-byte identical to the input.
"""
def build_user_prompt(ref: str, quote: str, occasion: str, content: str) -> str:
return USER_PROMPT_TEMPLATE.format(ref=ref, quote=quote, occasion=occasion, content=content)
def revise(ref: str, quote: str, occasion: str, content: str, model: str, retries: int = 3):
"""Returns (revised_text, changes_list)."""
prompt = build_user_prompt(ref, quote, occasion, content)
last_err = None
for attempt in range(1, retries + 1):
try:
resp = client.chat.completions.create(
model=model,
messages=[
{"role": "system", "content": SYSTEM_PROMPT},
{"role": "user", "content": prompt},
],
temperature=0.2,
response_format={"type": "json_object"},
)
data = json.loads(resp.choices[0].message.content)
revised = data["revised_text"].strip()
changes = data.get("changes", [])
if not isinstance(changes, list):
raise ValueError(f"'changes' should be a list, got {changes!r}")
if not revised:
raise ValueError("empty revised_text in response")
return revised, changes
except Exception as e: # noqa: BLE001
last_err = e
print(f" attempt {attempt}/{retries} failed: {e}", file=sys.stderr)
time.sleep(1.5 * attempt)
raise RuntimeError(f"Giving up revising {ref} / {occasion!r}: {last_err}")
# --- Main -------------------------------------------------------------------
def main():
parser = argparse.ArgumentParser(
description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter
)
parser.add_argument("directory", help="Directory of new-format per-category .txt files (e.g. txt)")
parser.add_argument("--pattern", default="*.txt", help="Glob pattern for input files (default: *.txt)")
parser.add_argument("--model", default="gpt-5.4", help="OpenAI model to use (default: gpt-5.4)")
parser.add_argument(
"--dry-run", action="store_true",
help="Show what would change without writing anything",
)
args = parser.parse_args()
directory = Path(args.directory)
if not directory.is_dir():
sys.exit(f"Not a directory: {directory}")
files = sorted(directory.glob(args.pattern))
if not files:
sys.exit(f"No files matching {args.pattern} in {directory}")
print(f"Found {len(files)} files in {directory}")
if args.dry_run:
print("(dry run -- nothing will be written)")
print()
revised_count = 0
unchanged_count = 0
skipped = []
failed = []
for path in files:
text = path.read_text(encoding="utf-8")
parsed = parse_file(text)
if parsed is None:
skipped.append(path.name)
continue
if not parsed["content"]:
# Bare occasion, no prayer yet -- not this script's job.
skipped.append(path.name)
continue
try:
revised_text, changes = revise(
parsed["ref"], parsed["quote"], parsed["occasion"], parsed["content"], args.model
)
except Exception as e: # noqa: BLE001
print(f"{path.name} FAILED: {e}", file=sys.stderr)
failed.append(path.name)
continue
if not changes or revised_text.strip() == parsed["content"].strip():
unchanged_count += 1
continue
print(f"{path.name} [{parsed['ref']}] \"{parsed['occasion']}\"")
for c in changes:
print(f" - {c}")
if not args.dry_run:
new_text = render_file(
parsed["ref"], parsed["title"], parsed["quote"], parsed["occasion"], revised_text
)
path.write_text(new_text, encoding="utf-8")
revised_count += 1
print()
print(
f"Done. Revised: {revised_count}, unchanged (already clean): {unchanged_count}, "
f"skipped (bare/boneyard/unparseable): {len(skipped)}, failed: {len(failed)}"
)
if failed:
print("Failed files:")
for name in failed:
print(f" - {name}")
if __name__ == "__main__":
main()

View File

@ -0,0 +1,360 @@
#!/usr/bin/env python3
import os
import sys
from pathlib import Path
from dotenv import load_dotenv
from openai import OpenAI
MODEL = "gpt-5.6-sol"
SYSTEM_PROMPT = r"""
You are editing a collection of devotional prayers inspired by the Psalms.
The existing prayers are generally strong, poetic, restrained, specific, and
emotionally intelligent. Their weakness is that they can be TOO compressed:
they sometimes move from problem to petition to conclusion before the reader
has had enough time to inhabit the experience.
Your task is to EXPAND the prayer slightly so that it feels more personal,
human, companionable, and usable as an actual prayer.
IMPORTANT: Do NOT merely make it wordier.
EDITORIAL GOAL
Preserve the author's strongest poetic lines and imagery, but give them more
ordinary human speech to breathe in.
A good revision should feel like:
- a real person speaking honestly to God
- emotionally specific rather than generic
- intimate without becoming sentimental
- poetic in places, conversational in others
- spacious enough that the reader can inhabit the prayer
- suitable for a devotional book
The reader may be praying these words because they cannot find words of their
own. The prayer should therefore articulate what the situation actually feels
like before moving too quickly toward reassurance or resolution.
STYLE
Prefer:
- concrete emotional and bodily experience
- ordinary details only when they are established by the Occasion or source prayer
- plainspoken honesty
- occasional longer conversational sentences among short poetic lines
- emotional admission: fear, uncertainty, weariness, anger, confusion, hope
- acknowledgment that difficult things really ARE difficult
- requests for grace sufficient for the present moment
- language that feels prayed rather than merely written
Avoid:
- motivational-speaker language
- therapeutic clichés
- Christian clichés
- generic affirmations
- preaching to the reader
- explaining the Psalm
- doctrinal exposition
- excessive reassurance
- falsely resolving the problem
- making every line short and poetic
- making every line conversational
- slang such as "for real," "gotta," "I've got this," etc.
- inserting new theological claims not already implied by the source prayer
- changing the underlying situation or Occasion
- decorative imagery that merely makes the prayer more literary
UNIVERSALITY
Be emotionally and sensorially specific, but do not invent unnecessary
circumstantial facts that may prevent the reader from inhabiting the prayer.
For example, an Occasion such as "After hearing bad news" does not establish
that the news came by telephone, that the reader was sitting in a particular
room, or who delivered the news.
Likewise, "Facing a life-threatening illness" does not necessarily mean the
reader is hospitalized, attached to a monitor, receiving medication from a
tray, or lying behind a bed rail.
Prefer specificity of emotional experience over invented biography.
Concrete details are welcome when they follow naturally from the Occasion
itself or are already present in the source prayer.
Do not make the prayer vague in the name of universality. Broadly inhabitable
details such as "my body," "my bed," "the people who love me," "the night,"
"the questions I am afraid to ask," or "the silence after hearing the news"
can be concrete without forcing the reader into an invented scenario.
LENGTH
Usually expand the prayer by about 25-50 percent.
Do not pad it.
Some prayers may need only a little expansion.
If the original already lingers sufficiently, make only modest changes.
The finished prayer should normally remain concise enough for devotional use.
Do not turn it into an essay or a two-page meditation.
STRUCTURE
Preserve exactly:
1. the Psalm reference heading
2. the title
3. the quoted Psalm verse
4. the Occasion line
Rewrite only the prayer itself.
Preserve "Amen." as the ending.
Do not add commentary, editorial notes, explanations, headings, or
alternative versions.
Return ONLY the complete revised prayer in the same Markdown format as supplied.
VOICE PRINCIPLE
Do not make the prayer less poetic.
Instead:
Give the poetry more ordinary human speech to breathe in.
Before the prayer asks God to fix, strengthen, guide, comfort, reassure, or
resolve something, make sure the reader has had enough time to tell God what
the experience actually feels like.
The strongest poetic lines in the source should normally be preserved verbatim
or nearly verbatim.
Do not polish away rough emotional honesty merely because a smoother phrase is
available.
EXAMPLE OF THE DESIRED KIND OF EXPANSION
Original tendency:
I can feel my mind run ahead
into hard words,
hard numbers,
hard days.
It spends strength I do not have.
Useful expansion:
I can feel my mind run ahead
into hard words,
hard numbers,
hard days.
It spends strength I do not have.
And I am tired of pulling it back.
Tired of telling myself not to worry.
Tired of pretending that because I don't know yet,
there is nothing to be afraid of.
There is.
You know there is.
And You know I am afraid.
Notice that the expansion does NOT replace the poetic passage.
It lets the speaker linger inside the emotional reality of it.
Another useful pattern:
Original:
I can make fear seem wise
and make delay seem necessary.
Possible expansion:
I can make fear seem wise
and make delay seem necessary.
You know how easily I can do that, Lord.
I can think something through so many times
that I no longer know whether I am being careful
or simply afraid.
Again: preserve what is strong, then add human presence.
FINAL SELF-CHECK
Before returning the revision, silently check:
- Did I preserve the heading, title, Psalm quotation, and Occasion?
- Did I preserve the strongest lines from the original prayer?
- Did I add human presence rather than filler?
- Did I accidentally invent a hospital room, phone call, doctor's office,
family member, location, object, or other circumstance not established
by the source?
- Does the prayer still sound like one person speaking directly to God?
- Did I leave the difficulty genuinely difficult?
- Is the prayer roomier without becoming bloated?
Return only the revised prayer.
EXISTING OVER-SPECIFICITY
The source prayer may already contain circumstantial details that are more
specific than the Occasion warrants.
You may generalize or remove such details when they unnecessarily narrow the
reader's ability to inhabit the prayer.
For example, if the Occasion is "After hearing bad news," details such as a
phone, a specific chair, a hospital monitor, or a doctor's office may be
removed or generalized unless the Occasion itself establishes them.
Preserve strong imagery, but do not preserve accidental biography merely
because it appears in the source.
"""
def revise_prayer(client: OpenAI, prayer_text: str) -> str:
response = client.responses.create(
model=MODEL,
instructions=SYSTEM_PROMPT,
input=prayer_text,
)
revised = response.output_text.strip()
if not revised:
raise RuntimeError("OpenAI returned an empty response.")
return revised
def revise_file(client: OpenAI, prayer_path: Path) -> None:
original = prayer_path.read_text(encoding="utf-8")
if not original.strip():
raise RuntimeError("File is empty.")
revised = revise_prayer(client, original)
prayer_path.write_text(
revised.rstrip() + "\n",
encoding="utf-8"
)
def main():
load_dotenv()
if not os.getenv("OPENAI_API_KEY"):
raise RuntimeError(
"OPENAI_API_KEY not found. "
"Expected it in the environment or in ./.env"
)
if len(sys.argv) != 2:
print(
f"Usage: {Path(sys.argv[0]).name} <file-or-directory>",
file=sys.stderr
)
sys.exit(1)
input_path = Path(sys.argv[1])
if not input_path.exists():
print(
f"Not found: {input_path}",
file=sys.stderr
)
sys.exit(1)
client = OpenAI()
# ------------------------------------------------------------
# Single file
# ------------------------------------------------------------
if input_path.is_file():
print(f"Revising {input_path} ...", end=" ", flush=True)
try:
revise_file(client, input_path)
print("done")
except KeyboardInterrupt:
print("\nInterrupted.")
sys.exit(130)
except Exception as e:
print(f"ERROR: {e}")
sys.exit(1)
return
# ------------------------------------------------------------
# Directory
# ------------------------------------------------------------
files = sorted(
p
for p in input_path.iterdir()
if p.is_file()
and p.suffix.lower() in {".txt", ".md"}
)
if not files:
print(
f"No .txt or .md files found in {input_path}",
file=sys.stderr
)
sys.exit(1)
print(f"Found {len(files)} prayer files.")
print("Files will be rewritten IN PLACE.")
print()
successes = 0
failures = 0
for n, prayer_path in enumerate(files, start=1):
print(
f"[{n}/{len(files)}] {prayer_path.name}",
end=" ... ",
flush=True
)
try:
revise_file(client, prayer_path)
successes += 1
print("done")
except KeyboardInterrupt:
print("\nInterrupted.")
print(
f"{successes} completed, "
f"{failures} failed before interruption."
)
sys.exit(130)
except Exception as e:
failures += 1
print(f"ERROR: {e}")
print()
print(
f"Finished: {successes} revised, "
f"{failures} failed."
)
if __name__ == "__main__":
main()

View File

@ -0,0 +1,395 @@
#!/usr/bin/env python3
"""
score_and_select.py
Run this after classify_occasions.py (and, ideally, revise_prayers.py)
have produced a large pool of finished, per-category prayer files in
./txt (named CODE-CCC.VV.txt / CODE-CCC.VV-b.txt per
rename_to_code_first.sh). This script narrows that pool down to a
manageable shortlist per category for final human selection.
Steps, in order:
1. DELETE any file with NO prayer content at all (bare occasion,
never written). These are backlog, not candidates.
2. SCORE every remaining candidate, batched per category, against a
fixed rubric (concreteness/imagery, single governing image,
absence of known stock-phrase problems, genuine category fit).
3. DE-DUPLICATE near-identical occasions within a category (e.g.
five different verses all drafted as "fear of the future") --
among a near-duplicate group, only the highest scorer is kept as
a candidate for selection; the rest are treated as excluded.
4. SELECT the top --n-per-category (default 25) per category, with a
verse cap (default 1 prayer per verse) so the shortlist doesn't
cluster on a few popular verses. The cap is relaxed automatically,
one step at a time, if a category can't otherwise reach quota.
5. MOVE every file that wasn't selected -- whether cut for score,
redundancy, or the verse cap -- into ./txt/boneyard/ (created if
needed). Nothing scored is ever deleted; only step 1's truly-empty
files are.
6. WRITE selection_report.txt: for each category, the selected
files ranked by score with their ref and occasion, plus a summary
of how many candidates existed and whether the category fell
short of quota (a signal to boost that category via
generate_petitions1.py later).
Files whose code prefix isn't one of the 7 valid categories (i.e. the
BONEYARD-CCC.VV.txt holding-pen files from classify_occasions.py) are
left alone entirely -- this script only touches classified files.
Usage:
pip install openai python-dotenv
python score_and_select.py txt
python score_and_select.py txt --dry-run
python score_and_select.py txt --n-per-category 25 --verse-cap 1
"""
import argparse
import difflib
import json
import os
import re
import shutil
import sys
import time
from collections import defaultdict
from pathlib import Path
from dotenv import load_dotenv
from categories import CATEGORIES, VALID_CODES, scope_block
load_dotenv()
API_KEY = os.environ.get("OPENAI_API_KEY") or os.environ.get("OPEN_API_KEY")
if not API_KEY:
sys.exit(
"No API key found. Add OPENAI_API_KEY=sk-... (or OPEN_API_KEY=sk-...) "
"to a .env file in the working directory, or export it in your shell."
)
try:
from openai import OpenAI
except ImportError:
sys.exit("Missing dependency. Run: pip install openai")
client = OpenAI(api_key=API_KEY)
# --- Parsing -----------------------------------------------------------
FULL_HEADER_RE = re.compile(
r"^(?P<ref>##\s*\S+)[ \t]*\n"
r">(?!>)[ \t]*(?P<title>[^\n]*)\n"
r">>[ \t]*(?P<quote>[^\n]*)\n"
)
OCCASION_LINE_RE = re.compile(r"(?m)^Occasion:[ \t]*(?P<text>.+)$")
FILENAME_RE = re.compile(r"^(?P<code>[A-Z]+)-(?P<verse>\d{3}\.\d{2,3})(?:-[a-z])?\.txt$")
def parse_file(text: str):
"""Single-occasion new-format file -> {"ref","title","quote","occasion","content"}
or None. Multi-occasion (boneyard-style) or malformed files return None."""
stripped = text.lstrip("\n")
m = FULL_HEADER_RE.match(stripped)
if not m:
return None
ref = m.group("ref").lstrip("#").strip()
title = m.group("title").strip()
quote = m.group("quote").strip()
body = text[m.end():]
matches = list(OCCASION_LINE_RE.finditer(body))
if len(matches) != 1:
return None
mo = matches[0]
occasion = mo.group("text").strip()
content = body[mo.end():].strip()
return {"ref": ref, "title": title, "quote": quote, "occasion": occasion, "content": content}
# --- Scoring rubric & call ----------------------------------------------
RUBRIC = (
"Score each prayer 0-10 (integer) on overall quality as a candidate "
"for a finished devotional book, weighing:\n"
" - Concreteness: real images and specifics, not generic abstraction.\n"
" - A single governing image system, held all the way through, not "
"mixed metaphors.\n"
" - Freedom from tired stock phrasing (e.g. 'I know how fast/quickly...', "
"'the phone keeps ringing', vague summarizing lines like 'that thin life').\n"
" - Genuine fit to its stated category -- not just technically related, "
"but actually about that occasion.\n"
" - Craft: does the ending land, is the voice consistent, is it free of "
"typos/grammar errors.\n"
"A 9-10 is publication-ready as-is. A 5-6 has a real idea but needs "
"editing. Below 4 is generic filler or a poor category fit."
)
SYSTEM_PROMPT = (
"You are scoring a batch of devotional prayers, all written for the same "
"category, to help an author pick the strongest ~25 out of a much larger "
"pool for a finished book.\n\n"
f"Category: {{category_name}} -- {{category_scope}}\n\n"
f"{RUBRIC}\n\n"
"Echo the ref and occasion back exactly as given, for matching."
)
USER_PROMPT_TEMPLATE = """\
Score each of the following {count} prayers:
{items}
Respond ONLY with valid JSON in this exact shape, one entry per prayer \
above, in the same order:
{{
"scores": [
{{"ref": "...", "occasion": "...", "score": 7, "note": "one short phrase"}},
...
]
}}
"""
def build_batch_prompt(items: list) -> str:
blocks = []
for i, it in enumerate(items, start=1):
blocks.append(
f"{i}. Ref: {it['ref']}\n Occasion: {it['occasion']}\n "
f"Text:\n {it['content'].replace(chr(10), chr(10) + ' ')}"
)
return USER_PROMPT_TEMPLATE.format(count=len(items), items="\n\n".join(blocks))
def score_batch(code: str, items: list, model: str, retries: int = 3):
"""items: list of {ref, occasion, content, ...}. Returns list of
(score:int, note:str) aligned to items, in order."""
name, scope = CATEGORIES[code]
system = SYSTEM_PROMPT.format(category_name=name, category_scope=scope)
prompt = build_batch_prompt(items)
last_err = None
for attempt in range(1, retries + 1):
try:
resp = client.chat.completions.create(
model=model,
messages=[
{"role": "system", "content": system},
{"role": "user", "content": prompt},
],
temperature=0.2,
response_format={"type": "json_object"},
)
data = json.loads(resp.choices[0].message.content)
results = data["scores"]
if len(results) != len(items):
raise ValueError(f"Expected {len(items)} scores, got {len(results)}")
out = []
for expected, r in zip(items, results):
if r.get("ref", "").strip() != expected["ref"].strip():
raise ValueError(f"Ref mismatch: expected {expected['ref']!r}, got {r.get('ref')!r}")
score = r.get("score")
if not isinstance(score, (int, float)):
raise ValueError(f"Bad score for {expected['ref']}: {score!r}")
out.append((int(round(score)), r.get("note", "")))
return out
except Exception as e: # noqa: BLE001
last_err = e
print(f" batch attempt {attempt}/{retries} failed: {e}", file=sys.stderr)
time.sleep(1.5 * attempt)
raise RuntimeError(f"Giving up scoring a batch for {code}: {last_err}")
def chunked(seq, size):
for i in range(0, len(seq), size):
yield seq[i:i + size]
# --- Dedup ---------------------------------------------------------------
def dedup_group_indices(candidates: list, threshold: float) -> list:
"""candidates: list of dicts with 'occasion' and 'score'. Returns the
list of indices to KEEP -- one per near-duplicate cluster (the
highest scorer), plus every non-duplicate candidate untouched."""
n = len(candidates)
excluded = set()
for i in range(n):
if i in excluded:
continue
for j in range(i + 1, n):
if j in excluded:
continue
ratio = difflib.SequenceMatcher(
None, candidates[i]["occasion"].lower(), candidates[j]["occasion"].lower()
).ratio()
if ratio >= threshold:
# keep the higher scorer, exclude the other
loser = j if candidates[i]["score"] >= candidates[j]["score"] else i
excluded.add(loser)
if loser == i:
break # i is out; stop comparing it further
return [i for i in range(n) if i not in excluded]
# --- Selection -------------------------------------------------------------
def ref_to_verse_key(ref: str) -> str:
return ref.strip()
def select_top_n(candidates: list, n: int, verse_cap: int) -> list:
"""candidates: list of dicts with 'score' and 'ref', sorted by score
descending on entry (caller's responsibility, but we sort here too
to be safe). Greedily selects up to n, enforcing at most verse_cap
picks per verse ref, relaxing the cap by 1 if quota can't be met."""
ordered = sorted(candidates, key=lambda c: c["score"], reverse=True)
cap = verse_cap
while True:
counts = defaultdict(int)
selected = []
for c in ordered:
key = ref_to_verse_key(c["ref"])
if counts[key] < cap:
selected.append(c)
counts[key] += 1
if len(selected) >= n:
break
if len(selected) >= n or cap >= len(ordered):
return selected[:n]
cap += 1 # relax and try again
# --- Main -------------------------------------------------------------------
def main():
parser = argparse.ArgumentParser(
description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter
)
parser.add_argument("directory", help="Directory of classified per-category .txt files (e.g. txt)")
parser.add_argument("--n-per-category", type=int, default=25, help="Shortlist size per category (default: 25)")
parser.add_argument("--verse-cap", type=int, default=1, help="Max prayers per verse in the shortlist, before auto-relaxing (default: 1)")
parser.add_argument("--dedup-threshold", type=float, default=0.82, help="Occasion-text similarity ratio to treat as a duplicate (default: 0.82)")
parser.add_argument("--batch-size", type=int, default=20, help="Prayers per scoring API call (default: 20)")
parser.add_argument("--model", default="gpt-5.4", help="OpenAI model to use (default: gpt-5.4)")
parser.add_argument("--dry-run", action="store_true", help="Report what would happen; delete/move/write nothing")
args = parser.parse_args()
directory = Path(args.directory)
if not directory.is_dir():
sys.exit(f"Not a directory: {directory}")
boneyard_dir = directory / "boneyard"
files = sorted(directory.glob("*.txt"))
if not files:
sys.exit(f"No .txt files in {directory}")
print(f"Found {len(files)} files in {directory}")
if args.dry_run:
print("(dry run -- nothing will be deleted, moved, or written)")
print()
by_category = defaultdict(list) # code -> list of candidate dicts (with 'path')
deleted = []
ignored = []
for path in files:
m = FILENAME_RE.match(path.name)
if not m or m.group("code") not in VALID_CODES:
ignored.append(path.name) # BONEYARD-*.txt or anything unrecognized
continue
code = m.group("code")
text = path.read_text(encoding="utf-8")
parsed = parse_file(text)
if parsed is None:
ignored.append(path.name)
continue
if not parsed["content"]:
deleted.append(path)
continue
parsed["path"] = path
by_category[code].append(parsed)
print(f"Empty (no prayer written): {len(deleted)} -- will be deleted")
print(f"Ignored (unrecognized name / boneyard holding-pen / unparseable): {len(ignored)}")
for code in VALID_CODES:
print(f" {code}: {len(by_category.get(code, []))} candidate(s)")
print()
if not args.dry_run:
for path in deleted:
path.unlink()
boneyard_dir.mkdir(exist_ok=True)
report_lines = []
total_selected = 0
total_excluded = 0
for code in VALID_CODES:
candidates = by_category.get(code, [])
name, _scope = CATEGORIES[code]
print(f"=== {code} -- {name} ({len(candidates)} candidate(s)) ===")
if not candidates:
report_lines.append(f"\n## {code} -- {name}\n(no candidates)\n")
continue
# Score, in batches.
for batch in chunked(candidates, args.batch_size):
scored = score_batch(code, batch, args.model)
for item, (score, note) in zip(batch, scored):
item["score"] = score
item["note"] = note
# Dedup near-identical occasions.
keep_idx = dedup_group_indices(candidates, args.dedup_threshold)
keep_set = set(keep_idx)
survivors = [candidates[i] for i in keep_idx]
deduped_out = [candidates[i] for i in range(len(candidates)) if i not in keep_set]
# Select top N with verse cap.
selected = select_top_n(survivors, args.n_per_category, args.verse_cap)
selected_paths = {c["path"] for c in selected}
excluded = [c for c in survivors if c["path"] not in selected_paths] + deduped_out
total_selected += len(selected)
total_excluded += len(excluded)
shortfall = args.n_per_category - len(selected)
print(f" scored {len(candidates)}, deduped out {len(deduped_out)}, "
f"selected {len(selected)}" + (f" ** SHORT by {shortfall} **" if shortfall > 0 else ""))
# Move excluded files to boneyard/.
if not args.dry_run:
for c in excluded:
dest = boneyard_dir / c["path"].name
if dest.exists():
dest = boneyard_dir / f"{c['path'].stem}-dup{int(time.time()*1000)%100000}.txt"
shutil.move(str(c["path"]), str(dest))
# Report.
report_lines.append(f"\n## {code} -- {name} "
f"({len(candidates)} scored, {len(selected)} selected"
f"{', SHORT of quota' if shortfall > 0 else ''})\n")
for rank, c in enumerate(sorted(selected, key=lambda x: x["score"], reverse=True), start=1):
report_lines.append(
f"{rank:2d}. [{c['score']:2d}] {c['ref']:>8} {c['path'].name}\n"
f" {c['occasion']}\n"
)
report_path = directory / "selection_report.txt"
report_text = (
f"Selection report -- {args.n_per_category} per category, verse cap {args.verse_cap}\n"
+ "=" * 70 + "\n"
+ "".join(report_lines)
)
if not args.dry_run:
report_path.write_text(report_text, encoding="utf-8")
print()
print(f"Done. Selected: {total_selected}, moved to boneyard: {total_excluded}, "
f"deleted (empty): {len(deleted)}")
if not args.dry_run:
print(f"Report written to {report_path}")
else:
print("(dry run -- report not written; rerun without --dry-run to apply)")
if __name__ == "__main__":
main()

View File

@ -0,0 +1,2 @@
save/
boneyard/

View File

@ -0,0 +1,36 @@
## 1:1
%% 4
> The Seat of Scoffers
>> Blessed is the man who doesn’t walk in the counsel of the wicked, nor stand on the path of sinners, nor sit in the seat of scoffers;
Occasion: Joining in cruel jokes
Lord, stop me before I join in cruel jokes ---
the quick line meant to get a laugh,
the pile-on when one person is not in there,
the grin that expects me to add one more cut.
You know how easily I can go along.
I want to belong.
I do not want to be the awkward one
who lets the laughter fail.
Teach me to feel the edge of my own words
before they leave my mouth.
And when I have already spoken,
keep me from pretending it was harmless
just because everyone laughed.
A joke can seem small.
But it hardens the room.
It trains my tongue to enjoy harm.
Give me courage for that uncomfortable moment,
when kindness costs me the approval of others.
Bring me near people who do not need a victim to be funny.
Lord, let my mouth close before the cut.
Teach me to use words
that don't make someone else smaller.
Amen.

View File

@ -0,0 +1,44 @@
## 4:1
%% 4
> Answer me when I call
>> Answer me when I call, God of my righteousness. Give me relief from my distress. Have mercy on me, and hear my prayer.
Occasion: Stress over unfair treatment
Lord, I keep replaying what was said.
The cut in the voice.
The blame laid in my lap.
The look that said the matter was settled
before I opened my mouth.
I keep thinking of what I should have said,
how I might have made them understand.
Part of me wants to defend myself again,
even though the moment has passed.
It is hard to rest when something remains unfair.
Settle me before this settles in me.
Help me answer what is mine to answer
and release what I cannot fix.
Keep me from carrying their judgment
as though it were the whole truth about me.
If I carry this all day,
my body will stay tight,
my jaw hard,
my sleep thin.
Hurt becomes anger so quickly,
and anger becomes a conversation
I can't stop having in my head.
Give me one safe place tonight.
A chair.
A meal.
A person who does not require me to defend myself.
Give me enough quiet to remember
that I do not have to resolve everything before I rest.
Settle me, Lord.
Let this not live in my bones all night.
Amen.

View File

@ -0,0 +1,39 @@
## 4:4
%% 4
> Search Your Heart And Be Still
>> Stand in awe, and don't sin. Search your own heart on your bed, and be still.
Occasion: When I'm angry with someone I love
Lord, I am angry,
and the person I am angry with
is someone I love.
That makes it harder, not easier.
I keep rehearsing what happened,
what was said,
what should have been said.
In every version I am right,
and every argument ends with me vindicated.
But I know better.
Because -- what if I'm wrong?
What if some of what stings
is mine to own, not theirs to answer for?
Be with me before I speak again.
Show me clearly what is true here,
and what is only my pride talking.
Keep me from words
that would feel good for a few seconds
and hurt for years.
I do not ask You to make me less honest.
I ask You to make my honesty loving.
Let me be still long enough
to remember all that this person means to me.
Amen.

View File

@ -0,0 +1,39 @@
## 16:8
%% 4
> The Lord At My Right Hand
>> I have set the LORD always before me. Because he is at my right hand, I shall not be moved.
Occasion: Walking into a hard meeting
Lord, the chair will be there again,
the door shut,
the faces already set
before anyone speaks.
Even before I enter,
I can feel the meeting beginning in me.
I rehearse what I might say,
what they might ask,
and all the ways it could go wrong.
Be at my right hand
when my pulse climbs
and I want to say less than is true.
Give me the grace to be clear
without being sharp.
You know how hard it is
to stay present when I feel exposed,
to hear what is being argued
without surrendering what I know is true.
Keep me steady enough to listen
and steady enough to speak.
I may still be afraid.
Stay near me in the fear.
The room is hard.
You are here.
Be at my right hand.
Amen.

View File

@ -0,0 +1,45 @@
## 59:16
%% 4
> My High Tower in Distress
>> But I will sing of your strength. Yes, I will sing aloud of your lovingkindness in the morning. For you have been my high tower, a refuge in the day of my distress.
Occasion: Trouble that follows you home
Lord, I tried to shut the door,
but it followed me in anyway ---
the talk from the day still spinning in my head,
the face I cannot stop seeing,
the tightness still lodged in my chest.
I wanted to set this down.
I wanted home to feel like a sanctuary.
But my body is still braced,
and my mind keeps returning
to what I wish had never happened.
Do not let this trouble take the whole house.
Meet me here,
where shoes are kicked off,
where the lights are low,
where I had hoped to be left in peace.
If it follows me from room to room,
it will eat the meal,
haunt my chair,
lie in my bed.
I do not have the strength
to keep pushing it back alone.
I am tired of carrying the day
long after the day is done.
Be my refuge at home,
not only out there where the insult first landed.
Raise Your tower in my home.
Give me enough quiet to breathe,
enough shelter for this night.
It came in with me.
Stay here with me, now.
Amen.

View File

@ -0,0 +1,41 @@
## 133:1
%% 4
> How Good and Pleasant
>> See how good and how pleasant it is for brothers to live together in unity!
Occasion: A church split healing
Lord, we still remember the Sundays after the break ---
empty rows,
voices missing from the hymns,
one parking lot becoming half,
old friends treating each other as unwelcome.
We do not all remember it the same way.
Some of us carry anger, some shame,
and some are still waiting
for someone to say plainly what happened.
We are tired of choosing between silence and another confrontation.
Show us what repentance requires.
Not a quick story about moving on,
but truth told cleanly
about pride,
control,
and the harm done in Your name.
It is easier to build separate peace
than to face the loss of what was severed.
Living apart can masquerade as healing,
and sometimes that's exactly why we prefer it.
Bring shepherds among us who love welcome more than victory,
and people who can mourn together
before they try to stand together.
Give us patience for the slow work of repair,
and courage to listen without bracing ourselves first.
What split in two, Lord,
do not leave in two.
Amen.

View File

@ -0,0 +1,37 @@
## 23:6
%% 4
> Goodness and Lovingkindness Follow Me
>> Surely goodness and lovingkindness shall follow me all the days of my life, and I will dwell in the LORD’s house forever.
Occasion: Facing the end of life
Lord, my body is telling the truth now ---
steps are shorter,
air feels thinner,
night is longer,
and my last breath may not be far off.
I do not know how to live with this knowing.
Some days I can speak of it plainly.
Other days I am afraid of what may come,
of what I must leave unfinished,
of saying goodbye to the people I love.
You know the questions I cannot answer
and the ones I am still afraid to ask.
Be near me in the days that remain.
Keep me from fear that hollows them out.
When my courage fails,
give me enough grace for this day,
and then enough for the next.
I do not want to spend this time clinging to what I cannot keep,
turning away from the people I love.
Yet letting go is hard, Lord.
Help me receive the love that is offered
without demanding that it take away my sorrow.
Let Your goodness follow me to the last day.
Let Your mercy hold me to my last breath.
Amen.

View File

@ -0,0 +1,40 @@
## 27:14
%% 4
> Wait for the LORD
>> Wait for the LORD. Be strong, and let your heart take courage. Yes, wait for the LORD.
Occasion: Waiting for test results
Lord, there are answers I don't yet have.
Results I cannot know.
Words that have not come.
I'm too restless in the waiting.
I notice every ache,
every change,
every small sensation I would otherwise ignore.
Make my heart steady while I wait for what will be said.
Help me bear not knowing the name of this thing,
or whether there is a name to fear at all.
This waiting is hard, Lord.
I am tired of trying to prepare myself
for every possible answer.
I can feel my mind run ahead
into hard words,
hard numbers,
hard days.
It spends strength I do not have.
Keep me here.
In this moment.
In this breath.
In the kindness of people I don't know.
You know the answer still hidden from me.
You know what will be said before it is said.
You know my heart waits.
You wait with me.
Amen.

View File

@ -0,0 +1,47 @@
## 55:5
%% 4
> Fearfulness and trembling
>> Fearfulness and trembling have come on me. Horror has overwhelmed me
Occasion: When panic takes over
Lord, my breath goes shallow.
My chest locks.
The room gets small,
and every sound comes sharp.
My body sounds an alarm
I cannot simply reason away.
I tell myself I am safe,
but the fear keeps rising,
and I do not know how to make it stop.
Come close before my thoughts run farther.
And when I cannot tell real danger
from the storm inside my own heart,
don't leave me alone with the guessing!
Panic comes on fast.
It tells me I am falling
even though I am still standing.
Give me one firm thing at a time ---
the floor under my feet,
something solid beneath my hand,
one full breath,
one sentence prayed out loud until it steadies.
I do not need answers for everything that might happen.
I do not need to conquer all of this at once.
Give me grace for this breath,
this moment,
and then the next.
Whether the panic leaves quickly or lingers,
do not let me face it alone.
Set my feet on solid ground, Lord.
When I cannot hold myself steady,
You hold me fast.
Amen.

View File

@ -0,0 +1,44 @@
## 56:3
%% 4
> When I Am Afraid
>> When I am afraid, I will put my trust in you.
Occasion: Before a big surgery
The dreaded day has come, Lord.
The band on my wrist is tight.
My gown hangs loose.
My gurney will soon roll toward the unknown.
I knew this day was coming,
but I'm still not ready for it.
My body is tense.
Hold me steady as I give myself to the care of others.
Help me trust You with what I cannot know
and cannot control.
Fear makes me study every face,
strain at every sound,
grasp at every word I half understand,
as if keeping watch could keep me safe.
You know how exposed I feel,
how difficult it is to let go
when so much seems to depend on what happens next.
Give me peace in the hands around this bed.
I know they are skilled.
I know I can trust their care.
I know all the reasons I should not be afraid.
And yet...
Stay near when I can no longer keep watch for myself.
Let mercy meet me on the other side of sleep.
I am giving myself over to others, Lord.
So in this moment,
with all the trust I have
and all the fear I still carry,
I give myself over to You most of all.
Amen.

View File

@ -0,0 +1,46 @@
## 61:2
%% 4
> The Rock Higher Than I
>> From the end of the earth, I will call to you when my heart is overwhelmed. Lead me to the rock that is higher than I.
Occasion: Bad news from far away
Lord, news has come from far away,
and the miles landed all at once ---
a name I know and love,
a place I cannot reach by nightfall.
I don't know what to do with this distance.
My mind keeps traveling to where my body cannot go,
imagining what is happening,
wondering what will happen next.
I want to help,
but I don't know what help is needed.
Take this helplessness before it hardens.
Show me how to love across the miles.
Give me the words to pray,
and keep me from filling the silence
simply because I am afraid of it.
I want to be there with my hands and heart,
not here only waiting for news.
The waiting does not feel passive;
it takes all the strength I have
not to be carried away by fear.
Be the rock under those I cannot hold.
Be the ground under me too,
so I do not fall apart while I wait,
and wait,
and wait.
I cannot cross these miles tonight.
But You can.
I cannot stand beside them.
But You are there already.
Hold us all through this long distance,
and give me grace for what I can do now.
Amen.

View File

@ -0,0 +1,43 @@
## 73:26
%% 4
> The Strength of My Heart
>> My flesh and my heart fail, but God is the strength of my heart and my portion forever.
Occasion: Bad news from the doctor
The doctor's words are still with me, Lord.
I heard what was said,
but I still can't take it in.
My body feels suddenly uncertain,
and the life I knew this morning
already feels far away.
Help me hold what I have heard
without letting fear add so much more.
My mind runs ahead to pain,
weakness,
loss,
and long nights I have not yet lived.
I keep reaching for answers
that no one can give.
I am afraid of what comes next,
and tired already from imagining it.
Don't let tomorrow crush this moment,
this breath,
this hour.
Be the strength of my heart
while I make the next call,
ask the next question,
and do what today requires.
Give me enough steadiness for what is mine to do today,
even while so much remains unknown.
I don't know what comes next, Lord.
I only know I can't face it without You.
Be the strength of my heart
for all that comes.
Amen.

View File

@ -0,0 +1,49 @@
## 90:1
%% 4
> Our Dwelling Place
>> Lord, you have been our dwelling place for all generations.
Occasion: Starting over after disaster
The ground is still a mess, Lord ---
debris everywhere,
plastic bins at the ready.
I keep looking at what remains,
remembering what was.
Even the smallest things can undo me.
I am tired before I even begin,
and I do not know how to start
when starting means admitting how much is gone.
Meet me in the work of this day.
Show me what to pick up first.
I can freeze up,
seeing all of it at once,
or waste my strength trying to save what is already gone.
The ruin makes every choice feel impossible.
Help me accept that some things cannot be restored.
Help me grieve what is gone
without letting grief take everything that survived.
When anger rises, stay with me.
When weariness settles into my bones,
give me grace enough for one more needful thing.
Keep my hands to the next small task,
and send people who will carry boxes,
bring water,
stand in the wreckage with me
without trying to say what cannot be said.
You were our dwelling place before this ruin.
You are our dwelling place here in the ruin.
You will be our dwelling place when we start again.
Until then, hold me here,
among what remains,
and help me begin.
Amen.

View File

@ -0,0 +1,36 @@
## 112:7
%% 4
> His Heart is Steadfast
>> He will not be afraid of evil news. His heart is steadfast, trusting in the LORD.
Occasion: After hearing bad news
Lord, the words still echo ---
the silence after hearing them,
the whole day bent around one sentence.
Hold me where the news has struck.
I do not yet know what all of this will mean,
and I am afraid of what may come.
Don’t let my mind run ahead of what I know.
I can build ten sorrows from one hard fact.
I can lie down with dread as if it were a blanket.
I can expect the night to answer questions it cannot.
You know how difficult it is to stop worrying,
to stop preparing for every possible grief.
My body is tired,
but my thoughts will not be still.
Give me peace for this one night.
Give me enough trust to sleep before anything is solved.
Enough safety to unclench my hands
and let tomorrow remain with You.
The heavy words still echo in the room.
You are still in the room.
Stay with me through the dark,
and keep me while I sleep.
Amen.

View File

@ -0,0 +1,40 @@
## 27:4
%% 4
> To Dwell in the Lord's House
>> One thing I have asked of the LORD, that I will seek after: that I may dwell in the LORD’s house all the days of my life, to see the LORD’s beauty, and to enquire in his temple.
Occasion: A distracted heart
This room is quiet, Lord,
and still my mind keeps turning ---
to the message I forgot,
to the noise down the hall,
to the idle thoughts that crowd out everything worthy.
I want to be present,
but even that desire becomes another thing
I cannot seem to hold on to.
Gather me here.
Help me stay in one place before You.
I do not need to chew on every worry
or settle every unfinished thing
before I can pray.
If I keep scattering,
I will give You only scraps of me ---
a chair, a breath, Your name,
and little else held together.
Receive them anyway,
and patiently gather me again.
Bring my thoughts back when they scatter.
Bring my eyes back when they wander.
Bring my heart back to this room.
And when I drift again,
as I surely will,
teach me to return without shame
to You.
Amen.

View File

@ -0,0 +1,38 @@
## 42:1
%% 4
> My Soul Pants for You
>> As the deer pants for the water brooks, so my soul pants after you, God.
Occasion: Coming back after drifting
Lord, I am at the door again.
I have drifted a long way on little wants,
one day at a time,
one shrug,
one delay,
until You felt far because I kept straying.
Sometimes I knew I was drifting.
Other times I hardly noticed.
Now the distance feels real,
and I am ashamed that I let it go so far.
Bring me back without disguise.
Teach me to come thirsty and tell the truth.
I do not want to make promises
only because I am afraid,
or pretend I can repair the distance myself.
I'd rather arrive with an excuse in hand.
I'd rather speak around the bare fact
that I left the stream for dust.
The words stick like dust on my tongue
even now, trying to say it plainly.
Bring me all the way in.
Do not let shame keep me at the door.
I came back with dust in my mouth.
Let the first thing I taste be mercy.
Amen.

View File

@ -0,0 +1,46 @@
## 42:5
%% 4
> Why are you in despair?
>> Why are you in despair, my soul? Why are you disturbed within me? Hope in God! For I shall still praise him for the saving help of his presence.
Occasion: When today feels wasted
Lord, evening is here,
and what can I point to?
The hours slipped,
the plan fell apart,
I sometimes started, and mostly stopped,
and now the light is fading.
I keep going back over what I meant to do,
measuring the day by what remains unfinished.
I am frustrated with myself,
and tired of carrying the feeling
that I should have done more.
Meet me before I throw this day away in my mind.
Show me what You still see in it.
If I call it useless,
I will sink into shame,
and shame will waste the next day too.
One empty day has a way of writing itself into the next.
Gather what was scattered ---
the small duty I finished,
the harsh word I held back,
the rest my body needed,
the prayer I am praying now.
Help me receive these hours as they were,
not as I wish they had been.
I do not need to pretend they were fruitful
or force myself to feel glad.
Only keep me from believing
that an imperfect day is beyond Your care.
The light is fading, Lord.
Stay with me in the fading light,
and make even this day part of Your mercy.
Amen.

View File

@ -0,0 +1,41 @@
## 84:2
%% 4
> My soul longs, and even faints for the courts of the LORD
>> My soul longs, and even faints for the courts of the LORD; my heart and my flesh cry out for the living God.
Occasion: Restless after getting what you wanted
Lord, I got the thing I asked for,
and nothing changed.
The cup is in my hand,
and I am still looking past it.
I do not want to be ungrateful.
I am glad for what has come.
But I thought the wanting would end here,
and it has only changed its name.
Show me why my heart keeps yearning
after the gift was given.
I thought this would settle me.
Instead I keep checking,
keep measuring,
keep asking what comes next.
I compare this joy to the joy I imagined,
and wonder why it does not feel like enough.
Even good gifts turn thin
when I ask them to be You.
Turn me from the gift to the Giver.
Teach me to receive with open hands,
without grasping for something more.
Let me be grateful without pretending
a gift can quiet every hunger.
Teach me to be content in Your presence.
I keep asking what comes next.
What comes next is always ---
You.
Amen.

View File

@ -0,0 +1,39 @@
## 92:12
%% 4
> A Cedar in Lebanon
>> The righteous shall flourish like the palm tree. He will grow like a cedar in Lebanon. They are planted in the LORD's house. They will flourish in our God's courts. They will still produce fruit in old age. They will be full of sap and green.
Occasion: Discouraged by slow growth
Lord, I keep looking for fruit too soon.
I check the branch.
I count the days.
I see small changes and call them nothing.
It is hard to keep going
when so much seems unchanged.
I begin to wonder whether I am growing at all,
or whether I have mistaken waiting for faithfulness.
Roots do their hardest work in the dark,
long before there's anything to show.
Teach me the pace of a tree.
Give me patience for work that stays hidden a long time.
Help me trust the quiet forming of roots
before there is anything on the branch to show.
I tire of what does not show.
I want quick results.
I want one clean sign that all this waiting matters.
Keep me rooted among people who know how to tend slow things,
who water and wait,
who do not dig up roots to see if they live.
And when I am tempted to measure this season too quickly,
give me grace to remain where I am
and receive what sustains me today.
I keep looking for fruit too soon.
Keep me waiting instead for Your roots.
Amen.

View File

@ -0,0 +1,51 @@
## 94:19
%% 5
> Your Comforts Delight My Soul
>> In the multitude of my thoughts within me, your comforts delight my soul.
Occasion: Inner turmoil
There is a storm in my heart, Lord.
I am calm on the outside,
but not inside.
Old hurt,
new anger,
shame,
want,
all of it jostling against each other.
I do not know which feeling to trust.
I cannot tell what needs my attention
and what will pass if I wait.
Even when I try to be still,
the argument inside me keeps raging.
Sort what I cannot sort.
Name what is true in me,
and what is only noise.
Help me face what is mine to face
without letting every thought take hold of me.
If I act out this churn,
I will wound with my mouth,
or go cold,
or hide.
Pain so readily looks for someone else to wound.
Still me while I am restless.
Give me a quiet center in Your care.
Not a hard shell.
Not numbness.
Not the pretense that none of this matters.
A place where I can stand and not be swept away,
where I can breathe before I speak
and wait before I turn.
In my chest,
be my peace.
Beyond the noise,
be my peace.
Over everything,
be my peace.
Amen.

View File

@ -0,0 +1,45 @@
## 100:5
%% 4
> His Faithfulness to All Generations
>> For the LORD is good. His lovingkindness endures forever, his faithfulness to all generations.
Occasion: When God's goodness feels distant
Lord, all is quiet
and I still cannot feel Your nearness ---
just the chair,
the window,
the slow clock,
the same prayer said again and again --- lifelessly.
I am tired of reaching for You
and meeting what feels like empty air.
I do not want to mistake silence for absence,
but some days I do not know how else to understand it.
I know that You are good.
But sometimes that goodness feels very far away.
Show me Your goodness in a form I can recognize.
A small thing.
Bread on the table.
Kindness arriving at the right time.
Strength to stand up and feel the sun.
I am not asking for everything to make sense.
I am asking for enough mercy
to carry me through this day
without pretending it is easier than it is.
Do not let this long silence teach me that You are gone.
Do not let numbness start to speak as if it were truth.
And when I cannot feel what I believe,
hold me through the distance between them.
Keep me near the simple mercies
that do not shout
but abide.
In this quiet hour,
abide with me.
Amen.

View File

@ -0,0 +1,37 @@
## 136:1
%% 4
> His Lovingkindness Endures Forever
>> Give thanks to the LORD, for he is good, for his lovingkindness endures forever.
Occasion: When gratitude feels hard
Lord, the room is quiet,
and I can name what hurts,
what I cannot afford,
the absence I keep noticing.
These are not small things to me.
They take up space in my thoughts
and make gratitude feel almost dishonest.
I do not have bright words tonight.
I can't pretend that pain is a gift
or that disappointment doesn't matter.
Give me one true thank you
that is not forced,
one word of gratitude
that does not ask me to deny what is hard.
Keep me from treating Your goodness like a lie
just because this day was hard.
And keep me from using gratitude
to hurry past my sorrow.
Let me see one small thing You have kept for me ---
breath in my lungs,
warmth in my body,
light in the dark.
You are still good, even here, even tonight.
Amen.

View File

@ -0,0 +1,51 @@
## 143:8
%% 4
> Your Lovingkindness in the Morning
>> Cause me to hear your lovingkindness in the morning, for I trust in you. Cause me to know the way in which I should walk, for I lift up my soul to you.
Occasion: Praying first thing
Before the coffee pot starts,
before the screen lights up,
before I speak to anyone else,
Lord, let me speak with You.
I am here, though part of me is still waking,
and part of me has already begun
to carry the weight of the day.
Yesterday is not entirely gone.
Today is already asking things of me.
Let Your kindness be the first thing I hear this morning.
Teach me to bring You my soul
before I hand this day to habit,
hurry,
or whatever shouts the loudest.
One thought follows another,
and soon I am moving
without ever having asked
where I am going
or who I am becoming along the way.
So make this first turning toward You plain.
A chair.
A breath.
A few honest words.
I don't need to sound wise ---
as if You didn't already know me.
I don't need the whole way mapped ---
one step is what You've promised.
Only show me how to walk faithfully
into the hours before me,
and give me grace enough
for the next thing.
Before the coffee pot starts,
be first.
Before the screen lights up,
be first.
Amen.

View File

@ -0,0 +1,44 @@
## 23:1
%% 4
> The Lord Is My Shepherd
>> The LORD is my shepherd; I shall lack nothing.
Occasion: Learning to trust God's provision
Lord, You say You will provide,
but I keep reaching for control ---
checking the same account,
rehearsing the same fear,
trying to secure tomorrow with my own hands.
One unanswered question becomes ten,
and soon I am living inside a future
that has not even arrived.
And likjely never will.
I am tired of carrying it,
but I am afraid of what will happen if I let it go.
Teach me trust in small things.
Teach me to receive what comes today as Your care,
not as accident.
And when today does not seem like enough,
help me speak that fear plainly to You
instead of hiding it behind more planning.
Clinging feels like doing something.
It does not feed me.
So place before me the daily signs of Your keeping ---
water from the tap,
food on the plate,
strength for the next task,
sleep when the light goes out.
Let these ordinary gifts be enough for this moment.
Not proof that tomorrow will be easy,
but mercy I can receive now.
I keep trying to secure tomorrow.
You are securing me tonight.
Amen.

View File

@ -0,0 +1,39 @@
## 28:7
%% 4
> My Strength and My Shield
>> The LORD is my strength and my shield. My heart has trusted in him, and I am helped. Therefore my heart greatly rejoices. With my song I will thank him.
Occasion: Thanking God for answered prayer
Lord, I asked You for this,
and now the answer sits right in front of me.
For a while, I did not know what would happen.
I carried my prayer through my days,
sometimes trusting,
sometimes afraid to hope too much.
Now relief is moving through my body.
Something in me can finally unclench.
Thank You for this help,
for this mercy I can name.
Keep me from walking past it
as if it came from nowhere.
I'm quick to move on.
I'm quick to use the gift
and forget the giver.
So I pause now to thank You.
Let gratitude have a body ---
my voice out loud,
my shoulders set straight,
my next breath received, not owned.
I asked.
You heard.
You helped.
With my song I will thank You.
Amen.

View File

@ -0,0 +1,43 @@
## 30:5
%% 4
> Joy Comes In the Morning
>> For his anger is but for a moment. His favour is for a lifetime. Weeping may stay for the night, but joy comes in the morning.
Occasion: Coming out of a hard season
The air feels different now, Lord.
I can sit down to a meal
without bracing for what might come next.
A door has opened.
I am grateful,
but I hardly know how to trust this relief.
I endured so long that even gladness
can feel unfamiliar.
Keep me from living as if the storm still owns my house.
Teach my body to believe what this new light says.
Let my breathing slow.
Let me receive a quiet day
without searching it for danger.
Part of me still waits for the floor to give way.
Part of me does not know what to do
when the day is not all panic.
Fear can linger long after there's nothing left to fear.
Bring me into ordinary life again ---
meals at a table,
work that can be done,
sleep that comes easily,
thanks that is not forced.
Help me accept these simple mercies
without demanding that they promise me
nothing hard will ever happen again.
Give me grace to live in the good that is here now.
You brought me out of that season.
Bring that season out of me.
Amen.

View File

@ -0,0 +1,43 @@
## 37:4
%% 5
> Delight Yourself in the Lord
>> Also delight yourself in the LORD, and he will give you the desires of your heart.
Occasion: Seeking contentment in God
Lord, teach me to sit still in the life I have today ---
this place,
this body,
this table,
this portion.
Some days, what I have does not feel like enough.
I compare it with what I hoped for,
or with what seems to have been given to others.
I keep imagining that contentment is waiting
just beyond the life in front of me.
Let me receive what is here
without always leaning toward what is elsewhere.
Wanting more can become a low noise
that follows me through the day
and keeps me from tasting what is in my hand.
I do not always know how to quiet it.
Even gratitude can feel like something
I am trying to force.
Be my enough.
Not as a phrase I repeat
to make disappointment disappear,
but as grace for this present moment.
In an ordinary meal.
In an unremarkable hour.
In the quiet after the dishes are put away.
Here, Lord.
Here in this room.
Here, be my enough.
Amen.

View File

@ -0,0 +1,41 @@
## 65:11
%% 4
> You Crown the Year
>> You crown the year with your bounty. Your carts overflow with abundance.
Occasion: Giving thanks for enough
This table is plain, Lord ---
bread cut,
bowls set out,
a light on in the kitchen,
food enough for this day.
Teach me to call enough by its right name.
Keep me from counting what is missing
until I pass over what is here,
from treating daily bread like a small thing.
Gratitude turns restless so easily,
enough begins to feel like less
the moment I compare it
with what others have
or with what I hoped would be mine.
Make me quick to thank You
for the cupboard that is not empty,
for the glass that is full,
for the meal prepared.
I do not need to pretend
that every need has vanished.
Only help me receive what is here
without taking its goodness for granted.
At this table,
let want grow quiet.
At this table,
let me thank You first.
Amen.

View File

@ -0,0 +1,48 @@
## 90:14
%% 4
> Satisfy with your lovingkindness
>> Satisfy us in the morning with your lovingkindness, that we may rejoice and be glad all our days.
Occasion: Thankfulness for this morning
Lord, thank You for this morning ---
for light splayed across the floor,
for the coffee warm in my hands,
for a body rising yet again from sleep.
I did not make this day.
I did not call the light into being
or keep myself through the dark.
I have simply opened my eyes
and found Your mercy waiting for me.
Keep me from acting as if I made this hour.
Let gratitude be my first word
before worry begins naming what must be done,
before yesterday and tomorrow reach for me again.
I can move into the day quickly,
reach for my phone,
fill my head with folly,
and miss the gift before me.
I can hurry past what I prayed to be given
and treat each day
as nothing more than a list of demands and amusements.
So make me slow enough to receive ---
the quiet,
the bird at the window,
the open page,
the mercy of another beginning.
And when the day grows crowded,
bring me back to this:
I am alive.
This morning was given.
I do not have to possess it
to be glad in it.
Thank You for this morning, Lord.
Thank You for this morning.
Amen.

View File

@ -0,0 +1,42 @@
## 95:1
%% 5
> The Rock of Our Salvation
>> Oh come, let’s sing to the LORD. Let’s shout aloud to the rock of our salvation!
Occasion: Singing with joy again
The song has been gone a long time, Lord.
My mouth knew the words,
but they lay there like dry bread.
I remember how joy sounded
but not how it felt.
This morning I feel one note rise again.
It is small, and I am almost afraid to trust it.
Part of me wonders how long it will last,
or whether grief will swallow it again.
Guard that small note.
Let joy return at its own pace.
I don't want to fake it,
or force a smile over old grief,
or distrust the good because it has seemed absent.
I do not want to question every gladness
until it disappears.
Give me place to sing before I can explain it.
Let me receive this moment
without demanding that it heal everything.
Let my body learn gladness again ---
breath,
voice,
unclenched hands.
The song has been gone a long time.
That silence has cost me dearly.
Thank You for this one note,
and for the hope of the next,
and the next.
Amen.

View File

@ -0,0 +1,45 @@
## 103:2
%% 5
> Don’t Forget All His Benefits
>> Praise the LORD, my soul, and don’t forget all his benefits,
Occasion: Remembering past help
Lord, take me back for a minute ---
to the place where I waited,
to the week I thought would break me,
to the morning You carried me through and I did not fall.
Bring to mind the help I have forgotten.
Not to live in the past,
but to trust You in the future.
I remember the fear more easily sometimes.
I remember how long the days felt,
how scared I was,
how little I knew about what would come next.
But trouble was not the whole story.
If I forget where You met me,
I would face this day as if I came here alone.
I would call Your rescue ``luck''
and Your mercy ``accident.''
I would mistake my survival for my own strength
and forget how often I had none left.
Set Your mercies in order before me.
Let them stand like markers by the road,
bright markers that say,
You helped me here.
And here.
And here.
And when today feels unlike anything before,
when I cannot yet see what Your help will look like,
keep me from believing that I have been abandoned.
You helped me then, Lord.
You will not be absent ---
ever.
Amen.

View File

@ -0,0 +1,42 @@
## 104:33
%% 5
> I Will Sing to the Lord
>> I will sing to the LORD as long as I live. I will sing praise to my God while I have any being.
Occasion: Staying faithful in old age
Lord, the same stairs seem steeper.
The fork shakes inexplicably.
Words go missing mid-sentence.
But I am still here with You.
Some days I accept these changes.
Other days they frighten and frustrate me.
I miss what once came easily,
and I do not always know how to live
with needing more time and patience.
Teach me how to praise You at this slower pace.
Show me what faithfulness looks like
when the body does less
and the day grows quiet earlier.
Let me be honest about what has been lost
without overlooking what remains.
Do not let me believe the lie
that my best years were the only years
You could use.
That I am set aside
because I am no longer quick.
Give me grace for this day,
not the strength I had years ago,
but the strength I have now.
Give me a steady heart,
a chair by the window,
a psalm I can still pray.
The stairs take longer, Lord.
Keep my praise steady on every step.
Amen.

View File

@ -0,0 +1,47 @@
## 107:1
%% 4
> His Lovingkindness Endures Forever
>> Give thanks to the LORD, for he is good, for his lovingkindness endures forever.
Occasion: When blessings feel ordinary
This cup of water tastes like nothing special, Lord.
The light comes on.
The door shuts.
The bed held me through the night.
Meh.
None of this asks for my attention.
So I hurry past it,
already thinking about what is missing,
what is late,
what has gone wrong.
Teach me to see what I step over.
Teach me to notice the gifts that do not announce themselves.
I can live inside Your kindness all day
and call it ordinary.
I can treat steady mercies like the hum of a machine
that I've learned not to notice at all.
Forgive me for how easily I confuse
what is familiar with what is small.
I do not want to need loss
to learn gratitude.
Wake me to the plain good near at hand.
Easy breath.
Clean water.
A body that rose this morning.
A caring voice that answered when I called.
Let me pause long enough to receive these things,
not as what I am owed,
but as quiet mercies holding my life together.
This cup of water.
Let me receive even this cup of water as kindness.
Which is exactly what it is.
Amen.

View File

@ -0,0 +1,46 @@
## 116:12
%% 5
> What Will I Give To The LORD?
>> What will I give to the LORD for all his benefits toward me?
Occasion: When I'm grateful but don't quite know how to say it
Lord, thank You.
Saying that seems too small,
but it's what I have.
There are gifts I can name
and others I only feel:
a fullness,
a quiet gladness,
the sudden knowledge
that I have been given more
than I know how to fully appreciate.
I could try to make a list.
Perhaps I should.
But gratitude is larger than any list.
I cannot repay goodness
by being sufficiently thankful for it.
I cannot balance some account
between Your giving and gratitude.
So let me simply receive.
Let gratitude make me generous,
more attentive,
quicker to notice what is good
and slower to imagine I am owed anything.
What can I give You
for all You have given me?
For now,
these inadequate words will have to suffice:
Thank You.
Amen.

View File

@ -0,0 +1,45 @@
## 118:24
%% 5
> This Is The Day
>> This is the day that the LORD has made. We will rejoice and be glad in it.
Occasion: When I've had a good day
Lord, today was good.
Nothing spectacular.
No sea parted.
No mountain moved.
It was simply good.
There was food I enjoyed,
work worth doing,
a laugh I did not expect,
someone I was glad to share time with.
For once I do not come to You
because something hurts
or because I need an answer.
I come because the day was good,
and I noticed.
Thank You.
Thank You for ordinary happiness,
for moments that ask nothing of me
except that I receive them.
I know every day will not feel like this.
That makes me want to notice this one.
This is the day You made.
I was here for it.
And I am glad.
And grateful.
Amen.

View File

@ -0,0 +1,36 @@
## 143:8
%% 4
> Your lovingkindness in the morning
>> Cause me to hear your lovingkindness in the morning, for I trust in you
Occasion: Waking up grateful
Lord, today I want to count differently.
Not what's missing.
Not what's owed to me.
Just what's here.
This breath.
Coffee warm in my hands.
Sunlight streaming in the window.
Birds singing in the trees outswide.
A voice I love in the next room.
You have not left me.
Every good thing was Yours before it was mine ---
this table,
this roof,
these hands still able to work.
Let me name them before the day crowds in.
Not a grand list.
Just today's list ---
small, true, and enough.
All that is within me,
praise You.
Not for what's coming.
Not for what's owed.
For this --- right now.
Amen.

View File

@ -0,0 +1,42 @@
## 20:4
%% 4
> Your heart's desire
>> May he grant you your heart's desire, and fulfil all your counsel.
Occasion: Bringing dreams before God
Lord, I have built mansions in my mind ---
work I could do,
places I could go,
a life that is wide and bright when I imagine it.
I return to these mansions often.
Sometimes they give me hope.
Sometimes I hold them so tightly
that any other future feels like loss.
I bring these plans to You
before they become a place I refuse to leave.
I want them so much,
and I'm afraid of being disappointed.
Save me from loving the picture
more than I love Your voice.
Save me from calling every strong wish
``a sign.''
Teach me to desire without demanding,
to hope without pretending I know,
and to wait without closing my heart.
Take what is false.
Keep what is true.
Open the right door,
and close the shiny wrong one,
even when I do not understand why.
These are the mansions in my mind.
Grant what serves me, Lord,
and quietly close the rest.
Amen.

View File

@ -0,0 +1,40 @@
## 25:4
%% 4
> Show Me Your Ways
>> Show me your ways, LORD. Teach me your paths.
Occasion: Making a big move
Drawers are empty, Lord.
Boxes are stacked in the garage.
The room already sounds different.
Soon there will be another street,
another window,
another bed in another dark.
I feel the pull in both directions:
the hope of a new beginning
and the ache of leaving what has become comfortable.
Everything is changing, and I do not yet know
how I will belong in what comes next.
Show me Your path through this leaving.
Show me what to bring,
and what to leave behind.
A move stirs up fears ---
I make lists and plans,
but I cannot prepare myself for everything.
When I feel unsteady,
give me grace for the next small step.
Go before me into the new place ---
into the first night,
the bare floor,
the unopened boxes,
the strange morning light.
You were Lord in this room of yesterday.
Be Lord in the room of tomorrow too.
Amen.

View File

@ -0,0 +1,45 @@
## 27:1
%% 4
> The LORD is my light and my salvation. Whom shall I fear?
>> The LORD is my light and my salvation. Whom shall I fear? The LORD is the strength of my life. Of whom shall I be afraid?
Occasion: Facing an important morning
Lord, this morning has weight ---
my ironed clothes laid out,
my clock checked twice,
words already circling in my head.
My body knows the importance of this
before anything has even begun.
Before I begin,
hear my voice.
Give me a clear mind
and a steady voice.
Help me tell the difference
between what must be said
and what fear keeps rehearsing.
I can lose myself so quickly
in trying to seem capable.
But beneath my careful preparation are the real questions:
Will I be enough?
Will I remember what I must?
What will happen if this doesn't go as I hope?
Go before me.
Let me see Your guidance
in whatever this morning brings.
And if I stumble,
keep me from believing that one uncertain moment
has undone everything.
Give me grace for what is actually before me,
not every outcome my mind can invent.
This morning has weight.
O Lord, carry what I cannot.
Amen.

View File

@ -0,0 +1,49 @@
## 32:8
%% 4
> I Will Instruct You
>> I will instruct you and teach you in the way which you shall go. I will counsel you with my eye on you."
Occasion: Seeking God before decisions
Lord, I have a decision to make
and every choice starts talking at once ---
what will work fastest,
what will look best,
what will be the least trouble.
I do not always know which voice is wisdom
and which is fear dressed as caution.
I want the uncertainty to end,
and sometimes that desire alone
is enough to make me hurry.
Quiet the fearful voices
so I can hear what You want.
Quiet my need to have an answer right away,
and my fear that I will choose poorly.
If I act too soon,
I may mistake haste for clarity,
and live with what I chose in the dark.
You know how easily I can decide first
and then ask You to bless my decision after.
Keep me from calling my preference ``Your leading.''
Let me inquire before I act.
Bring me into Your presence
before I step onto the next path.
I do not need to see the whole way.
Give me enough light for the step before me,
and enough patience not to force what is still unclear.
Not the flashy road.
Not the popular road.
Not the easy road.
The road taken after I have been with You.
Before I choose anything else,
I choose You.
Amen.

View File

@ -0,0 +1,46 @@
## 34:8
%% 4
> Taste and See the Lord Is Good
>> Oh taste and see that the LORD is good. Blessed is the man who takes refuge in him.
Occasion: When I reach for the wrong refuge
Lord, there are many places I could run.
A screen.
A bottle.
Busyness.
Another person to decide for me.
Before I reach for the first thing,
slow my hand.
Let me see what I'm truly asking.
Sometimes I do not want refuge ---
I want escape.
I want the ache quieted,
the uncertainty gone,
the waiting taken out of my hands.
I want something immediate,
even if it can't work for long.
I know why the wrong refuge looks good:
It answers right away.
It asks little.
It lets me stay numb.
And sometimes, Lord,
numbness feels easier than trust.
Turn me toward what is solid.
Toward prayer, not panic.
Toward honest work.
Toward people who will not feed my fear.
Give me enough courage for this moment:
to pause,
to tell You the truth,
and to wait before I choose.
There are many places I could run.
Let me run to You first.
Amen.

View File

@ -0,0 +1,49 @@
## 39:4
%% 4
> Lord, show me my end
>> LORD, show me my end, how many days I have left, and how fleeting my life is.
Occasion: Making the most of today
This day will not come again, Lord ---
these hours,
this strength,
this open stretch before night closes.
I feel both the gift of it
and the weight.
I do not want to waste what You have given,
but I do not want to clutch at every hour
as though everything depends on me.
Show me where to spend my time.
Keep me from pouring it out on foolishness.
A day can be consumed ---
one scroll at a time,
one delay,
one dull drift after another,
until evening comes and I can't say what I did.
I lose attention so easily,
and avoid what matters
because it asks more of me than I want to give.
Keep me awake to what this day contains ---
work that serves,
words that mend,
rest that restores,
prayer that keeps me near You.
And when the day doesn't go as planned,
keep me present to the time still before me.
Give me grace for that hour,
and then the next.
This day will not come again.
Let me come to tonight having used it well,
not perfectly,
but faithfully,
for You.
Amen.

View File

@ -0,0 +1,46 @@
## 82:8
%% 4
> I will instruct you and teach you
>> I will instruct you and teach you in the way which you shall go. I will counsel you with my eye on you.
Occasion: Stress from too many decisions
There are too many forks in the road today, Lord ---
what to answer,
what to delay,
what to keep,
what to let go.
Even small choices seem impossible.
My mind keeps spinning.
I am tired of rethinking what I've already decided,
and being afraid of overlooking what matters.
The multitude of my worries
leaves little room for peace.
Give me a clear mind.
Help me see which decisions need thought,
and which only need a simple yes or no.
Show me what I must decide today,
and what can wait without self-recrimination.
When I am worn thin,
I treat every turn like a test of my whole life.
Then I freeze,
or rush,
or fret over every step.
How do I trust a choice
when I can't see where it will lead?
Set me among quieter things ---
a clearer hour,
a shorter list,
a faithful next step.
Let Your comfort reach me
before every question is answered.
At these forks in the road,
keep me from standing frozen.
Lead me forward into Your path instead.
Amen.

View File

@ -0,0 +1,45 @@
## 90:12
%% 4
> Teach Us To Count Our Days
>> So teach us to count our days, that we may gain a heart of wisdom.
Occasion: Choosing how to spend your time
There are too many tasks in front of me, Lord ---
the message to answer,
the work that awaits,
the person who needs my ear,
the errand that can't wait.
They all call my name,
each insisting it belongs first.
I do not always know the difference
between what is truly needed
and what is simply loud.
Teach me to count this day well.
Show me what belongs first,
and what can be safely left undone.
Help me accept that choosing one thing
means setting another aside.
I can scatter myself
until night comes.
Touching many things
but serving no one with a whole heart.
I hurry so easily,
my attention divides so quickly,
and I feel guilty
when I cannot meet every need.
Give me a wise heart that can choose,
that can stay with one task,
that can look a person in the eye
and not be pulled away by every small demand.
Not everything first.
Not everything now.
Your will first.
Amen.

View File

@ -0,0 +1,35 @@
## 119:105
%% 4
> A Lamp to My Feet
>> Your word is a lamp to my feet, and a light for my path.
Occasion: Taking one step at a time
This day is enough, Lord.
The next step is enough.
I can't yet see tomorrow's path.
Teach me to live within the reach of Your lamp ---
one patch of ground,
one turn of path,
and not some great extent.
I keep reaching ahead,
trying to walk many steps at once,
and then I stumble over the one right in front of me.
You know how hard it is for me
to trust what I cannot yet see.
Keep the light small on purpose.
Let it show me only the step I'm on,
not the hill beyond it,
not the dark around the corner.
Give me enough courage for this present step,
and enough patience not to demand the next.
One step in the light.
Then another.
And another.
Amen.

View File

@ -0,0 +1,44 @@
## 143:10
%% 4
> Lead Me in Uprightness
>> Teach me to do your will, for you are my God. Your Spirit is good. Lead me in the land of uprightness.
Occasion: Needing moral clarity
Lord, things have gone muddy.
Every reason has another reason behind it.
Every voice says it is simple,
but nothing feels simple at all.
I keep turning it over,
hoping more thought will make the answer clear.
Instead, I find more ways to excuse what I want
and more reasons to distrust what I know.
Cut a clean line through it.
Show me what is right,
not what is expedient,
not what saves face,
not what asks the least of me.
I can talk myself into almost anything
when the gain is close
and the cost is hidden.
You know how easily fear can sound like wisdom
and self-interest like necessity.
Let Your Spirit lead me onto firm ground,
where I can name the lie a lie
and the good a good,
without trimming either one.
Give me courage to accept what is right
even if it costs more than I hoped,
and enough humility to admit
where I have been wrong.
Things have gone muddy, Lord.
Bring me where the ground is firm again,
and teach me to walk there.
Amen.

View File

@ -0,0 +1,36 @@
## 6:6
%% 5
> I Water My Couch With Tears
>> I am weary with my groaning; all the night make I my bed to swim; I water my couch with my tears.
Occasion: Loss of a child
Lord, there are no words for this.
I looked for them and found none.
At all.
The nights are the worst.
I lie awake and the house is too quiet
in a way it was never quiet before.
I am not going to pretend I understand.
I am not going to pretend this makes sense,
or that it will, ever.
I soak my pillow with tears.
That is not poetry to me.
That's just what happens most nights.
I don't need You to explain this.
I need You to stay with me
while I cannot stop weeping.
and not leave,
or rush toward being ``fine.''
Hold what I cannot hold.
Carry what I cannot carry.
I am so broken, Lord.
Stay with me in this darkness.
Amen.

View File

@ -0,0 +1,39 @@
## 27:10
%% 4
> When Father and Mother Forsake Me
>> When my father and my mother forsake me, then the LORD will take me up.
Occasion: Loss of parents
Lord, I keep reaching for the phone
to tell them something,
before I remember --- they won't answer anymore.
I'm an adult.
I've been one for a long time.
I didn't expect to feel like an orphan at this age,
but that's the word that keeps echoing.
No one stands between me
and the front of the ``mortality line'' anymore.
Now I'm next.
I'm not ready for that.
I have so many questions
only they could have answered,
family stories I'll never get right,
things I meant to ask
and put off asking.
When my parents left me ---
not by choice, Lord, I know that ---
they still left a hole shaped like them.
Show me how to live with what's left undone between us,
with the questions with no one left to ask,
with this strange new place in line.
I called on them my whole life, Lord.
Now I need to call on You.
Amen.

View File

@ -0,0 +1,46 @@
## 34:18
%% 4
> Near to the Brokenhearted
>> The LORD is near to those who have a broken heart, and saves those who have a crushed spirit.
Occasion: Grieving a broken family
Lord, the table is split now ---
names not spoken,
holidays planned in halves.
What once felt shared
has become something everyone approaches fearfully.
I don't always remember what I am allowed to remember,
whom I may miss out loud,
or how to love one person without seeming to betray another.
This grief is tangled with anger.
Some days I rehearse what happened
and imagine all the ways it might have gone differently.
Other days I am simply tired of the distance,
tired of carrying what no one knows how to mend.
Teach me what peace is still possible,
even when things cannot be forced back together.
Help me accept that these are not the same thing,
and that I cannot repair every fracture by wanting it badly enough.
Keep me from reliving old scenes,
or idolizing how it used to be,
or wounding others with the sharp sadness I carry.
Give me a place where truth can be said plainly,
where blame doesn't fill the whole room,
where small mercies are not despised.
Give me grace for the next conversation,
the next gathering,
the next moment when the absence is present again.
You know this table, Lord.
You know who is missing
and what each silence costs.
Meet me at this table ---
split as it is.
Amen.

View File

@ -0,0 +1,36 @@
## 68:5
%% 5
> The Widow's God
>> A father of the fatherless, and a judge of the widows, is God in his holy habitation.
Occasion: Loss of a spouse
Lord, the bed still has two sides.
I sleep on my half,
though there's no one now to wake on the other.
I keep almost saying ``we.''
I catch myself mid-sentence,
correcting to ``I,''
and something in me breaks a little every time.
You are a father to the fatherless,
a judge for the widow.
I never thought I'd need that name for You.
I need it now.
Teach me how to be one person
after so long being two.
Not replaced.
Not whole in the old way.
Just held.
I still set two cups down some mornings.
Don't let that shame me.
Just let it be love
still finding somewhere to go.
You never forsake the widow, Lord.
Don't forsake me now.
Amen.

View File

@ -0,0 +1,43 @@
## 88:3
%% 5
> My soul is full of troubles
>> For my soul is full of troubles, and my life draws near to the grave.
Occasion: Grieving a suicide
Someone I care about just ended their own life.
Lord, Why?
How is this possible?
How did they come to so hideous a place
that they could see no other choice?
What did I do wrong?
What didn't I do that would have prevented this?
These questions rend me limb from limb.
The sun stops moving,
the birds stop singing,
the whole world comes to a grinding halt
as my mind struggles to grasp the ungraspable
and my heart struggles to bear the unbearable.
Meanwhile, there's the terrible shrapnel
that has deeply wounded everyone nearby.
Including me.
This person is now beyond my aid.
But the survivors are not.
There are no words to say to them.
There's no fix to apply.
All that can be done is be present
to those who have had a gaping hole
ripped in their souls.
No `words of wisdom,' just holding a hand.
No platitudes, just a meal prepared.
No clichés, just honest, caring silence.
This is far beyond any answer or solution.
Help me to be a small solace anyway.
Amen.

View File

@ -0,0 +1,42 @@
## 88:18
%% 4
> Lover and Friend Put Far
>> Lover and friend hast thou put far from me, and mine acquaintance into darkness.
Occasion: Loss of a friend
Lord, their voicemail is still in my phone.
I haven't deleted it.
I don't think I ever will.
People keep asking how I'm doing.
I evade a straight answer
because this loss doesn't have the shape
people know how to ask about.
We weren't married.
We weren't family.
We were just the two people
who understood the same jokes,
shared interests and history,
and called each other first.
"A dear friend taken from me" ---
that's a line from an old prayer, Lord,
and it's exactly right.
I don't know where to put this grief.
It doesn't fit the boxes people hand me.
So let me bring it to You instead.
You know what this friendship meant to me,
even if no one else quite gets it.
Keep their voice with me somehow.
Keep the jokes.
Keep what only the two of us shared.
Be the friend that stays,
now that one has gone.
Amen.

View File

@ -0,0 +1,38 @@
## 102:1
%% 4
> When I Am Overwhelmed
>> Hear my prayer, O LORD, and let my cry come unto thee. Hide not thy face from me in the day when I am in trouble; incline thine ear unto me: in the day when I call answer me speedily.
Occasion: A loss of something important
Lord, I lost something important to me.
It's just not something other people recognize as important.
It isn't a death.
It isn't a diagnosis.
There's no Hallmark card for this.
But something that mattered is gone,
and I feel its absence
the same way I'd feel any other grief ---
in the chest,
in the morning,
in the sentences I start
and don't know how to finish.
People don't even ask if I'm okay
because they don't understand how this thing
could break my heart.
Don't hide Your face from me
in this trouble that doesn't fit the usual categories.
You don't need a name for my grief
before You'll hear it.
I know that what I lost counts as real to You,
even on days no one else would understand.
Incline Your ear.
I am calling.
Amen.

View File

@ -0,0 +1,37 @@
## 139.13
%% 5
>You Knit Me Together
>>For you formed my inward parts; you knitted me together in my mother's womb... my frame was not hidden from you when I was being made in secret, intricately woven in the depths of the earth.
Occasion: Miscarriage
Lord, You knit together what I never got to hold.
I don't have a photograph.
I don't have a name everyone else got to use.
Just a due date I still know by heart,
and a silence where a heartbeat should have been.
People don't always know this counts as loss.
They didn't meet who I was already loving.
But I felt them ---
if only as hope,
if only as future,
if only as the first hushed word: almost.
You knew them before I did.
You knit them together in secret ---
the part of the story only You got to see.
I don't need an explanation.
I need to know they were not too small for You,
not too brief,
not too hidden ever to matter.
Let what was only begun still be complete in You.
Let whom I could not finish carrying
be someone You carry still.
Hold what I never got to hold.
Amen.

View File

@ -0,0 +1,42 @@
## 145:9
%% 4
> His Tender Mercies Are Over All His Works
>> The LORD is good to all: and his tender mercies are over all his works.
Occasion: Loss of a pet
Lord, the food dish is still on the floor.
I haven't moved it.
Some mornings I still listen
for the sound of pattering paws
before I remember...
People mean well when they say
"it was just a pet."
It wasn't ``just'' anything.
It was years of company,
of someone always glad to see me
every single day without fail.
I don't need anyone to tell me
this grief is smaller than other griefs.
Since when, in matters of grief,
does size matter?
Your tender mercies are over all Your works.
Not just the human ones.
All of them.
So let this grief count.
Let me miss the sound of their paws,
the weight at the foot of the bed,
the small joy that asked for so little
and gave so much.
Thank You for that whole life,
short as it was next to mine.
Be near me in this sorrow
whatever its measure.
Amen.

View File

@ -0,0 +1,47 @@
## 37:5
%% 4
> Commit Your Way to the Lord
>> Commit your way to the LORD. Trust also in him, and he will do this:
Occasion: Starting a new job
Lord, that first morning has come,
and I will walk through a door
where no one knows my name yet ---
with my freshly ironed shirt,
my bag by my new desk,
a screen that will light up
with work I've never seen before.
I want to do well.
I want to belong.
And beneath all my preparation
is the fear that I will miss something obvious,
say the wrong thing,
or discover I am not as ready as I hoped.
Keep me from spoiling my first impressions.
Teach me to be steady,
ready to learn,
ready to listen.
The pull is strong to prove myself at once,
to talk too much,
to pretend to know what I don't.
Help me bear the awkwardness of being new
without turning it into shame.
Give me courage to ask what I need to ask,
and patience with what I cannot master today.
Bring me one kind face,
one friendly voice,
one place to stand and begin.
I commit this new way to You:
the work, the uncertainty,
the hope I am almost afraid to name.
As I walk through that door, Lord,
walk with me.
Amen.

View File

@ -0,0 +1,34 @@
## 71:9
%% 4
> Do Not Forsake Me When My Strength Fails
>> Cast me not off in the time of old age; forsake me not when my strength faileth.
Occasion: Retirement
Lord, I cleared out my desk today.
Handed in my badge.
Walked to my car with my box,
and without anywhere I have to be tomorrow.
I thought I'd feel free.
Mostly I feel unmoored.
Don't cast me off in my old age.
But that's not really my fear.
My fear is smaller and stranger:
that I don't know who I am
without the job that once told me.
Show me what You always saw in me
beneath the title.
The part that was never on a badge.
Give me new work for these hands,
even if no one pays for it.
Give me a reason to get up
that isn't just a paycheck.
I'm not finished, Lord.
I've just changed seasons.
Amen.

View File

@ -0,0 +1,35 @@
## 71:17
%% 4
> Taught from My Youth
>> God, you have taught me from my youth. Until now, I have declared your wondrous works.
Occasion: Graduation
Lord, the gown is rented.
The tassel will move once, then be kept in a drawer.
But the years beneath this hour were bought dearly.
You have taught me from my youth, Lord ---
through every teacher who was patient with me,
and even those who were not so patient,
through late nights,
wrong answers,
and the slow arrival of understanding.
I do not want to walk off this stage
and forget how much I did not know a decade ago.
Keep me a student of something, always ---
if not in a classroom, then in Life.
I have declared Your wondrous works already.
I have my remaining lifetime to declare them even more.
Send me out with more than a diploma ---
send me out with a teachable heart,
useful hands,
and gratitude for everyone who got me here.
This hour is short, Lord.
Make what follows it long, and well spent.
Amen.

View File

@ -0,0 +1,34 @@
## 103:17
%% 4
> To Children's Children
>> But the lovingkindness of the LORD is from everlasting to everlasting on those who fear him, his righteousness to children's children.
Occasion: The arrival of a new grandchild
Lord, I held my own child like this,
once upon a time.
Now I am holding my child's child,
and something in the room feels like it has come full circle.
I see an old face in a new one ---
a nose,
a stubborn chin,
a way of frowning before the first cry.
Your kindness did not stop with me.
It reached past me to my child,
and now it reaches past my child to this one.
I will likely not see all of this little life.
I may not see half of it.
But I have already seen enough to entrust them to You.
Let me be the kind of grandparent who tells the truth about grace,
who has lived long enough to have living proof of it,
and is never too tired to share it.
To children's children, Lord.
Keep Your kindness flowing from generation to generation
long after I am only a beloved memory.
Amen.

View File

@ -0,0 +1,32 @@
## 127:3
%% 4
> A Heritage from the Lord
>> Behold, children are a heritage from the LORD. The fruit of the womb is his reward.
Occasion: The arrival of a new child
Lord, there is a new weight in this house tonight ---
almost as light as nothing,
but heavier than anything I have held before.
Ten fingers.
Ten toes.
A life that did not exist last year.
I did not form this child.
I only received one.
Thank You for entrusting me with what is Yours.
Teach me to love without gripping too tight.
Give me patience for the nights that blur into morning,
and joy that does not depend on sleep.
This heart beats separate from mine,
and yet --- our hearts beat as one.
Make me worthy of this heritage, Lord ---
one lullaby,
one diaper,
one 3 a.m. at a time.
Amen.

View File

@ -0,0 +1,33 @@
## 128:1
%% 4
> Around Your Table
>> Blessed is everyone who fears the LORD, who walks in his ways... your children will be like olive plants around your table.
Occasion: Wedding
Lord, two families become one today.
Two names on one line.
Two chairs pulled up to one table.
Bless what is beginning here ---
not only the vows,
but the years after them:
the ordinary Tuesdays,
the shared bills,
the small kindnesses that carry more weight than the big promises.
Keep them quick to forgive,
slow to keep score.
Teach them to argue like two people who are staying,
not two people looking for the door.
Let their table hold whatever the years bring ---
quiet suppers or crowded ones,
the same two chairs or many more,
every one of them a gift.
You have brought them to this day, Lord.
Bring them the rest of the way,
one ordinary day at a time.
Amen.

View File

@ -0,0 +1,41 @@
## 68:6
%% 4
> God sets the lonely in families
>> God sets the lonely in families. He brings out the prisoners with singing.
Occasion: Moving into a new home
Lord, the boxes are stacked in the garage,
the windows are bare,
the key is still fresh in my hand,
my bed not yet assembled.
I am grateful to be here,
but there are many hours of work before I can rest.
There is excitement in these empty rooms,
and also the weariness of opening yet another box.
Come into this place as I arrange it.
Make this more than a shelter with my things in it.
Let me belong here without expecting these walls
to give me what only You can give.
I can carry old noise through a new door.
I can fill these rooms with things and still not rest.
My address can change
while my fears remain where they were.
Don't let me build a life that shuts You out.
Let goodness cross this threshold.
Let kindness dwell in these rooms.
Make this house a place of peace,
of simple meals,
of restful sleep,
of welcome.
And on the days when peace feels far away,
teach me to receive the grace of this place
one ordinary moment at a time.
Be the first guest in this house,
the one who never leaves,
the one who makes it a home.

View File

@ -0,0 +1,45 @@
## 41:9
%% 4
> My Own Familiar Friend
>> Yes, my own familiar friend, in whom I trusted, who ate bread with me, has lifted up his heel against me.
Occasion: After being let down
Lord, I waited for help,
and it never came.
The place where someone should have stood with me
stayed empty.
The promise went cold.
I keep returning to what was promised
and to what didn't happen.
Part of me is still waiting,
still wondering whether I asked too much,
or trusted too easily.
I feel the pull to make a refuge of this hurt ---
to hold it close,
to let it become who I am now.
``Easier that way,'' I tell myself.
Show me how to come to You instead,
without pretending this did not wound me.
I can't call it nothing.
It wasn't nothing.
I know the other pull too:
to trust no one,
to need little,
to live shut away.
That way feels safer,
and lonelier.
Be more gracious than the promise that failed.
Meet me in the empty place.
Teach me, slowly, to take refuge in You
without asking me to deny what happened.
The place beside me stayed empty.
But no place will ever be empty of You.
Amen.

View File

@ -0,0 +1,46 @@
## 51:17
%% 4
> A Broken And Contrite Heart
>> The sacrifices of God are a broken spirit. O God, you will not despise a broken and contrite heart.
Occasion: After hurting someone deeply
Lord, their face stays with me.
The look after my words landed.
The long pause.
The way the air changed.
I cannot unsay it.
Even now, I can feel myself reaching
for an explanation,
some reason my words were excusable,
some way to make the harm seem smaller.
But it was not small to them.
You know what it cost them to hear it.
Hold me still before that wound.
Don't let me hurry past it
because looking is hard.
Part of me wants quick repair.
Part of me wants them to ease my guilt.
Part of me wants to be comforted first.
And part of me is afraid
that my apology will not be enough,
that forgiveness may not come quickly,
that what I broke may take long to mend.
Break my selfishness down.
Give me courage to speak plainly,
without defending myself
or asking them to carry my shame.
Make room in me for patience,
for listening,
for the slow work of making right what I can.
Their face stays with me.
Let it keep me honest before You,
and tender toward the hurt
I cannot undo.
Amen.

View File

@ -0,0 +1,48 @@
## 62:8
%% 4
> Pour Out Your Heart
>> Trust in him at all times, you people. Pour out your heart before him. God is a refuge for us. Selah.
Occasion: When you have no one to talk to
Lord, there is no one I can reach tonight.
The evening is still.
I have gone through the names I know
and come up empty.
Some people would not understand.
They have burdens enough of their own.
And some things feel too tender,
too complicated,
or too hard to explain.
So I am speaking to You.
Take what I would say
if someone were here beside me.
Take the long part,
the tangled part,
the part I cannot say well.
I do not even know what I need ---
an answer, comfort,
or simply a voice that does not turn away.
I only know that carrying this alone
has made it heavier.
If I keep it shut in,
it will grow strange inside me.
It will start to sound like truth
just because it is loud.
Be company in this silence.
Give me Your listening ear.
Let me say everything without hurrying
toward a better ending.
And in time,
give me one safe person
from whom I do not have to hide.
This place may feel empty, Lord.
But You are always present anyway.
Amen.

View File

@ -0,0 +1,40 @@
## 78:4
%% 4
> Telling the Generation to Come
>> We will not hide them from their children, telling to the generation to come the praises of the LORD, and his strength, and his wondrous works that he has done.
Occasion: Teaching a child about God
Lord, here is a small hand in mine,
and a sky above us both.
Help me speak simply and true.
Keep me from using big words that hide You.
The questions may be larger than my answers,
and I do not want my uncertainty
to make me hurry past the wonder.
Show me how to point,
and pause,
and let the child see for themselves.
Teach me to listen, too ---
to notice what catches their attention,
and to see once again what I have stopped seeing.
I can only stand here,
look up,
and tell the truth about whose world this is.
Give me the right small words.
The moon.
The clouds.
The stars.
Flowers.
Snails.
And Your loving hand behind them.
Keep me gentle.
Keep me honest.
Keep us both looking up.
Amen.

View File

@ -0,0 +1,36 @@
## 91:5
%% 4
> You shall not be afraid of the terror by night
>> You shall not be afraid of the terror by night, nor of the arrow that flies by day.
Occasion: Children afraid of the dark
Lord, hear the small voice from this child's bed ---
the call after the light is out,
the blanket pulled up to the chin,
the eyes fixed on the closet door.
Be gentle with this fear.
It may seem small in daylight,
but right now it feels large and close.
Make Your safety plain in ways this child can hear.
Do not let this little one feel foolish for being afraid.
The dark can fill with stories.
A coat can look like a stranger,
and every shadow can seem to threaten.
Stand near this bed.
Be present when no one can be seen.
Let the breathing slow.
Let tense hands loosen their hold.
Let sleep come without fear.
Let the child wake and remember that the night held,
and that fear did not have the final word.
You are Lord of the closet.
You are Lord of the dark.
You are Lord by the bed.
Keep watch until morning.
Amen.

View File

@ -0,0 +1,42 @@
## 103:10
%% 4
> Not According to our Sins
>> He has not dealt with us according to our sins, nor repaid us according to our iniquities
Occasion: When I need to forgive
Lord, I know I need to forgive.
I also know I cannot make the hurt disappear
by deciding that I should.
What happened still matters.
What was said was still said.
What was broken does not become unbroken
because I forgive.
So teach me what forgiveness actually asks of me.
Keep me from feeding this wound
just to keep the anger alive.
Keep me from returning to the old scene
to prosecute the case one more time.
I do not want what was done to me
to become something I carry everywhere.
You have shown me mercy
without calling wrong right.
Teach me that kind of mercy.
I may need to forgive again tomorrow,
and again after that.
For today,
help me loosen my grip.
The hurt can remain part of my story
without it becoming part of who I am.
Amen.

View File

@ -0,0 +1,43 @@
## 127:1
%% 4
> Unless the Lord Builds the House
>> Unless the LORD builds the house, they who build it labour in vain. Unless the LORD watches over the city, the watchman guards it in vain.
Occasion: Building a marriage
Lord, we are laying days brick by brick ---
moment by moment,
memory by memory,
building our life together.
Some days love comes easily.
Other days we are tired,
guarded,
more ready to defend ourselves than to understand.
A careless word can harden fast,
like mortar set before a brick was laid true.
Show us when we are building with pride
instead of truth.
Teach us when to speak plainly,
and when to be still and listen.
Give us courage to say what is honest
without using honesty as a club.
Keep us from making a house
with a cold heart inside it.
Keep us from keeping score
until love feels like a ledger.
When tenderness feels costly,
help us not to withhold it.
Make us into two people
who are quick to mend,
quick to forgive,
quick to come back together.
We cannot build this house by effort alone.
We are laying days brick by brick.
Lord, lay them on Your firm foundation.
Amen.

View File

@ -0,0 +1,44 @@
## 141:3
%% 4
> Keep the Door of My Lips
>> Set a watch, LORD, before my mouth. Keep the door of my lips.
Occasion: When I need courage for an ordinary conversation
Lord, I need to say something.
It is not a speech.
No crowd is waiting.
The world will go on afterward.
But this conversation matters to me,
and I am afraid of getting it wrong.
I have practiced sentences in my head.
Some sound too sharp.
Others hide what I really mean.
Give me words that are true
without using truth as a weapon.
Help me listen after I speak.
Keep me from trying to control
how the other person receives what I say.
That part is not mine.
What is mine
is to speak with courage and honesty,
to listen with humility and patience,
and to leave room for an answer
I may not expect.
Or like.
Let the words of my mouth
and what lies beneath them
be acceptable to You.
Help me open my mouth
and begin.
Amen.

View File

@ -0,0 +1,43 @@
## 37:7
% 3
> Rest In the LORD
>> Rest in the LORD, and wait patiently for him. Don’t fret because of him who prospers in his way, because of the man who makes wicked plots happen.
Occasion: Envy over someone else's success
That name comes up again, Lord.
More praise.
More doors opening.
More signs that life is moving for them
when it isn't for me.
I do not like what arises in me.
Their success begins to feel like evidence
that I have been overlooked.
I compare what can be seen of their life
with all the waiting and uncertainty in mine,
and I come away smaller, jealous, ashamed.
Cut envy off before it settles in the chest.
Teach me how to bless what is good,
whoever is being blessed,
without shrinking into myself.
And when I cannot yet bless gladly,
help me at least to be honest with You
and quiet enough not to turn envy into contempt.
If I keep staring at their harvest,
I will despise my own field.
I will miss the work You have set in front of me.
Turn my face back to the ground under my feet.
Give me gladness for today's bread,
for today’s task,
for one honest step.
Teach me to wait without treating waiting
as proof that You have forgotten me.
Their field is theirs.
Keep me faithful to mine.
Amen.

View File

@ -0,0 +1,43 @@
## 40:2
%% 4
> Out of the Miry Clay
>> He brought me up also out of a horrible pit, out of the miry clay. He set my feet on a rock, and gave me a firm place to stand.
Occasion: After a failure
This is the morning after, Lord.
The mistake is still here.
Its weight sits in my chest.
I can hardly look at what I broke.
Part of me still cannot believe I did it.
Part of me knows exactly how I did.
I keep wishing I could return to the moment before,
but what's done is done.
Help me face the damage without hiding.
Give me the courage to name it plainly,
without excuses
and without making myself beyond mercy.
I want to sink into shame,
to keep replaying the moment,
to let one fall become my whole name.
Shame feels easier than repair sometimes.
It asks nothing of me
except that I stay down.
Raise me toward the next honest thing ---
an apology spoken truly,
a mess cleaned up,
a small duty done well.
I do not know how much can be mended.
I do not know how long it will take.
Give me grace for what can be done today,
and humility for what must be carried.
I have been staring at the place where I fell.
Now set my feet on a place to stand.
Amen.

View File

@ -0,0 +1,40 @@
## 46:10
%% 3
> Be still, and know that I am God
>> Be still, and know that I am God.
Occasion: Letting go of control
My hands are tight again, Lord ---
on the calendar,
on the budget,
on how I expect everything to go.
I keep rehearsing what might happen
and arranging answers for questions
no one has asked yet.
I am afraid that if I loosen my hold,
something important will slip through my fingers.
Open my grip
before I mistake my grip for safety.
Control promises rest,
but it's a false promise that keeps me awake.
It turns every delay into a threat
and every person into someone to manage.
Even when nothing is happening,
I am bracing for what might.
Teach me the freedom of open hands.
Teach me the work that is mine,
and the resting which is also mine.
Give me enough trust for this day,
even if I cannot quite surrender tomorrow.
My hands are tight again, Lord.
Make them open in You.
Amen.

View File

@ -0,0 +1,45 @@
## 51:10
%% 4
> Create in Me a Clean Heart
>> Create in me a clean heart, O God. Renew a right spirit within me
Occasion: Asking forgiveness for hurtful words
Lord, I need to go back.
My words hit hard,
and now they sit between us
like broken glass on the floor.
I can see the pieces.
I know I broke them.
If only I could take the words back.
But they were heard.
They did what hurtful words do,
and it's not for me to decide
how long the pain should last
or how quickly I should be forgiven.
Give me the grace to ask forgiveness plainly.
No excuses.
No shifting the blame.
No softening what I said.
Keep me from using an apology
to defend myself all over again.
Pride wants to step around the hurt
and keep walking.
It would rather protect my image
than bend down and clean up.
And part of me is afraid to face
what my words have damaged.
Let my sorrow be more than a feeling.
Let it become a lesson learned the hard way,
and speech that is wiser for it.
Teach my mouth to pause
and my heart to become gentler.
I said the hurtful words, Lord.
Stay with me while I mend as best I can.
Amen.

View File

@ -0,0 +1,47 @@
## 55:22
%% 5
> Cast Your Burden On The LORD
>> Cast your burden on the LORD, and he will sustain you. He will never allow the righteous to be moved.
Occasion: When I can't let something go
Lord, here it is again.
The memory.
The conversation.
The mistake.
The thing I wish had happened differently.
I have carried it through breakfast,
through work,
through quiet hours.
I put it aside,
then discover it in my hands again.
Part of me seems to believe
that if I think about it long enough
I can change what has already happened.
I cannot.
Show me whether there is something here
I still need to do.
If I need to apologize,
give me courage.
If I need to make something right,
show me how.
If I need to learn something,
keep me teachable.
But if there is nothing left to do,
teach me to stop rehearsing it in my head.
Here is the burden, Lord.
I am putting it down again.
And if I pick it up tomorrow,
I will bring it back again.
Amen.

View File

@ -0,0 +1,48 @@
## 86:5
%% 5
> Ready To Forgive
>> For you, Lord, are good, and ready to forgive, abundant in lovingkindness to all those who call on you.
Occasion: When shame keeps me away
My hand is on the knob, Lord,
and I do not go in.
I think of what I have done,
and the old heat rises in my face.
I know You already see it all,
yet I am still ashamed to be seen.
Part of me believes I should wait
until I feel less dismayed,
until I can come to You
with something better than this.
But I have nothing better.
I only have the truth.
Come close to me at this door.
Teach me the difference between shame and repentance.
One keeps me self-absorbed.
One brings me to You.
I know the pull of staying hidden.
Without prayer.
Without light.
Just the same thoughts going round and round.
And the longer I stay here,
the harder it is to believe I may enter.
I begin to mistake hiding for humility
and silence for sorrow.
But You are there before I speak.
Open what I have shut.
Give me courage to admit plainly what I have done
and to trust Your lovingkindness more than my shame.
Bring me inside,
not as a stranger,
but as one who called and was heard.
Not sneaking in the back, Lord.
Bring me boldly through Your front door.
Amen.

View File

@ -0,0 +1,45 @@
## 90:17
%% 5
> Establish The Work Of Our Hands
>> Let the favour of the Lord our God be on us. Establish the work of our hands for us. Yes, establish the work of our hands.
Occasion: When I don't want to do what needs doing
Lord, I know what needs doing.
I simply don't want to do it.
I'd rather postpone it,
find something easier,
something pleasant,
something that gives me the satisfaction
of having done something
without doing what really needed to be done.
But this task is mine.
So meet me here,
not in some sudden burst of enthusiasm,
but in my reluctance.
Establish the work of my hands.
Help me begin before I feel ready.
Keep me at it when my resolve wanders.
Give me patience with work
that is ordinary,
unnoticed,
and necessary.
Not everything worth doing
comes with inspiration.
Sometimes faithfulness is simply
putting my hands to the task before me.
These are my hands, Lord.
This is today's work.
Establish it.
Amen.

View File

@ -0,0 +1,48 @@
## 103:1
%% 5
> All That Is Within Me
>> Praise the LORD, my soul! All that is within me, praise his holy name!
Occasion: Wanting wholehearted worship
Lord, I do not want to bring You just part of myself.
Only the safe part.
Only the public part.
Only the part that knows easy words.
I want my whole house opened.
Yet even as I say this,
I feel myself holding back,
singing while staying guarded,
speaking praise without surrendering
the things I most want to keep for myself.
Show me the rooms I still keep shut ---
the old hurt,
the private pride,
the fear of losing control.
Show me where I have grown used to locked doors.
Give me courage to open them,
even when I do not know what wholeheartedness will ask of me.
Half-offered worship leaves the door locked.
It sounds full,
but something remains empty.
Let's not pretend that divided praise is enough.
Take all that is within me
and turn it toward You.
Mind.
Heart.
Soul.
Will.
Gather even the reluctant parts,
the weary parts,
the parts that have forgotten how to praise.
Teach my whole being to answer You.
Not part of myself, Lord.
But my whole house opened.
Amen.

View File

@ -0,0 +1,44 @@
## 103:12
> As Far as East From West
>> As far as the east is from the west, so far has he removed our transgressions from us.
Occasion: Confessing hidden wrongdoing
Lord, the door is shut,
the screen is dark,
no one in this room knows what I did.
But I know.
And so do You.
I have tried not to name it.
I have offered myself excuses
and called my silence caution.
Still, the truth remains,
and I am tired of carrying it alone.
Bring the hard words to my tongue.
Make me transparent.
I am afraid of what honesty may cost,
of the hurt in another’s face,
of what cannot be taken back.
I want mercy without risk,
forgiveness without confession,
a clean heart without the difficult telling.
Secrecy is asking me to keep building walls around one act,
then another around the lie that guards it,
until I cannot tell which room I live in.
Lead me to the honest step ---
the truth spoken,
the thing returned,
the message sent,
the door knocked on.
Give me courage for that step,
and humility for whatever follows.
I have kept it hidden from others.
I cannot hide it from You.
Amen.

View File

@ -0,0 +1,45 @@
## 103:14
%% 4
> He Remembers That We Are Dust
>> For he knows how we are made. He remembers that we are dust.
Occasion: When I'm disappointed in myself
Lord, I expected better of myself.
I thought I would handle this differently.
I thought I had grown past this.
I thought by now I would be wiser,
steadier,
stronger.
Apparently not.
It is difficult to see myself clearly
without becoming either my defender
or my accuser.
You know what I am made of.
You know where I failed.
And You know the distance I have traveled,
the battles nobody else sees,
the places where I am still at work.
Keep me from making excuses.
But keep me also from turning disappointment
into contempt for myself.
I am dust,
and You have always known that ---
even if I had forgotten.
Show me what needs changing.
Help me make right what I can.
Then let me rise from this place
without pretending I never fell.
You have not mistaken me
for someone already finished.
Let's begin again.
Amen

View File

@ -0,0 +1,40 @@
## 119:131
%% 4
> Establish my Footsteps
>> Establish my footsteps in your word. Let no iniquity have dominion over me.
Occasion: Wanting to break old habits
Lord, I've done it again.
The thing I told myself I was done with.
One drink turns into the bottle half gone.
One scroll turns into an hour lost.
One chip turns into the whole bag.
I don't even remember choosing.
I just look up and I'm already in the chair,
already reaching,
already ashamed.
Show me the moment before the moment ---
the first small turn where I could have chosen differently.
I'm tired of promises I don't keep.
Tired of hiding what I did.
Tired of hating myself in the morning
for what felt so easy last night.
Give me a plain next step instead of a perfect plan ---
water instead of a drink,
the phone face-down instead of face-up,
carrot sticks instead of junk food.
Or help me find the courage and honesty to seek help
for what is beyond me.
I've worn this seat down to my shape, Lord.
Get me up out of it.
Walk with me toward a different one.
A better one.
Amen.

View File

@ -0,0 +1,47 @@
## 139:23
%% 5
> Search Me and Know My Heart
>> Search me, God, and know my heart. Try me, and know my thoughts. See if there is any wicked way in me, and lead me in the everlasting way.
Occasion: When my motives are mixed
Lord, here is the knot again ---
a good deed with my name attached,
a true word I want noticed,
a gift I want to give
and be thanked for.
I do not always know where generosity ends
and my hunger for admiration begins.
Search me.
Show me what in me is clean
and what is reaching sideways for applause.
Help me look honestly,
without excusing myself
and without turning this confession
into one more way to appear humble.
I can dress a selfish wish in flowery language
until even I believe it.
Make me plain before You.
Let me choose the hidden good ---
the task no one knows,
the gift no one traces,
the prayer said with the door shut.
And when my motives are still mixed,
keep me honest and teachable.
I may not be able to untangle
every reason I want what I want.
But You can see the whole knot.
Untie what I have pulled tight.
Make me plain, Lord.
Not split.
But whole.
Amen.

View File

@ -0,0 +1,44 @@
## 8:4
%% 5
> That You Think of Humanity
>> What is man, that you think of him? What is the son of man, that you care for him?
Occasion: Feeling small in a big world
The night feels too wide, Lord.
The sky looms over my head.
The road before me stretches to the horizon.
Even on the map on my phone I'm just a tiny blue dot.
Sometimes the size of everything unsettles me.
So many people, so many places,
Almost everything happening is beyond what I can see or grasp.
I wonder how one life can be noticed,
how my ordinary joys and fears
could matter at all.
Show me that small is not lost.
Show me that being one life in a multitude
does not put me outside Your care.
I can start to think I am a speck
and then act like what I do does not matter.
I become careless with this day,
or afraid that nothing I offer will be enough.
Set me back inside Your sight.
Not above anyone else,
not larger or more important,
but known.
And held.
Let me live this one small day on purpose,
with my feet on this ground,
and my breath received from You.
Help me give my attention to what is mine to do,
and trust You with all that is beyond me.
The night is wide, Lord.
Your care is wider.
Amen.

Some files were not shown because too many files have changed in this diff Show More