• I added an agora current events board to contain discussions of political and current events to that category. This was due to a increase support for a separate board for political talk.

Lets Build: Agroa Roads! A Thread about what we can do togther!

You down?

  • You son of a btich, I'm in.

    Votes: 11 68.8%
  • NO

    Votes: 5 31.3%

  • Total voters
    16

wavve-creator

Ontologist lost in America; dreaming.
Joined
Aug 12, 2024
Messages
713
Reaction score
2,271
Awards
204
I wanted to open this thread as I see a lot of people here with similar intrests and skills. CS majors, scummy engineers, and artists. A lot of us also love to complain about the state of the world!

What if we did something about that!

I want to open a discussion on the possibility of users coming together to build thinks that could make us money and help our careers as artists + whatever.
 
Virtual Cafe Awards

eris

Posting Inquisitor
Joined
May 28, 2022
Messages
1,187
Reaction score
3,962
Awards
253
come together to do something!

do what? beats me
 
Virtual Cafe Awards

wavve-creator

Ontologist lost in America; dreaming.
Joined
Aug 12, 2024
Messages
713
Reaction score
2,271
Awards
204
Okay first lets see if anyone has any skills! I have wrote this single HTML file for a POG generation machine, very basic!

Inspired by this post! https://agoraroad.com/forum/index.p...gs-theyre-back-on-the-agora-forum.7897/page-5

Screenshot 2025-05-09 at 6.56.44 PM.png



Screenshot 2025-05-09 at 6.56.57 PM.png


It is a spinning coin!
Yes is is a bit vibe coded but idc because I actually understand whats going on. Using AI is fine as long as you know wha is happening!

What can Argoanites do!

Some ideas that I would like to add to the script!

1. Filters over images for roughness, holographic or other cool textures! All of which can be modified by sliders (or whatever you want!)

2. Editable images!

3. I tired to build a GIF exporter in here but failed on my attempts! If anyone can figure out how to do that I'll be impressed!

code below
HTML:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>POG Generator</title>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r128/three.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/three@0.128.0/examples/js/controls/OrbitControls.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/canvas-to-blob/1.0.0/canvas-to-blob.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jszip/3.10.1/jszip.min.js"></script>
    <style>
        body {
            margin: 0;
            overflow: hidden;
            background: #1a1a1a;
            display: flex;
            justify-content: flex-start;
            align-items: center;
            height: 100vh;
            font-family: Arial, sans-serif;
        }
        #canvas {
            position: fixed;
            top: 0;
            left: 0;
            width: calc(100% - 300px);
            height: 100%;
        }
        .controls {
            position: fixed;
            right: 0;
            top: 0;
            width: 300px;
            height: 100vh;
            background: rgba(255, 255, 255, 0.1);
            padding: 20px;
            box-sizing: border-box;
            backdrop-filter: blur(10px);
            color: white;
            overflow-y: auto;
        }
        input[type="file"] {
            width: 100%;
            margin: 10px 0;
            background: rgba(255, 255, 255, 0.1);
            padding: 8px;
            border-radius: 5px;
            color: white;
        }
        input[type="range"] {
            width: 100%;
            margin: 10px 0;
        }
        .speed-control {
            margin: 15px 0;
            padding: 10px;
            background: rgba(255, 255, 255, 0.05);
            border-radius: 5px;
        }
        .speed-value {
            color: #4CAF50;
            font-weight: bold;
        }
        h3 {
            margin-top: 0;
            padding-bottom: 10px;
            border-bottom: 1px solid rgba(255, 255, 255, 0.1);
        }
        button {
            background: #4CAF50;
            border: none;
            padding: 10px 20px;
            color: white;
            border-radius: 5px;
            cursor: pointer;
            margin: 5px;
            transition: all 0.3s ease;
        }
        button:hover {
            background: #45a049;
        }
        button.active {
            background: #f44336;
        }
        button.active:hover {
            background: #d32f2f;
        }
        .export-button {
            background: #2196F3;
            margin-top: 20px;
        }
        .export-button:hover {
            background: #1976D2;
        }
        .export-button:disabled {
            background: #ccc;
            cursor: not-allowed;
        }
    </style>
