Skip to main content

Overview

Community Voices is a storytelling platform that amplifies the lived experiences, hopes, challenges, and triumphs of individuals in Dzaleka Refugee Camp. Through personal narratives, the platform humanizes refugee experiences, challenges stereotypes, and creates a digital archive of community history.
Community Voices focuses on first-person narratives that give agency to refugees to tell their own stories in their own words, countering mainstream media portrayals.

Purpose & Impact

Why Community Voices Matters

Dignity & Agency

Refugees control their own narratives instead of being subjects of others’ stories

Historical Archive

Preserves community memories and experiences for future generations

Advocacy Tool

Personal stories influence policy, challenge misconceptions, drive social change

Community Connection

Shared experiences build solidarity and mutual understanding within the camp

Story Categories

  • Journey - Migration stories, fleeing conflict, arriving in Malawi
  • Daily Life - Experiences of camp life, challenges, routines
  • Education - Pursuing learning despite obstacles
  • Entrepreneurship - Starting businesses, economic resilience
  • Art & Culture - Preserving heritage, creative expression
  • Advocacy - Speaking out for refugee rights and dignity
  • Hope & Dreams - Aspirations, future goals, resilience
  • Stories - General personal narratives

User Experience

Reading Stories

1

Discover Stories

Browse featured stories on homepage or navigate to dedicated section (if implemented)
2

Immersive Reading

Full-screen article layout with hero image, title, and author introduction
3

Explore Related Stories

View 3 related stories from the same category at the bottom of each article
4

Share & Engage

Social sharing buttons (if implemented) to amplify voices beyond the platform

Story Page Elements

