['child','childhood','young','kid','school','primary','junior'], '1940s' => ['1940','forties','40s'], '1950s' => ['1950','fifties','50s'], '1960s' => ['1960','sixties','60s'], '1970s' => ['1970','seventies','70s'], '1980s' => ['1980','eighties','80s'], '1990s' => ['1990','nineties','90s'], '2000s' => ['2000','two thousand'], 'family' => ['family','husband','wife','son','daughter','children','wedding','marriage'], ]; // ─── SCAN STORIES ───────────────────────────────────────────────────────────── function get_stories(string $dir, array $era_keywords): array { if (!is_dir($dir)) return []; $files = glob($dir . '/*.docx'); if (!$files) return []; $stories = []; foreach ($files as $path) { $filename = pathinfo($path, PATHINFO_FILENAME); $sidecar = $dir . '/' . $filename . '.json'; // Load optional sidecar metadata $meta = file_exists($sidecar) ? json_decode(file_get_contents($sidecar), true) : []; $title = $meta['title'] ?? pretty_title($filename); $desc = $meta['desc'] ?? ''; $era = $meta['era'] ?? guess_era($filename . ' ' . $desc, $era_keywords); $date = $meta['date'] ?? filemtime($path); $read = $meta['read'] ?? estimate_read_time($path); $stories[] = [ 'file' => basename($path), 'title' => $title, 'desc' => $desc, 'era' => $era, 'date' => $date, 'read' => $read, ]; } // Sort by date descending (newest first) usort($stories, fn($a,$b) => $b['date'] <=> $a['date']); return $stories; } function pretty_title(string $filename): string { // Convert snake_case / hyphens / PascalCase to readable title $name = preg_replace('/[-_]+/', ' ', $filename); $name = preg_replace('/([a-z])([A-Z])/', '$1 $2', $name); return ucwords(strtolower(trim($name))); } function guess_era(string $text, array $era_keywords): string { $lower = strtolower($text); foreach ($era_keywords as $era => $keywords) { foreach ($keywords as $kw) { if (str_contains($lower, $kw)) return $era; } } return ''; } function estimate_read_time(string $path): int { // Rough estimate: unzip and count chars in document.xml try { $zip = new ZipArchive(); if ($zip->open($path) === true) { $xml = $zip->getFromName('word/document.xml'); $zip->close(); $text = strip_tags($xml ?? ''); $words = str_word_count($text); return max(1, (int)round($words / 200)); } } catch (Exception $e) {} return 5; } $stories = get_stories(STORIES_DIR, $ERA_KEYWORDS); // Collect all unique eras for the filter bar $all_eras = array_values(array_unique(array_filter(array_column($stories, 'era')))); sort($all_eras); ?> The Wannabe Author — Linda Mosely
📷
Place a photo named linda.jpg in this folder to show it here

Linda Mosely

A life well lived,
now well told.

Linda Mosely has spent a lifetime collecting moments — the kind that lodge themselves in memory like pressed flowers between the pages of an old book. From childhood adventures to raising a family, from small everyday joys to the turns no one sees coming, her stories capture the texture of a life fully lived.

She calls herself a wannabe author, but make no mistake: these pages are the real thing. Written with warmth, honesty, and a storyteller's eye for the detail that makes everything come alive. Pull up a chair. These stories were written for you.

Memories & Memoirs

No stories found yet.

Add .docx files to the stories/ folder to get started.

Browse by era:

No stories match your search.

"There is no greater agony than bearing an untold story inside you."

— Maya Angelou