</head>
<body>
    <div id="canvas"></div>
    <div class="controls">
        <h3>POG Generator</h3>
        <div>
            <label>Front Face:</label>
            <input type="file" id="frontImage" accept="image/*">
        </div>
        <div>
            <label>Back Face:</label>
            <input type="file" id="backImage" accept="image/*">
        </div>
        <div class="speed-control">
            <label>Spin Speed: <span class="speed-value">0.01</span></label>
            <input type="range" id="speedSlider" min="0.01" max="0.2" step="0.01" value="0.01">
        </div>
        <button id="spinButton">Spin Coin</button>
        <button id="exportButton" class="export-button">Export Frames</button>
    </div>

    <script>
        const scene = new THREE.Scene();
        const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
        const renderer = new THREE.WebGLRenderer({ antialias: true });
        renderer.setSize(window.innerWidth, window.innerHeight);
        document.getElementById('canvas').appendChild(renderer.domElement);

        const controls = new THREE.OrbitControls(camera, renderer.domElement);
        controls.enableDamping = true;
        controls.dampingFactor = 0.05;

        // Lighting
        const ambientLight = new THREE.AmbientLight(0xffffff, 0.7);
        scene.add(ambientLight);
       
        const pointLight1 = new THREE.PointLight(0xffffff, 1);
        pointLight1.position.set(3, 2, 0);
        scene.add(pointLight1);

        const pointLight2 = new THREE.PointLight(0xffffff, 0.8);
        pointLight2.position.set(-5, 2, 0);
        scene.add(pointLight2);

        const pointLight3 = new THREE.PointLight(0xffffff, 0.5);
        pointLight3.position.set(0, 5, 0);
        scene.add(pointLight3);

        const geometry = new THREE.CylinderGeometry(2, 2, 0.1, 32);
        const material = new THREE.MeshStandardMaterial({
            metalness: 0.3,
            roughness: 0.2,
            color: 0xffffff
        });
        const coin = new THREE.Mesh(geometry, material);
        coin.rotation.x = Math.PI / 2;
        scene.add(coin);

        // Position camera
        camera.position.z = 5;
        camera.position.y = 2;
        camera.lookAt(0, 0, 0);

        let isSpinning = true;
        let spinSpeed = 0.01;

        const speedSlider = document.getElementById('speedSlider');
        const speedValue = document.querySelector('.speed-value');
       
        speedSlider.addEventListener('input', (e) => {
            spinSpeed = parseFloat(e.target.value);
            speedValue.textContent = spinSpeed.toFixed(2);
        });

        window.addEventListener('resize', () => {
            camera.aspect = window.innerWidth / window.innerHeight;
            camera.updateProjectionMatrix();
            renderer.setSize(window.innerWidth, window.innerHeight);
        });

        const spinButton = document.getElementById('spinButton');
        spinButton.addEventListener('click', () => {
            isSpinning = !isSpinning;
            spinButton.textContent = isSpinning ? 'Stop Coin' : 'Spin Coin';
            spinButton.classList.toggle('active');
        });

        function loadTexture(file, side) {
            const reader = new FileReader();
            reader.onload = function(e) {
                const texture = new THREE.TextureLoader().load(e.target.result);
                texture.needsUpdate = true;
                texture.rotation = Math.PI / 2;
                texture.center.set(0.5, 0.5);
               
                const sideMaterial = new THREE.MeshStandardMaterial({
                    map: texture,
                    metalness: 0.3,
                    roughness: 0.2,
                    color: 0xffffff
                });

                let materials;
                if (Array.isArray(coin.material)) {
                    materials = [...coin.material];
                } else {
                    materials = [
                        new THREE.MeshStandardMaterial({ color: 0x888888 }), // side
                        new THREE.MeshStandardMaterial({ color: 0xffffff }), // top
                        new THREE.MeshStandardMaterial({ color: 0xffffff })  // bottom
                    ];
                }
                if (side === 'front') {
                    materials[1] = sideMaterial; // top
                } else if (side === 'back') {
                    materials[2] = sideMaterial; // bottom
                }

                coin.material = materials;
            };
            reader.readAsDataURL(file);
        }

        document.getElementById('frontImage').addEventListener('change', (e) => {
            if (e.target.files[0]) {
                loadTexture(e.target.files[0], 'front');
            }
        });

        document.getElementById('backImage').addEventListener('change', (e) => {
            if (e.target.files[0]) {
                loadTexture(e.target.files[0], 'back');
            }
        });

        function animate() {
            requestAnimationFrame(animate);
           
            if (isSpinning) {
                coin.rotation.z += spinSpeed;
            }
            controls.update();
           
            renderer.render(scene, camera);
        }

        animate();

        // GIF Export functionality
        const exportButton = document.getElementById('exportButton');
        let isRecording = false;
        let frames = [];
        const frameCount = 90; // 3 seconds at 30fps
        let currentFrame = 0;

        exportButton.addEventListener('click', () => {
            if (isRecording) return;
           
            isRecording = true;
            exportButton.disabled = true;
            exportButton.textContent = 'Recording...';
            frames = [];
            currentFrame = 0;

            // Create a temporary canvas for capturing frames
            const tempCanvas = document.createElement('canvas');
            tempCanvas.width = window.innerWidth - 300;
            tempCanvas.height = window.innerHeight;
            const tempContext = tempCanvas.getContext('2d');

            // Start recording frames
            function captureFrame() {
                if (currentFrame < frameCount) {
                    // Render the current frame
                    renderer.render(scene, camera);
                   
                    // Copy WebGL canvas to temporary canvas
                    tempContext.drawImage(renderer.domElement, 0, 0);
                   
                    // Store the frame as a data URL
                    frames.push(tempCanvas.toDataURL('image/png'));
                   
                    currentFrame++;
                    requestAnimationFrame(captureFrame);
                } else {
                    // Create a zip file containing all frames
                    const zip = new JSZip();
                   
                    // Add all frames to the zip
                    frames.forEach((frame, index) => {
                        // Convert data URL to blob
                        const base64Data = frame.split(',')[1];
                        zip.file(`frame_${index.toString().padStart(3, '0')}.png`, base64Data, {base64: true});
                    });
                   
                    // Generate the zip file
                    zip.generateAsync({type: 'blob'}).then(function(content) {
                        // Create download link
                        const url = URL.createObjectURL(content);
                        const a = document.createElement('a');
                        a.href = url;
                        a.download = 'pog-coin-frames.zip';
                        a.click();
                        URL.revokeObjectURL(url);
                       
                        // Reset button
                        exportButton.disabled = false;
                        exportButton.textContent = 'Export Frames';
                        isRecording = false;
                    });
                }
            }

            captureFrame();
        });
    </script>