Each story (/community-voices/[slug]) features:
  • Hero section: Large featured image with gradient overlay
  • Title & excerpt: Compelling headline and summary
  • Author byline: Name and date published
  • Category badge: Story classification
  • Full narrative: Long-form content with rich formatting
  • Tags: Keywords for discovery (#journey, #hope, #resilience)
  • Related stories: 3 similar narratives from same category
Ethical Storytelling: All stories require explicit consent from subjects. Authors have final approval over edits. Sensitive content is handled with care to protect dignity and safety.

Content Schema

Stories stored in src/content/community-voices/ as Markdown:
title: "Story Headline"                       # Required - compelling, descriptive
author: "Author Name"                         # Required - first-person narrator
date: "2021-12-06"                            # Required - publication date (YYYY-MM-DD)
category: "Stories"                           # Required - see categories above
excerpt: "Brief compelling summary..."        # Required - 1-2 sentences
image: "https://image-url.com/photo.jpg"     # Required - high-quality hero image
featured: true                                # Boolean - homepage highlight
tags: ["journey", "hope", "resilience"]       # Array - keywords for search

Real Example from Source

From divineirakoze.md:
title: "Divine Irakoze on life inside Malawi's Dzaleka refugee camp and the issues facing youth in her community"
author: "Divine Irakoze"
date: "2021-12-06"
category: "Stories"
excerpt: "I normally tell people that being a refugee is not easy. You are fighting for space in a country that is not your own."
image: "https://blogger.googleusercontent.com/img/a/AVvXsEi4x1I7Om_G3Ee4q5-XHUs47kOECiIs9vsGss4L..."
featured: true
tags: ["journey", "hope", "resilience"]
With powerful markdown content:
### Divine is a refugee from Burundi living in Malawi.

I normally tell people that being a refugee is not easy. You are fighting for 
space in a country that is not your own. I mean no one wishes to be a refugee, 
it is very unfortunate and sad that many people end up being victims for freeing 
their country to look for refuge...

In Malawi, refugees are not allowed to work. This has left so many youths in 
the camp became unemployed. They are wasted away into drug abuse and other 
unhealthy habits...

My voice, your voice, his voice, her voice, their voice and everyone's voice 
matters the most...

I hope that one day I will be a strong advocate for refugees. My dream is to 
advocate for and empower refugees with skills for self-reliance...
Divine’s story (24 lines total) discusses:
  • Challenges of refugee life in Dzaleka
  • Restrictions on work and movement
  • Impact on youth unemployment and mental health
  • Food insecurity and basic needs
  • Her advocacy dreams and hope for the future
See full text in src/content/community-voices/divineirakoze.md

How to Submit a Story

1

Story Development

  • Identify willing storyteller (must give informed consent)
  • Conduct interview or have person write their own story
  • Ensure storyteller understands how story will be used
  • Get explicit permission for any photos
2

Writing the Story

First-person narrative is most powerful:
❌ "She arrived in Dzaleka in 2018..."
✅ "I arrived in Dzaleka in 2018..."
Show, don’t just tell:
❌ "Life was hard."
✅ "I waited in line for three hours under the hot sun for a bag of 
    maize that would barely feed my family for a week."
3

Create Story File

touch src/content/community-voices/firstname-lastname.md
Use author’s name as filename (lowercase, hyphens, no spaces).
4

Add Metadata & Content

---
title: "Finding Hope Through Music: Bakari's Journey"
author: "Bakari Hassan"
date: "2025-03-09"
category: "Art & Culture"
excerpt: "When I lost everything fleeing my homeland, I still had my voice and my music."
image: "/images/stories/bakari-performing.jpg"
featured: false
tags: ["music", "resilience", "culture", "art"]
---

### Bakari is a musician from Somalia living in Dzaleka since 2019.

When I lost everything fleeing my homeland, I still had my voice and my music...

[Continue story...]
5

Review with Storyteller

CRITICAL: Show the final story to the author BEFORE publishing.
  • Read it aloud together
  • Verify accuracy of facts and quotes
  • Check that tone and message match their intent
  • Get written/recorded approval to publish
6

Publish

npm run dev  # Preview locally
# Visit: http://localhost:4321/community-voices/firstname-lastname

git add .
git commit -m "Add Bakari's story"
git push

Technical Implementation

Story Detail Page

Dynamic routing with static generation:
src/pages/community-voices/[slug].astro
export async function getStaticPaths() {
  const voices = await getCollection('community-voices');
  return voices.map(voice => ({
    params: { slug: voice.id },
    props: { voice },
  }));
}

const { voice } = Astro.props;
const { Content } = await render(voice);
Shows 3 stories from same category:
Related Stories Algorithm
const allVoices = await getCollection('community-voices');
const relatedStories = allVoices
  .filter(v => v.data.category === voice.data.category && v.id !== voice.id)
  .slice(0, 3);

Hero Section with Image

Conditional rendering based on image availability:
Hero Layout
{voice.data.image ? (
  <div class="relative h-[70vh] max-h-[800px]">
    <img 
      src={voice.data.image} 
      alt={voice.data.title}
      class="w-full h-full object-cover animate-fade-in"
    />
    <div class="absolute inset-0 bg-black/40">
      <div class="absolute inset-0 bg-gradient-to-t from-black/80 via-black/40 to-transparent">
        <div class="absolute bottom-0 left-0 right-0 p-8 md:p-12">
          <h1 class="text-4xl md:text-5xl lg:text-6xl font-bold text-white mb-6">
            {voice.data.title}
          </h1>
          <p class="text-xl md:text-2xl text-white/90">
            {voice.data.excerpt}
          </p>
          <div class="text-lg text-white/80">
            By {voice.data.author}
          </div>
        </div>
      </div>
    </div>
  </div>
) : (
  <!-- Fallback gradient background if no image -->
)}

SEO & Social Sharing

Comprehensive metadata for social platforms:
OpenGraph & Twitter Metadata
const seo = {
  title: `${voice.data.title} - Community Voice | Dzaleka Online Services`,
  description: voice.data.excerpt,
  type: "article",
  openGraph: {
    title: voice.data.title,
    description: voice.data.excerpt,
    type: "article",
    image: {
      url: voice.data.image || "https://services.dzaleka.com/images/placeholder-voice.jpg",
      width: 1200,
      height: 630,
      alt: voice.data.title
    },
    article: {
      publishedTime: new Date(voice.data.date).toISOString(),
      author: voice.data.author,
      tags: voice.data.tags || [],
      section: voice.data.category
    }
  },
  twitter: {
    card: "summary_large_image",
    title: voice.data.title,
    description: voice.data.excerpt,
    image: voice.data.image
  }
};

Schema.org Article Markup

Structured Data
{
  "@context": "https://schema.org",
  "@type": "Article",
  "headline": "Divine Irakoze on life inside Malawi's Dzaleka refugee camp...",
  "description": "I normally tell people that being a refugee is not easy...",
  "image": {
    "@type": "ImageObject",
    "url": "https://blogger.googleusercontent.com/...",
    "width": 1200,
    "height": 630,
    "creditText": "Photo by Divine Irakoze"
  },
  "datePublished": "2021-12-06T00:00:00.000Z",
  "author": {
    "@type": "Person",
    "name": "Divine Irakoze"
  },
  "publisher": {
    "@type": "Organization",
    "name": "Dzaleka Online Services",
    "logo": {
      "@type": "ImageObject",
      "url": "https://services.dzaleka.com/images/dzaleka-digital-heritage.png"
    }
  },
  "keywords": "journey, hope, resilience",
  "articleSection": "Stories"
}

Storytelling Best Practices

Center the Narrator

Use first-person voice. Let the person tell THEIR story, not your interpretation.

Respect & Dignity

Never sensationalize suffering. Focus on resilience, agency, and humanity.

Informed Consent

Explain how the story will be used. Get written permission. Allow opt-out anytime.

Safety First

Don’t publish details that could endanger the storyteller or their family.

Ethical Guidelines

Before publishing, ask:
  • Could this story put the narrator or others at risk?
  • Does it reveal sensitive personal information?
  • Could it be used against them by authorities or others?
  • Does it perpetuate stereotypes or pity narratives?
When in doubt, don’t publish. Safety > story.
Stories are not commodities. Don’t:
  • Pay people for “sad stories”
  • Pressure vulnerable people to share trauma
  • Edit stories to make them more “dramatic”
  • Use stories without compensating the storyteller (if applicable)
Fair practices:
  • Offer honorarium if budget allows
  • Give storyteller co-author credit
  • Share any revenue from story republishing
Ensure diversity in voices:
  • Different countries of origin
  • Various age groups (youth, elders)
  • Gender balance
  • Range of experiences (not just trauma)
  • Success stories alongside challenges

Image Guidelines

Photo Requirements

  • Size: Minimum 1200x630px (recommended 1920x1080px)
  • Format: JPG or PNG
  • Quality: High resolution, not blurry or pixelated
  • Composition: Subject clearly visible, good lighting
  • Consent: Explicit permission from everyone in photo

Where to Get Images

  1. Personal photos from storyteller (with permission)
  2. Community photographers (credit them!)
  3. Free stock photos (Unsplash, Pexels) as fallback
  4. Commissioned photography (hire local photographers)

Placeholder Images

If no image available, system uses:
  • /images/placeholder-voice.jpg (default)
  • Category-specific placeholders (if configured)

Content Quality Checklist

Before publishing, verify:
  • Story is in first-person voice
  • Title is compelling and descriptive (not clickbait)
  • Excerpt captures the essence in 1-2 sentences
  • Category accurately reflects content
  • Tags are relevant and searchable
  • Image is high-quality with proper consent
  • Markdown formatting is clean (headings, paragraphs)
  • No spelling or grammar errors
  • Facts are accurate and verified
  • Storyteller has approved final version
  • No sensitive information that could cause harm

Troubleshooting

Check:
  1. File is in src/content/community-voices/ directory
  2. Filename uses lowercase and hyphens (no spaces)
  3. YAML frontmatter is valid (proper indentation, quotes)
  4. Required fields are filled: title, author, date, category, excerpt
  5. Dev server restarted: npm run dev
Images can be:
  • Local: /images/stories/photo.jpg (in public/images/stories/)
  • External: Full HTTPS URL
Verify:
  • URL is correct and accessible
  • Image file exists at specified path
  • Image is not too large (< 5MB recommended)

Future Enhancements

Planned features:
  • Audio stories: Voice recordings for those who prefer oral storytelling
  • Video testimonials: Short documentary-style clips
  • Translation: Stories in multiple languages (French, Swahili, Kirundi)
  • Comments: Allow community dialogue (moderated)
  • Search: Full-text search across all stories
  • Collections: Curated story series on themes
  • Author pages: Profile pages for prolific storytellers

Remember: Every story is a person’s lived experience. Handle with care, respect, and dignity. These are not just content - they are human beings trusting us with their truth.