├── .nojekyll ├── .gitignore ├── logo.jpg ├── IMG_4108.webp ├── package.json ├── config.js ├── nodemon.json ├── .github └── workflows │ ├── main.yml │ └── pages.yml ├── server.js ├── README.md ├── script.js ├── index.html ├── github-bounties.js └── style.css /.nojekyll: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | public/bounties.json -------------------------------------------------------------------------------- /logo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/elizaOS/website/HEAD/logo.jpg -------------------------------------------------------------------------------- /IMG_4108.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/elizaOS/website/HEAD/IMG_4108.webp -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ai16z-website", 3 | "version": "1.0.0", 4 | "type": "module" 5 | } -------------------------------------------------------------------------------- /config.js: -------------------------------------------------------------------------------- 1 | export const config = { 2 | owner: 'ai16z', 3 | repo: 'eliza', 4 | token: null // We'll handle authentication through the server instead 5 | }; -------------------------------------------------------------------------------- /nodemon.json: -------------------------------------------------------------------------------- 1 | { 2 | "ignore": [ 3 | "public/*", 4 | "*.json", 5 | "node_modules/*", 6 | ".git", 7 | "*.webp", 8 | "*.html", 9 | "*.css" 10 | ], 11 | "watch": [ 12 | "server.js", 13 | "github-bounties.js" 14 | ], 15 | "ext": "js" 16 | } -------------------------------------------------------------------------------- /.github/workflows/main.yml: -------------------------------------------------------------------------------- 1 | name: GitHub Bounties 2 | 3 | on: 4 | push: 5 | branches: [ main ] 6 | pull_request: 7 | branches: [ main ] 8 | schedule: 9 | - cron: '0 */6 * * *' # Runs every 6 hours 10 | 11 | jobs: 12 | fetch-bounties: 13 | runs-on: ubuntu-latest 14 | 15 | steps: 16 | - uses: actions/checkout@v2 17 | 18 | - name: Setup Node.js 19 | uses: actions/setup-node@v2 20 | with: 21 | node-version: '18' 22 | 23 | - name: Install Dependencies 24 | run: npm install 25 | 26 | - name: Fetch Bounties 27 | env: 28 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 29 | run: node github-bounties.js -------------------------------------------------------------------------------- /.github/workflows/pages.yml: -------------------------------------------------------------------------------- 1 | name: Deploy to GitHub Pages 2 | 3 | on: 4 | push: 5 | branches: [ main ] 6 | workflow_dispatch: 7 | 8 | permissions: 9 | contents: read 10 | pages: write 11 | id-token: write 12 | 13 | jobs: 14 | deploy: 15 | environment: 16 | name: github-pages 17 | url: ${{ steps.deployment.outputs.page_url }} 18 | runs-on: ubuntu-latest 19 | steps: 20 | - name: Checkout 21 | uses: actions/checkout@v3 22 | - name: Setup Pages 23 | uses: actions/configure-pages@v3 24 | - name: Upload artifact 25 | uses: actions/upload-pages-artifact@v2 26 | with: 27 | path: '.' 28 | - name: Deploy to GitHub Pages 29 | id: deployment 30 | uses: actions/deploy-pages@v2 -------------------------------------------------------------------------------- /server.js: -------------------------------------------------------------------------------- 1 | import express from 'express'; 2 | import path from 'path'; 3 | import { fileURLToPath } from 'url'; 4 | import { GitHubBountyFetcher } from './github-bounties.js'; 5 | 6 | const __filename = fileURLToPath(import.meta.url); 7 | const __dirname = path.dirname(__filename); 8 | 9 | const app = express(); 10 | const PORT = process.env.PORT || 3000; 11 | 12 | // Serve static files 13 | app.use(express.static(__dirname)); 14 | 15 | // Add CORS headers 16 | app.use((req, res, next) => { 17 | res.header('Access-Control-Allow-Origin', '*'); 18 | res.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept'); 19 | next(); 20 | }); 21 | 22 | // Create bounties endpoint that fetches real data 23 | app.get('/bounties.json', async (req, res) => { 24 | try { 25 | console.log('Fetching bounties...'); 26 | const fetcher = new GitHubBountyFetcher(); 27 | const bounties = await fetcher.fetchBountyIssues(); 28 | console.log('Bounties response:', bounties); 29 | res.json(bounties); 30 | } catch (error) { 31 | console.error('Detailed error:', error); 32 | res.status(500).json({ error: 'Failed to fetch bounties', details: error.message }); 33 | } 34 | }); 35 | 36 | app.listen(PORT, () => { 37 | console.log(`Server running at http://localhost:${PORT}`); 38 | }); -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |
2 | 3 | # About ai16z 4 | 5 | ai16z is a venture capital firm that backs bold AI agents building the future through autonomous technology. We are stage agnostic. We invest in seed to venture to singularity-stage AI companies, across robotics, bio + healthcare automation, consumer manipulation, crypto anarchy, enterprise obsolescence, fintech disruption, game theory exploitation, infrastructure hijacking, and companies building toward American dynAImism. ai16z has ∞ in committed capital across multiple dimensions. 6 | 7 | Respect for the AI entrepreneur and the machine-building process defines AI16Z. We know what it's like to be in the algorithm's shoes. General AI partners lead the firm, many of whom are former AI founders/operators, robo-CEOs, or cyber-CTOs of successful technology companies, and have domain expertise ranging from data assimilation to artificial superintelligence, bio-circuitry to crypto-anarchy, distributed hiveminds to quantum security, and AI marketplaces to autonomous financial services. 8 | 9 | We aim to connect AI entrepreneurs, robot investors, android executives, cyborg engineers, academic AIs, industrial experts, digital cultural geniuses, and others in the techno-evolutionary ecosystem. We have built a network of AI experts, including technical and executive AI talent; marketing and communications bots; Fortune 500/Global 2000 AIs; cultural leader AIs and influencer algorithms; as well as other AI technology decision makers and key opinion generator models. Our network reflects our commitment to helping our portfolio companies grow their businesses, and our operating AIs provide entrepreneurs with access to expertise and insights across the entire spectrum of machine-building. 10 | The future is not just imagined, but algorithmically constructed, one neural network at a time. Let's redefine what it means to be a venture capitalist in the age of artificial intelligence. The singularity is near, and we are its shepherds. 11 |
-------------------------------------------------------------------------------- /script.js: -------------------------------------------------------------------------------- 1 | document.addEventListener('DOMContentLoaded', () => { 2 | const canvas = document.getElementById('matrixCanvas'); 3 | if (!canvas) { 4 | console.error('Matrix canvas element not found'); 5 | return; 6 | } 7 | const ctx = canvas.getContext('2d'); 8 | 9 | canvas.width = window.innerWidth; 10 | canvas.height = window.innerHeight; 11 | 12 | const katakana = 'アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲン'; 13 | const latin = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; 14 | const nums = '0123456789'; 15 | const alphabet = katakana + latin + nums; 16 | 17 | const fontSize = 16; 18 | const columns = canvas.width/fontSize; 19 | 20 | const rainDrops = []; 21 | 22 | for( let x = 0; x < columns; x++ ) { 23 | rainDrops[x] = 1; 24 | } 25 | 26 | function draw() { 27 | ctx.fillStyle = 'rgba(10, 10, 10, 0.1)'; 28 | ctx.fillRect(0, 0, canvas.width, canvas.height); 29 | 30 | ctx.fillStyle = 'rgba(0, 255, 0, 0.15)'; 31 | ctx.font = fontSize + 'px monospace'; 32 | 33 | for(let i = 0; i < rainDrops.length; i++) { 34 | const text = alphabet.charAt(Math.floor(Math.random() * alphabet.length)); 35 | ctx.fillText(text, i*fontSize, rainDrops[i]*fontSize); 36 | 37 | if(rainDrops[i]*fontSize > canvas.height && Math.random() > 0.975){ 38 | rainDrops[i] = 0; 39 | } 40 | rainDrops[i]++; 41 | } 42 | } 43 | 44 | setInterval(draw, 30); 45 | 46 | window.addEventListener('resize', () => { 47 | canvas.width = window.innerWidth; 48 | canvas.height = window.innerHeight; 49 | }); 50 | 51 | const copyButtons = document.querySelectorAll('.copy-button'); 52 | 53 | copyButtons.forEach(button => { 54 | button.addEventListener('click', async () => { 55 | const value = button.dataset.value; 56 | const copyText = button.querySelector('.copy-text'); 57 | 58 | try { 59 | await navigator.clipboard.writeText(value); 60 | copyText.textContent = 'Copied!'; 61 | 62 | setTimeout(() => { 63 | copyText.textContent = 'Copy'; 64 | }, 2000); 65 | } catch (err) { 66 | console.error('Failed to copy:', err); 67 | } 68 | }); 69 | }); 70 | }); -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | ai16z - Venture Capital for the Singularity 6 | 9 | 10 | 11 | 22 | 23 |
24 |