</body>
</html>
 
Last edited:
Virtual Cafe Awards

wavve-creator

Ontologist lost in America; dreaming.
Joined
Aug 12, 2024
Messages
713
Reaction score
2,271
Awards
204
I'm not proud of it, but my whole thing is making stuff that has no marketability at all. Dumb games, dumb websites... If I had some idea of how to make something that had actual market viability I'd be doing it but I don't.
Work backwards not product first.
 
Virtual Cafe Awards

waffle

Active Traveler
Joined
Apr 14, 2024
Messages
152
Reaction score
724
Awards
89

Punp

3D/2D artist
Moderator
Gold
Silver
Joined
Aug 4, 2022
Messages
2,557
Reaction score
11,324
Awards
341
Website
punp.neocities.org
Okay first lets see if anyone has any skills! I have wrote this single HTML file for a POG generation machine, very basic!

Inspired by this post! https://agoraroad.com/forum/index.p...gs-theyre-back-on-the-agora-forum.7897/page-5

View attachment 145110


View attachment 145111

It is a spinning coin!
Yes is is a bit vibe coded but idc because I actually understand whats going on. Using AI is fine as long as you know wha is happening!

What can Argoanites do!

Some ideas that I would like to add to the script!

1. Filters over images for roughness, holographic or other cool textures! All of which can be modified by sliders (or whatever you want!)

2. Editable images!

3. I tired to build a GIF exporter in here but failed on my attempts! If anyone can figure out how to do that I'll be impressed!

