├── .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 |
12 |
13 |
14 |
15 |
16 |
20 |
21 |
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 |
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 | }
--------------------------------------------------------------------------------