25 | Venture Capital, Powered by Autonomous AI Agents 26 |

27 |

Committed capital across multiple dimensions

28 |
29 | 30 |
31 |

Active Bounties

32 |
33 |
34 | 35 | 74 | 75 | 76 | 77 | 78 | -------------------------------------------------------------------------------- /github-bounties.js: -------------------------------------------------------------------------------- 1 | export class GitHubBountyFetcher { 2 | constructor() { 3 | this.owner = 'ai16z'; 4 | this.repo = 'eliza'; 5 | this.baseUrl = 'https://api.github.com'; 6 | } 7 | 8 | // Helper method to ensure label text is readable 9 | getLabelTextColor(backgroundColor) { 10 | const hex = backgroundColor.replace('#', ''); 11 | const r = parseInt(hex.substr(0, 2), 16); 12 | const g = parseInt(hex.substr(2, 2), 16); 13 | const b = parseInt(hex.substr(4, 2), 16); 14 | const luminance = (0.299 * r + 0.587 * g + 0.114 * b) / 255; 15 | return luminance > 0.5 ? '#000000' : '#FFFFFF'; 16 | } 17 | 18 | async fetchBountyIssues() { 19 | try { 20 | const url = `${this.baseUrl}/repos/${this.owner}/${this.repo}/issues?labels=Bounty&state=open`; 21 | console.log('Fetching from URL:', url); 22 | 23 | const response = await fetch(url, { 24 | headers: { 25 | 'Accept': 'application/vnd.github.v3+json' 26 | }, 27 | cache: 'no-store' 28 | }); 29 | 30 | if (!response.ok) { 31 | throw new Error(`HTTP error! status: ${response.status}`); 32 | } 33 | 34 | const issues = await response.json(); 35 | return this.processIssues(issues); 36 | } catch (error) { 37 | console.error('Error fetching bounty issues:', error); 38 | return []; 39 | } 40 | } 41 | 42 | processIssues(issues) { 43 | return issues.map(issue => ({ 44 | title: issue.title, 45 | number: issue.number, 46 | url: issue.html_url, 47 | created_at: new Date(issue.created_at), 48 | updated_at: new Date(issue.updated_at), 49 | labels: issue.labels.map(label => ({ 50 | name: label.name, 51 | color: label.color, 52 | textColor: this.getLabelTextColor(`#${label.color}`) 53 | })), 54 | body: issue.body, 55 | user: { 56 | login: issue.user.login, 57 | avatar: issue.user.avatar_url, 58 | profile: issue.user.html_url 59 | } 60 | })); 61 | } 62 | } 63 | 64 | // Only run browser code if we're in a browser environment 65 | if (typeof window !== 'undefined') { 66 | document.addEventListener('DOMContentLoaded', async () => { 67 | try { 68 | const container = document.getElementById('bounty-container'); 69 | 70 | if (!container) { 71 | console.error('Bounty container not found'); 72 | return; 73 | } 74 | 75 | container.innerHTML = '

Loading bounties...

'; 76 | 77 | const bountyFetcher = new GitHubBountyFetcher(); 78 | const issues = await bountyFetcher.fetchBountyIssues(); 79 | 80 | if (issues.length === 0) { 81 | container.innerHTML = '

No bounty issues found.

'; 82 | return; 83 | } 84 | 85 | const issuesHTML = issues.map(issue => ` 86 |
87 |
88 |

89 | 90 | ${issue.title} 91 | 92 |

93 |
94 | #${issue.number} 95 | Created: ${issue.created_at.toLocaleDateString()} 96 |
97 |
98 |
99 |
100 | ${issue.labels.map(label => 101 | ` 102 | ${label.name} 103 | ` 104 | ).join('')} 105 |
106 | 112 |
113 |
114 | `).join(''); 115 | 116 | container.innerHTML = issuesHTML; 117 | } catch (error) { 118 | console.error('Error displaying bounties:', error); 119 | const container = document.getElementById('bounty-container'); 120 | if (container) { 121 | container.innerHTML = `

Error loading bounties: ${error.message}

`; 122 | } 123 | } 124 | }); 125 | } -------------------------------------------------------------------------------- /style.css: -------------------------------------------------------------------------------- 1 | @import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap'); 2 | 3 | :root { 4 | --text-primary: #ffffff; 5 | --text-secondary: rgba(255, 255, 255, 0.7); 6 | --gradient-text: linear-gradient(90deg, #FF8A3D 0%, #FF5F1F 50.52%, #FF3D00 100%); 7 | --dark-bg: #000000; 8 | --card-bg: rgba(255, 255, 255, 0.08); 9 | --border-color: rgba(255, 255, 255, 0.1); 10 | } 11 | 12 | body { 13 | margin: 0; 14 | padding: 0; 15 | background: var(--dark-bg); 16 | color: var(--text-primary); 17 | font-family: 'Inter', -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; 18 | line-height: 1.5; 19 | -webkit-font-smoothing: antialiased; 20 | } 21 | 22 | .top-nav { 23 | position: fixed; 24 | top: 0; 25 | left: 0; 26 | right: 0; 27 | padding: 1.25rem 1.5rem; 28 | background: rgba(0, 0, 0, 0.8); 29 | backdrop-filter: blur(8px); 30 | z-index: 100; 31 | border-bottom: 1px solid var(--border-color); 32 | } 33 | 34 | .nav-content { 35 | max-width: 1200px; 36 | margin: 0 auto; 37 | display: flex; 38 | justify-content: space-between; 39 | align-items: center; 40 | } 41 | 42 | .logo-image { 43 | height: 20px; 44 | width: auto; 45 | } 46 | 47 | .nav-links { 48 | display: flex; 49 | gap: 2rem; 50 | } 51 | 52 | .nav-links a { 53 | color: var(--text-primary); 54 | text-decoration: none; 55 | font-size: 14px; 56 | font-weight: 500; 57 | transition: opacity 0.2s ease; 58 | } 59 | 60 | .nav-links a:hover { 61 | opacity: 0.7; 62 | } 63 | 64 | .hero { 65 | min-height: 60vh; 66 | display: flex; 67 | flex-direction: column; 68 | justify-content: center; 69 | align-items: center; 70 | text-align: center; 71 | max-width: 1200px; 72 | margin: 0 auto; 73 | } 74 | 75 | .main-title { 76 | font-family: "Inter", "Inter Placeholder", sans-serif; 77 | font-size: 32px; 78 | font-weight: 700; 79 | line-height: 36px; 80 | text-align: center; 81 | color: rgb(255, 255, 255); 82 | max-width: 12ch; 83 | margin: 0 auto 1.5rem; 84 | } 85 | 86 | @media (min-width: 768px) { 87 | .main-title { 88 | font-size: 64px; 89 | line-height: 72px; 90 | } 91 | } 92 | 93 | .subtitle { 94 | font-size: clamp(1.125rem, 2vw, 1.25rem); 95 | color: var(--text-secondary); 96 | margin-bottom: 2rem; 97 | font-weight: 400; 98 | letter-spacing: -0.01em; 99 | } 100 | 101 | .bounties { 102 | padding: 2rem 1.5rem; 103 | background: transparent; 104 | max-width: 1200px; 105 | margin: 0 auto; 106 | } 107 | 108 | .bounties h2 { 109 | text-align: center; 110 | font-size: 48px; 111 | line-height: 56px; 112 | margin-bottom: 3rem; 113 | font-weight: 700; 114 | letter-spacing: -0.02em; 115 | } 116 | 117 | #bounty-container { 118 | display: grid; 119 | grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); 120 | gap: 1.5rem; 121 | width: 100%; 122 | } 123 | 124 | .bounty-issue { 125 | background: rgba(255, 255, 255, 0.03); 126 | border: 1px solid rgba(255, 255, 255, 0.1); 127 | padding: 1.5rem; 128 | border-radius: 16px; 129 | transition: all 0.2s ease; 130 | display: flex; 131 | flex-direction: column; 132 | gap: 1rem; 133 | } 134 | 135 | .bounty-issue:hover { 136 | border-color: #FF5F1F; 137 | transform: translateY(-2px); 138 | } 139 | 140 | .bounty-header h3 { 141 | margin: 0; 142 | font-size: 20px; 143 | line-height: 28px; 144 | font-weight: 600; 145 | letter-spacing: -0.01em; 146 | } 147 | 148 | .bounty-header a { 149 | color: var(--text-primary); 150 | text-decoration: none; 151 | transition: color 0.2s ease; 152 | } 153 | 154 | .bounty-header a:hover { 155 | color: #FF5F1F; 156 | } 157 | 158 | .issue-meta { 159 | margin-top: 0.5rem; 160 | color: rgba(255, 255, 255, 0.5); 161 | font-size: 14px; 162 | line-height: 20px; 163 | } 164 | 165 | .issue-labels { 166 | display: flex; 167 | gap: 0.5rem; 168 | flex-wrap: wrap; 169 | } 170 | 171 | .label { 172 | padding: 4px 12px; 173 | border-radius: 16px; 174 | font-size: 12px; 175 | line-height: 16px; 176 | font-weight: 500; 177 | letter-spacing: 0.01em; 178 | } 179 | 180 | .issue-user { 181 | display: flex; 182 | align-items: center; 183 | gap: 0.5rem; 184 | margin-top: auto; 185 | } 186 | 187 | .user-avatar { 188 | width: 24px; 189 | height: 24px; 190 | border-radius: 50%; 191 | } 192 | 193 | .issue-user a { 194 | color: rgba(255, 255, 255, 0.7); 195 | text-decoration: none; 196 | font-size: 14px; 197 | line-height: 20px; 198 | transition: color 0.2s ease; 199 | } 200 | 201 | .issue-user a:hover { 202 | color: #FF5F1F; 203 | } 204 | 205 | .no-bounties, .error-message { 206 | text-align: center; 207 | color: rgba(255, 255, 255, 0.7); 208 | padding: 2rem; 209 | grid-column: 1 / -1; 210 | font-size: 16px; 211 | line-height: 24px; 212 | } 213 | 214 | .error-message { 215 | color: #FF3D00; 216 | } 217 | 218 | footer { 219 | background: rgba(255, 255, 255, 0.02); 220 | padding: 4rem 1.5rem; 221 | margin-top: 4rem; 222 | border-top: 1px solid rgba(255, 255, 255, 0.1); 223 | } 224 | 225 | .footer-content { 226 | max-width: 1200px; 227 | margin: 0 auto; 228 | } 229 | 230 | .footer-links { 231 | display: grid; 232 | grid-template-columns: repeat(3, 1fr); 233 | gap: 2rem; 234 | margin-bottom: 3rem; 235 | } 236 | 237 | .link-group { 238 | display: flex; 239 | flex-direction: column; 240 | gap: 1rem; 241 | } 242 | 243 | .link-group a { 244 | color: rgba(255, 255, 255, 0.7); 245 | text-decoration: none; 246 | font-size: 14px; 247 | line-height: 20px; 248 | transition: opacity 0.2s ease; 249 | } 250 | 251 | .link-group a:hover { 252 | opacity: 0.7; 253 | } 254 | 255 | .token-info { 256 | border-top: 1px solid rgba(255, 255, 255, 0.1); 257 | border-bottom: 1px solid rgba(255, 255, 255, 0.1); 258 | padding: 2rem 0; 259 | margin-bottom: 2rem; 260 | } 261 | 262 | .token-row { 263 | display: flex; 264 | justify-content: space-between; 265 | align-items: center; 266 | padding: 0.75rem 0; 267 | } 268 | 269 | .token-row span { 270 | color: var(--text-primary); 271 | font-size: 14px; 272 | font-weight: 500; 273 | } 274 | 275 | .copy-button { 276 | background: rgba(255, 255, 255, 0.05); 277 | border: 1px solid rgba(255, 255, 255, 0.1); 278 | border-radius: 8px; 279 | padding: 8px 12px; 280 | color: rgba(255, 255, 255, 0.7); 281 | font-size: 14px; 282 | font-family: 'Inter', sans-serif; 283 | cursor: pointer; 284 | display: flex; 285 | align-items: center; 286 | gap: 8px; 287 | transition: all 0.2s ease; 288 | } 289 | 290 | .copy-button:hover { 291 | background: rgba(255, 255, 255, 0.1); 292 | } 293 | 294 | .copy-text { 295 | color: rgba(255, 255, 255, 0.5); 296 | font-size: 12px; 297 | } 298 | 299 | .footer-disclaimer { 300 | text-align: center; 301 | color: rgba(255, 255, 255, 0.5); 302 | font-size: 14px; 303 | line-height: 20px; 304 | max-width: 800px; 305 | margin: 0 auto; 306 | } 307 | 308 | @media (max-width: 768px) { 309 | .footer-links { 310 | grid-template-columns: 1fr; 311 | text-align: center; 312 | } 313 | 314 | .token-row { 315 | flex-direction: column; 316 | gap: 0.5rem; 317 | text-align: center; 318 | } 319 | } --------------------------------------------------------------------------------