code below
HTML:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>POG Generator</title>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r128/three.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/three@0.128.0/examples/js/controls/OrbitControls.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/canvas-to-blob/1.0.0/canvas-to-blob.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jszip/3.10.1/jszip.min.js"></script>
    <style>
        body {
            margin: 0;
            overflow: hidden;
            background: #1a1a1a;
            display: flex;
            justify-content: flex-start;
            align-items: center;
            height: 100vh;
            font-family: Arial, sans-serif;
        }
        #canvas {
            position: fixed;
            top: 0;
            left: 0;
            width: calc(100% - 300px);
            height: 100%;
        }
        .controls {
            position: fixed;
            right: 0;
            top: 0;
            width: 300px;
            height: 100vh;
            background: rgba(255, 255, 255, 0.1);
            padding: 20px;
            box-sizing: border-box;
            backdrop-filter: blur(10px);
            color: white;
            overflow-y: auto;
        }
        input[type="file"] {
            width: 100%;
            margin: 10px 0;
            background: rgba(255, 255, 255, 0.1);
            padding: 8px;
            border-radius: 5px;
            color: white;
        }
        input[type="range"] {
            width: 100%;
            margin: 10px 0;
        }
        .speed-control {
            margin: 15px 0;
            padding: 10px;
            background: rgba(255, 255, 255, 0.05);
            border-radius: 5px;
        }
        .speed-value {
            color: #4CAF50;
            font-weight: bold;
        }
        h3 {
            margin-top: 0;
            padding-bottom: 10px;
            border-bottom: 1px solid rgba(255, 255, 255, 0.1);
        }
        button {
            background: #4CAF50;
            border: none;
            padding: 10px 20px;
            color: white;
            border-radius: 5px;
            cursor: pointer;
            margin: 5px;
            transition: all 0.3s ease;
        }
        button:hover {
            background: #45a049;
        }
        button.active {
            background: #f44336;
        }
        button.active:hover {
            background: #d32f2f;
        }
        .export-button {
            background: #2196F3;
            margin-top: 20px;
        }
        .export-button:hover {
            background: #1976D2;
        }
        .export-button:disabled {
            background: #ccc;
            cursor: not-allowed;
        }
    </style>
