Memora transforms personal memories into permanent, immersive Memory NFTs
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?
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
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:
// 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:
// 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:
// 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:
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:
// 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: