project screenshot 1
project screenshot 2
project screenshot 3
project screenshot 4

Memora

Memora transforms personal memories into permanent, immersive Memory NFTs

Memora

Created At

ETHGlobal Prague

Winner of

Blockscout

Blockscout - Big Blockscout Explorer Pool Prize

Prize Pool

Project Description

Memories fade and lose their emotional impact over time Digital content disappears from platforms and cloud services Traditional photos/videos lack the immersive depth of real experience No way to preserve the complete context of a moment

What if you could step back into your memories with full context and experience them in 3D?

How it's Made

šŸ—ļø How It's Built

šŸ–„ļø Frontend Architecture (Next.js 14)

app/
ā”œā”€ā”€ layout.tsx                 # Root layout with providers
ā”œā”€ā”€ page.tsx                   # Landing page
ā”œā”€ā”€ upload/                    # Memory upload interface
ā”œā”€ā”€ gallery/                   # NFT collection browser
└── memory/[id]/              # Individual memory viewer

components/
ā”œā”€ā”€ WalletConnect.tsx          # MetaMask integration
ā”œā”€ā”€ UploadMemory.tsx           # Video upload + metadata form
ā”œā”€ā”€ MemoryGallery.tsx          # Collection display
ā”œā”€ā”€ Scene3DViewer.tsx          # 3D scene renderer
ā”œā”€ā”€ LumaSplatsViewer.tsx       # Gaussian splat viewer
└── VoiceAI.tsx               # Voice conversation interface

šŸŽØ 3D Rendering System

LumaSplats Integration:

// components/LumaSplatsViewer.tsx
import { LumaSplatsThree } from '@lumaai/luma-web'

const splat = new LumaSplatsThree({
  source: scene.url,           // IPFS URL to .splat file
  enableControls: isOwner,     // Ownership-based controls
  particleRevealEnabled: true  // Enhanced visual effects
})

Ownership-Based Access:

  • NFT Owners: Full HD quality, enhanced controls, downloadable content
  • Non-owners: Preview mode with limited quality and upgrade prompts

šŸ”— Web3 Integration (MetaMask + ethers.js)

// lib/wallet.ts
import { ethers } from 'ethers'

const connectWallet = async () => {
  const provider = new ethers.BrowserProvider(window.ethereum)
  const signer = await provider.getSigner()
  const address = await signer.getAddress()
  // NFT ownership verification
  const balance = await nftContract.balanceOf(address)
}

Features:

  • MetaMask wallet connection
  • Multi-network support (Ethereum, Sepolia, Polygon)
  • Real-time balance and NFT collection display
  • Ownership verification for 3D scene access

šŸŽ¤ Voice AI System (Azure OpenAI)

// components/VoiceAI.tsx
const startRecording = async () => {
  const stream = await navigator.mediaDevices.getUserMedia({ audio: true })
  const mediaRecorder = new MediaRecorder(stream)
  // Record audio, convert to WAV, send to Azure OpenAI
}

const sendToAI = async (audioBlob: Blob) => {
  const response = await fetch(azureEndpoint, {
    method: 'POST',
    headers: { 'api-key': apiKey },
    body: createFormData(audioBlob, conversationHistory)
  })
  // Returns audio response for natural conversations
}

Capabilities:

  • Audio-to-Audio conversations using gpt-4o-mini-audio-preview
  • Memory Context understanding with ETH Global Prague specifics
  • Conversation History management for coherent dialogues
  • WebM to WAV conversion for API compatibility

šŸ“” Oracle Data Integration (Flare Network)

// scripts/flare-data-fetch.js
class FlareDataFetcher {
  async fetchAllData(location) {
    const [crypto, weather, market, time] = await Promise.all([
      this.fetchCryptoPrices(['ETH/USD', 'BTC/USD', 'FLR/USD']),
      this.fetchWeatherData(location),
      this.fetchMarketData(),
      this.fetchTimeData()
    ])
    return { crypto, weather, market, time }
  }
}

Data Sources:

  • Crypto Prices: ETH, BTC, FLR via FTSOv2 with confidence scores
  • Weather Data: Temperature, humidity, pressure, wind conditions
  • Market Metrics: Market cap, dominance, fear & greed index
  • Time Context: Unix timestamps, timezones, blockchain state

šŸ—„ļø Storage Architecture

Memory Storage Pipeline:
Video Upload → Metadata Collection → Oracle Data Fetch → IPFS Upload → NFT Minting

IPFS Structure:
└── memory-{id}/
    ā”œā”€ā”€ scene.splat          # 3D Gaussian splat file
    ā”œā”€ā”€ metadata.json        # Enhanced with oracle data
    ā”œā”€ā”€ thumbnail.jpg        # Preview image
    └── original.mp4         # Source video

Storage Providers:

  • IPFS: Immediate content addressing
  • Lighthouse: Decentralized storage with SDKs
  • Akave: Hot storage layer for Filecoin
  • Filecoin: Long-term cold storage with on-chain deals

šŸ” NFT Verification (Blockscout APIs)

// scripts/blockscout-nft-test.js
class BlockscoutNFTTester {
  async fetchNFTs(account) {
    const url = `${apiBase}/v2/addresses/${account}/nft`
    const response = await fetch(url)
    return this.formatNFTData(await response.json())
  }
}

Multi-Network Support:

  • Ethereum, Sepolia, Polygon, Base, Arbitrum
  • Real-time NFT collection queries
  • Ownership verification for access controls
  • Rich metadata extraction and display
background image mobile

Join the mailing list

Get the latest news and updates