</head>
<body>
    <div id="canvas"></div>
    <div class="controls">
        <h3>POG Generator</h3>
        <div>
            <label>Front Face:</label>
            <input type="file" id="frontImage" accept="image/*">
        </div>
        <div>
            <label>Back Face:</label>
            <input type="file" id="backImage" accept="image/*">
        </div>
        <div class="speed-control">
            <label>Spin Speed: <span class="speed-value">0.01</span></label>
            <input type="range" id="speedSlider" min="0.01" max="0.2" step="0.01" value="0.01">
        </div>
        <button id="spinButton">Spin Coin</button>
        <button id="exportButton" class="export-button">Export Frames</button>
    </div>

    <script>
        const scene = new THREE.Scene();
        const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
        const renderer = new THREE.WebGLRenderer({ antialias: true });
        renderer.setSize(window.innerWidth, window.innerHeight);
        document.getElementById('canvas').appendChild(renderer.domElement);

        const controls = new THREE.OrbitControls(camera, renderer.domElement);
        controls.enableDamping = true;
        controls.dampingFactor = 0.05;

        // Lighting
        const ambientLight = new THREE.AmbientLight(0xffffff, 0.7);
        scene.add(ambientLight);
     
        const pointLight1 = new THREE.PointLight(0xffffff, 1);
        pointLight1.position.set(3, 2, 0);
        scene.add(pointLight1);

        const pointLight2 = new THREE.PointLight(0xffffff, 0.8);
        pointLight2.position.set(-5, 2, 0);
        scene.add(pointLight2);

        const pointLight3 = new THREE.PointLight(0xffffff, 0.5);
        pointLight3.position.set(0, 5, 0);
        scene.add(pointLight3);

        const geometry = new THREE.CylinderGeometry(2, 2, 0.1, 32);
        const material = new THREE.MeshStandardMaterial({
            metalness: 0.3,
            roughness: 0.2,
            color: 0xffffff
        });
        const coin = new THREE.Mesh(geometry, material);
        coin.rotation.x = Math.PI / 2;
        scene.add(coin);

        // Position camera
        camera.position.z = 5;
        camera.position.y = 2;
        camera.lookAt(0, 0, 0);

        let isSpinning = true;
        let spinSpeed = 0.01;

        const speedSlider = document.getElementById('speedSlider');
        const speedValue = document.querySelector('.speed-value');
     
        speedSlider.addEventListener('input', (e) => {
            spinSpeed = parseFloat(e.target.value);
            speedValue.textContent = spinSpeed.toFixed(2);
        });

        window.addEventListener('resize', () => {
            camera.aspect = window.innerWidth / window.innerHeight;
            camera.updateProjectionMatrix();
            renderer.setSize(window.innerWidth, window.innerHeight);
        });

        const spinButton = document.getElementById('spinButton');
        spinButton.addEventListener('click', () => {
            isSpinning = !isSpinning;
            spinButton.textContent = isSpinning ? 'Stop Coin' : 'Spin Coin';
            spinButton.classList.toggle('active');
        });

        function loadTexture(file, side) {
            const reader = new FileReader();
            reader.onload = function(e) {
                const texture = new THREE.TextureLoader().load(e.target.result);
                texture.needsUpdate = true;
                texture.rotation = Math.PI / 2;
                texture.center.set(0.5, 0.5);
             
                const sideMaterial = new THREE.MeshStandardMaterial({
                    map: texture,
                    metalness: 0.3,
                    roughness: 0.2,
                    color: 0xffffff
                });

                let materials;
                if (Array.isArray(coin.material)) {
                    materials = [...coin.material];
                } else {
                    materials = [
                        new THREE.MeshStandardMaterial({ color: 0x888888 }), // side
                        new THREE.MeshStandardMaterial({ color: 0xffffff }), // top
                        new THREE.MeshStandardMaterial({ color: 0xffffff })  // bottom
                    ];
                }
                if (side === 'front') {
                    materials[1] = sideMaterial; // top
                } else if (side === 'back') {
                    materials[2] = sideMaterial; // bottom
                }

                coin.material = materials;
            };
            reader.readAsDataURL(file);
        }

        document.getElementById('frontImage').addEventListener('change', (e) => {
            if (e.target.files[0]) {
                loadTexture(e.target.files[0], 'front');
            }
        });

        document.getElementById('backImage').addEventListener('change', (e) => {
            if (e.target.files[0]) {
                loadTexture(e.target.files[0], 'back');
            }
        });

        function animate() {
            requestAnimationFrame(animate);
         
            if (isSpinning) {
                coin.rotation.z += spinSpeed;
            }
            controls.update();
         
            renderer.render(scene, camera);
        }

        animate();

        // GIF Export functionality
        const exportButton = document.getElementById('exportButton');
        let isRecording = false;
        let frames = [];
        const frameCount = 90; // 3 seconds at 30fps
        let currentFrame = 0;

        exportButton.addEventListener('click', () => {
            if (isRecording) return;
         
            isRecording = true;
            exportButton.disabled = true;
            exportButton.textContent = 'Recording...';
            frames = [];
            currentFrame = 0;

            // Create a temporary canvas for capturing frames
            const tempCanvas = document.createElement('canvas');
            tempCanvas.width = window.innerWidth - 300;
            tempCanvas.height = window.innerHeight;
            const tempContext = tempCanvas.getContext('2d');

            // Start recording frames
            function captureFrame() {
                if (currentFrame < frameCount) {
                    // Render the current frame
                    renderer.render(scene, camera);
                 
                    // Copy WebGL canvas to temporary canvas
                    tempContext.drawImage(renderer.domElement, 0, 0);
                 
                    // Store the frame as a data URL
                    frames.push(tempCanvas.toDataURL('image/png'));
                 
                    currentFrame++;
                    requestAnimationFrame(captureFrame);
                } else {
                    // Create a zip file containing all frames
                    const zip = new JSZip();
                 
                    // Add all frames to the zip
                    frames.forEach((frame, index) => {
                        // Convert data URL to blob
                        const base64Data = frame.split(',')[1];
                        zip.file(`frame_${index.toString().padStart(3, '0')}.png`, base64Data, {base64: true});
                    });
                 
                    // Generate the zip file
                    zip.generateAsync({type: 'blob'}).then(function(content) {
                        // Create download link
                        const url = URL.createObjectURL(content);
                        const a = document.createElement('a');
                        a.href = url;
                        a.download = 'pog-coin-frames.zip';
                        a.click();
                        URL.revokeObjectURL(url);
                     
                        // Reset button
                        exportButton.disabled = false;
                        exportButton.textContent = 'Export Frames';
                        isRecording = false;
                    });
                }
            }

            captureFrame();
        });
    </script>
