A decentralized, open-source platform for social media, news publication, private messaging, and email. Built on Peergos and IPFS, Exopost empowers users to create and share locally-produced, AI-assisted multimedia content with complete ownership and control over their data.
- Self-Sovereign Identity: Your identity is controlled by your cryptographic keypair
- Decentralized Storage: All content stored on IPFS through Peergos
- Account Management: Local account persistence with secure switching
- User Profiles: Customizable profiles with avatars and display names
- Social Graph: Follow/unfollow system with privacy controls
- AI-Assisted Content Creation: Integrate AI agents for research and content generation
- Content Aggregation: Curate and synthesize information from diverse sources
- Multilingual Support: Automatic content translation and localization
- Advanced Analytics: Insights into content performance and audience engagement
- Frontend: Nuxt 3 with TypeScript
- Styling: CSS Grid-first approach with custom design system
- Backend: Peergos (Java 24) for decentralized storage and identity
- Network: IPFS for distributed content delivery
- Package Manager: npm (official)
- Node.js 18+
- npm
- Git
-
Clone the repository
git clone https://github.com/thalperi/exopost.git cd exopost -
Install dependencies
npm install
-
Set up environment variables
cp .env.example .env # Edit .env with your configuration -
Start development server
npm run dev
-
Open your browser Navigate to
http://localhost:3000
Exopost supports mobile deployment through Capacitor for native Android and iOS apps.
- Android Studio (for Android development)
- Xcode (for iOS development, macOS only)
-
Generate static files
npm run generate
-
Sync with mobile platforms
npx cap sync
-
Run on mobile device/emulator
# Android npm run android:dev # iOS npm run ios:dev
# Build Android APK
npm run android:build
# Build iOS app
npm run ios:build# Generate static files
npm run generate
# Build for server deployment
npm run build
# Preview production build
npm run previewexopost/
├── assets/css/ # Global styles and CSS variables
├── components/ # Vue components
│ ├── AppLogo.vue
│ ├── AppNavigation.vue
│ ├── AppUserMenu.vue
│ ├── AppSidebar.vue
│ ├── AppFooter.vue
│ ├── UserAvatar.vue
│ └── Icon.vue
├── composables/ # Reusable logic
│ ├── useAuth.ts # Authentication management
│ └── usePeergos.ts # Peergos API client
├── layouts/ # Page layouts
├── middleware/ # Route middleware
├── pages/ # File-based routing
│ └── index.vue # Home page
├── plugins/ # Nuxt plugins
├── public/ # Static assets
├── server/ # Server-side code
├── stores/ # State management
├── types/ # TypeScript definitions
│ └── peergos.ts # Peergos type definitions
├── utils/ # Utility functions
├── app.vue # Root component
├── nuxt.config.ts # Nuxt configuration
└── package.json # Dependencies and scripts
Following the project's development principles, layouts prioritize CSS Grid over Flexbox:
/* Primary layout approach */
.layout {
display: grid;
grid-template-areas: "header" "main" "footer";
grid-template-rows: auto 1fr auto;
}
/* Flexbox only when grid is not suitable */
.flex-when-needed {
display: flex;
align-items: center;
}- Primary:
#2563eb(Blue) - Secondary:
#7c3aed(Purple) - Accent:
#f59e0b(Amber) - Success:
#10b981(Green) - Error:
#ef4444(Red)
- Base Font: System font stack for optimal performance
- Headings: Semibold to bold weights
- Body: Regular weight with 1.6 line height
Exopost implements self-sovereign identity through Peergos:
- Keypair-based Authentication: No passwords, only cryptographic keys
- Local Account Persistence: Accounts saved securely on device
- Account Switching: One-click switching between multiple accounts
- White-labeled Experience: Peergos functionality under Exopost branding
const { signIn, signUp, signOut, currentUser } = useAuth()
// Sign in with username and password (generates keypair)
await signIn({ username: 'alice', password: 'secure-password' })
// Access current user
console.log(currentUser.value?.username)
// Sign out
await signOut()Monitor connection and peer information:
const { networkStatus, isConnected, storageQuota } = usePeergos()
// Check connection status
console.log(isConnected.value) // true/false
console.log(networkStatus.value.peers) // number of connected peersconst { uploadFile, downloadFile, listFiles } = usePeergos()
// Upload a file
await uploadFile(file, '/documents/my-file.pdf')
// List directory contents
const files = await listFiles('/documents')- Strict mode enabled in
tsconfig.json - No implicit
anytypes allowed - Comprehensive type definitions for all APIs
- CSS Grid prioritized over Flexbox
- No
!importantunless explicitly approved - Custom properties for consistent theming
- Mobile-first responsive design
- ESLint configuration for consistency
- Prettier for code formatting
- Type checking in CI/CD pipeline
npm run generateGenerates a static site that can be deployed to any web server or CDN.
npm run build
npm run previewBuilds for server deployment with SSR capabilities.
Exopost uses Capacitor for native mobile app deployment with full Peergos compatibility.
- Hybrid App: Web app wrapped in native container
- Single Codebase: Same code runs on web, Android, and iOS
- Peergos Integration: HTTP-based API works perfectly in mobile WebView
- Native Features: Access device capabilities through Capacitor plugins
# Complete mobile build
npm run mobile:build
# Open in native IDEs
npx cap open android # Android Studio
npx cap open ios # Xcode- Android: Build APK/AAB through Android Studio
- iOS: Build IPA through Xcode
- Web: Deploy static files to any hosting
Set these environment variables for production:
PEERGOS_API_URL=https://your-peergos-instance.com
NUXT_PUBLIC_APP_VERSION=1.0.0- Peergos Documentation - Decentralized storage platform
- Nuxt 3 Docs - Vue.js framework
- TypeScript Handbook - Type system reference
Exopost is open source and welcomes contributions!
- Fork the repository
- Create a feature branch:
git checkout -b feature/amazing-feature - Make your changes following the development principles
- Add tests for new functionality
- Submit a pull request
- Follow TypeScript strict mode
- Prioritize CSS Grid in layouts
- Write comprehensive tests
- Update documentation for new features
- Ensure mobile responsiveness
- Use Prettier for formatting
- Follow ESLint configuration
- Write descriptive commit messages
- Add JSDoc comments for public APIs
This project is released under the Unlicense license, dedicating it to the public domain. You are free to use, modify, and distribute this software for any purpose without restriction.
- Peergos - For the decentralized storage foundation
- IPFS - For distributed file system technology
- Nuxt.js - For the excellent Vue.js framework
- Vue.js - For the reactive UI framework
- Documentation: /docs
- Issues: GitHub Issues
- Discussions: GitHub Discussions
Built with ❤️ for a decentralized future.