</body>
</html>
Host your script files, that'll be the first thing to break.

I've got some scratch textures for this and a saturation filter I can provide, as I made a filter stack in Affinity. Will send it over when I'm back at K next week.

Looking very good already, well done.

I imagine there's already a plugin for making gifs from the canvas which you can snatch up.
 
Virtual Cafe Awards

wavve-creator

Ontologist lost in America; dreaming.
Joined
Aug 12, 2024
Messages
713
Reaction score
2,271
Awards
204
I was thinking we could build a Project Zomboid world together ! Any thoughts ?
I'm down i love that game.
Yes, let's become part of the problem.
Impoverished mindset.
Host your script files, that'll be the first thing to break.
I agree to disagree, I get ur point but 3js is not gonna be unmainainted any time soon.
I've got some scratch textures for this and a saturation filter I can provide, as I made a filter stack in Affinity. Will send it over when I'm back at K next week.
Ya I would like to see this.
imagine there's already a plugin for making gifs from the canvas which you can snatch up.
I tired the one I found on stack overflow but the

:agcrybl::agcrybl::agcrybl::agcrybl:

Mf did not like it an kept erroring out!
 
Virtual Cafe Awards
I mean, we could take inspiration from 100r, couldn't we?

Timeless software, some hipsta shit or whatever
reminds me of that one who founded(?) xxiivv webring and got his web full of interesting stuff

also seen glimpse of similar thread, "agora builds hw/sw" somewhere...
there is also https://forum.agoraroad.com/index.php?threads/agora-makes-a-game.4315/ (https://forum.agoraroad.com/index.php?threads/agora-game-jam-2024-possibly.7039/), https://forum.agoraroad.com/index.p...ficial-agora-road-collaborative-website.7093/ and many such threads... (they should be sorted or pinned some day)

maybe i meant this one, https://forum.agoraroad.com/index.php?threads/the-agora-lets-program-some-shit-together-thread.6529/ (but also social, like https://forum.agoraroad.com/index.p...e-by-a-community-that-is-completely-new.6297/)
 
Last edited:
Virtual Cafe Awards

SaturnianWarlock

Dārio Valyrio Valyriat
Joined
Jul 12, 2023
Messages
217
Reaction score
589
Awards
74
An agora road game perhaps? Someone to do the music, someone else the art, and others to do the programming. Then we could sell the game and split the profits or something. Also instead of a completely software project, what if we had an agora road projects involving some hardware/electronics stuff. People who know how to program could do the programming, and people with knowledge on electronics could work on that stuff. I have some ideas such as :
- Some kind of agora tamagochi
- An emulator that allows you to play games from various consoles on through some kind of universal ROM catridge reader (PS vita, Nintendo, psp etc)
- Agora road Linux distro (What programs and apps would AR user want or like)
- Wifi googles (A sort of AR device that uses wifi signals, to build a 3d images and see through walls or something, there are science articles or exactly how this can be acheived)
- An agora road 3d printed [REDACTED] just kidding of course:NepWink:
but for hardware projects mentioned above, 3d printed a casing for them could make them look really nice instead of just PCB
- An agora road private tracker or something?
I'm just brainstorming some ideas.
 
Last edited:

Rebetol

Doyen.
Joined
Jun 14, 2023
Messages
32
Reaction score
180
Awards
22
We can make something like twhl tower it's a Half-life map that every floor made by differnt person.
I dont mean "lets make a Half-life map" but everyone can make a small and indipendent thing, when everyone makes there stuff we can put them all in one place like a art gallery.
I dont think this would work on anyting other than art (2d or 3d) or game map but thats my stupit idea.
 
we could make some playlist together. video/music from channels they like/want others to know. this way, we could maybe even influence yt algo of each other or maybe whole youtube (class - one has to be hopeful or even clownery these days...)

 
Virtual Cafe Awards