Compare commits

..

4 Commits

Author SHA1 Message Date
CJSatnarine
feddbf7d6d remove evilring from webring list
Some checks failed
Build / deploy (push) Has been cancelled
2026-05-05 09:17:24 -04:00
CJSatnarine
1513d449a2 remove tumblr
Some checks failed
Build / deploy (push) Failing after 2m50s
2026-05-01 02:46:51 -04:00
CJSatnarine
66122eb1c7 removed the secrets, edited some other stuff
Some checks failed
Build / deploy (push) Has been cancelled
2026-04-29 20:45:32 -04:00
CJSatnarine
7fbddfddca removed the secrets, edited some other stuff 2026-04-29 20:43:17 -04:00
17 changed files with 24 additions and 977 deletions

View File

@@ -2,9 +2,9 @@
template = "index.html"
title = "CJ Satnarine"
+++
:construction: Don't mind the mess, the site's still under construction and is undergoing a lot of changes. A lot of projects are missing and will be added soon. :construction:
:construction: Don't mind the mess, the site's still under construction and is undergoing a lot of changes. A lot of projects are missing and will be added soon. :construction:
Hey! My name is CJ, and welcome to my little space on the internet. I just share whatever I feel like here. I'm into a lot of things, from 3D animation and code to history and language. You can find out more in my [about me](@/about_me/_index.md).
Hey! My name is CJ, and welcome to my little space on the internet. I just share whatever I feel like here. I'm into a lot of things, from 3D animation and code to history and language.
Alright, enjoy looking around. Feel free to [reach out to me](@/contact/_index.md).

View File

@@ -3,18 +3,18 @@ template = "index.html"
title = "About Me"
+++
Hey, I'm CJ! I'm an aspiring graphics programmer/techincal artist/game developer from Waterloo, Ontario, Canada. I like coding and art and animation and walking and computers and languages and chasing my cat in the dark and reading and music. I haven't drank any caffeined beverages since 2022.
Hey, I'm CJ! I'm an aspiring graphics programmer/technical artist/game developer from Waterloo, Ontario, Canada. I haven't drunk any caffeined beverages since 2022.
> I do not use generative AI in any of my work, and I do not intend to.
## History
In 2021, I stumbled across Blender, and I spent my last two years in highschool playing around with the software. I had fallen in love with 3D animation at this point. I also played around with Unity, and took mostly coding and computer classes around this time. At some point, I took all the classes that were technology related. In 2023, I of course enrolled into software engineering in post-secondary school. Yikes. Spent a year through that and dropped out after realising it wasn't my cup of tea. It was through this experience, however, I realised I could combine my love for graphics and programming with, wait for it, :sparkles: ***graphics programming*** :sparkles:.
Growing up in the Caribbean exposed me to different cultures, and I believe that exposure started an interest in social studies, history, and languages.
During that software engineering schooling experience, I took an anthropology elective that really reöpened my interest in a lot of topics under that umbrella, most specifically languages (more info in [here](@/projects/language_stuff/_index.md)). In primary and secondary school, I had an interest in social studies and history, and now I study those topics on my own.
My introduction to animation coincided with my introduction to computers and programming in highschool. I would have envisioned myself a game developer or some sort of programmer as I was graduating highschool, so I pursued Software Engineering. Turned out I didn't like the idea of being a software engineer, so I dropped out. During that time, I took an anthropology elective which reintroduce my interest in the humanities.
Nowadays I'm trying to get back into 3D animation and game development, while trying to self-study and occasionally refurbishing computers.
## Stuff I use:
## Software I use:
- Blender (<span class="special">i wuv bwendew</span> )
- Godot (started using in 2025 to replace Unity)
- GIMP
@@ -22,6 +22,6 @@ Nowadays I'm trying to get back into 3D animation and game development, while tr
- i use arch btw
- Neovim (code and text editor)
- Obsidian (note taking)
- fooyin (started using it in mid-January of 2026 instead of Spotify)
- fooyin (music listening)
- Foliate (for e-book reading)
- Helium Browser (replaced Brave browser)
- Helium Browser

View File

@@ -7,16 +7,12 @@ title = "Contact me"
E-mail: `cjsatnarine@protonmail.com`
Matrix: [@just_cj:matrix.org](https://matrix.to/#/@just_cj:matrix.org)
### You can find my stuff (when I eventually post) on:
Gitea: <a href="https://git.cjsatnarine.space">git.cjsatnarine.space</a>
Mastodon: <a rel="me" href="https://woof.tech/@just_cj">@just_cj</a>
Tumblr: <a href="https://justcjart.tumblr.com/">justcjart</a>
YouTube: <a href="https://www.youtube.com/@CJSatnarine">CJSatnarine</a>
ArtStation: <a href="https://www.artstation.com/cjsatnarine">cjsatnarine</a>

View File

@@ -1,6 +0,0 @@
+++
template = "secrets.html"
page_template = "projects-page.html"
title = "Secrets"
+++
what the fuck is this place??

View File

@@ -1,7 +0,0 @@
+++
title = "The Forest"
+++
The forest is growing, come back another time.
###### (I forgot to create the forest)
<canvas id="forest"/>

View File

@@ -1,4 +0,0 @@
+++
title = "The Kennel"
+++
<canvas id="kennel"/>

View File

@@ -3,44 +3,15 @@ template = "index.html"
title = "Stuff I Like"
+++
## Food
- *Bánh mì* is my favourite food right now
- *Shawarma poutine*
- *Bangers and Mash*
- *Mayo and bread with lettuce to feel fancy*
- *Veggie Springrolls*
- *Fish and Chips*
- *Chicken Pineapple pizza with mayo as a dip*
- *Diet/Sugar free Ginger Ale*
- *Chow mein*
- *Lo mein*
- You can always bribe me with *Dark chocolate mint thins* or those *Scottish caramel chocolate wafers* I forgot the name of
## Music
This is in no way all of my favourite artists, there are too many to list. These are just the ones I really enjoy and don't mind sharing (in no particular order):
- *FIBEL*
- *HARBOUR*
- *Provinz*: I just listened to them a lot when I was learning German.
- *Molchat Doma*
- *LOOK MUM NO COMPUTER*
- *DOUBLECAMP*
- *SOFFIE*
- *AJR*
- *Emil Kárlsen*: I really enjoyed his song Muohta and the album Nagirvárrái.
- *Dorian Concept*
- *tomcbumpz*
- *Pogo*
- *anaïs*
- *Home*
- *Nanook*: I really like their song Ingerlaliinnaleqaagut.
- *Paysage D'Hiver*
## Films and Animations
- *The Seventh Seal/Det Sjunde Inseglet* (1957, Ingmar Bergman)
- *Godland/Volaða Land* (2022, Hlynur Pálmason)
- *Bob* (by [InfinityBurrito](https://www.youtube.com/@infinityburrito5299/featured))
- *The Transformers* (1984-1987)
- *Ivan's Childhood* (1962, Andrei Tarkovsky)
- *The Tragedy of Man* (2011, Marcell Jankovics)
- *Andor* (2022-2025, Tony Gilroy)
## Games
I'm not really a gamer but these are some stuff I liked:
- *Navicula Meatus*
@@ -48,3 +19,10 @@ I'm not really a gamer but these are some stuff I liked:
- *Viewfinder*
- *Sable*
- *Plants vs. Zombies*
- *Critters for Sale*
- *Moon Hunters*
- *Felvidek*
- *s.p.l.i.t*
- *Lost Wiki*
- *Unsorted Horror*
- *Pager*

View File

@@ -1,5 +1,4 @@
@use "colours";
body {
background-color: colours.$background;
font-family: 'Roboto Mono';
@@ -70,6 +69,10 @@ strong {
color: colours.$blockquote;
}
img {
padding-left: 0%;
}
hr {
background: linear-gradient(to right, colours.$h1, colours.$periwinkle, colours.$h1, colours.$periwinkle, colours.$h1);
height: 5px;
@@ -127,3 +130,4 @@ p {
#statuscafe-content {
margin: 0 1em 0.5em 1em;
}

View File

@@ -1,49 +0,0 @@
import * as THREE from 'three';
import { OBJLoader } from 'three/addons/loaders/OBJLoader.js';
const renderer = new THREE.WebGLRenderer({ canvas: document.querySelector('#forest'), });
const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera( 75, window.innerWidth / window.innerHeight, 0.1, 1000 );
let modelObject = new THREE.Object3D;
renderer.setSize( window.innerWidth, window.innerHeight );
renderer.setAnimationLoop( animate );
camera.position.z = 5;
// OBJ loader.
const objectLoader = new OBJLoader();
objectLoader.load(
"/../../wolf_head/wolf_head.obj",
function(object) {
console.log(object);
modelObject = object;
object.traverse((child) => {
// instance of is apparently the reason god made typescript
if (child instanceof THREE.Mesh) {
// Create material for the mesh.
child.material = new THREE.MeshStandardMaterial({ color: 0x962FFE });
child.material.wireframe = true;
child.material.wireframeLinewidth = 1;
child.material.emissive = (new THREE.Color().setHex(0xff3030));
}
});
scene.add(object);
},
function(xhr) {
console.log((xhr.loaded / xhr.total * 100) + '% loaded');
},
function(error) {
console.log('an error happened', error);
}
);
function animate() {
modelObject.rotation.x += 0.01;
modelObject.rotation.y += 0.01;
renderer.render( scene, camera );
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 MiB

Binary file not shown.

View File

@@ -1,324 +0,0 @@
{
"asset":{
"generator":"Khronos glTF Blender I/O v4.5.48",
"version":"2.0"
},
"scene":0,
"scenes":[
{
"name":"Scene",
"nodes":[
0,
1,
2
]
}
],
"nodes":[
{
"mesh":0,
"name":"Plane",
"scale":[
25,
25,
25
]
},
{
"mesh":1,
"name":"Cube",
"translation":[
0,
1,
2.458730936050415
]
},
{
"mesh":2,
"name":"Suzanne",
"rotation":[
0.08822915703058243,
-0.27138662338256836,
0.0949493795633316,
0.9537031054496765
],
"translation":[
6.071174144744873,
2.417121171951294,
0
]
}
],
"materials":[
{
"doubleSided":true,
"name":"Ground",
"pbrMetallicRoughness":{
"baseColorFactor":[
0.37110745906829834,
0.39915257692337036,
0.364591121673584,
1
],
"metallicFactor":0,
"roughnessFactor":0.5
}
},
{
"doubleSided":true,
"name":"Cube",
"pbrMetallicRoughness":{
"baseColorFactor":[
0.8000937700271606,
0.00807161070406437,
0.025698840618133545,
1
],
"metallicFactor":0,
"roughnessFactor":0.5
}
},
{
"doubleSided":true,
"name":"Monkey",
"pbrMetallicRoughness":{
"baseColorFactor":[
0.12672929465770721,
0.03563183546066284,
0.8001565933227539,
1
],
"metallicFactor":0,
"roughnessFactor":0.5
}
}
],
"meshes":[
{
"name":"Plane",
"primitives":[
{
"attributes":{
"POSITION":0,
"NORMAL":1,
"TEXCOORD_0":2
},
"indices":3,
"material":0
}
]
},
{
"name":"Cube.001",
"primitives":[
{
"attributes":{
"POSITION":4,
"NORMAL":5,
"TEXCOORD_0":6
},
"indices":7,
"material":1
}
]
},
{
"name":"Suzanne",
"primitives":[
{
"attributes":{
"POSITION":8,
"NORMAL":9,
"TEXCOORD_0":10
},
"indices":11,
"material":2
}
]
}
],
"accessors":[
{
"bufferView":0,
"componentType":5126,
"count":4,
"max":[
1,
0,
1
],
"min":[
-1,
0,
-1
],
"type":"VEC3"
},
{
"bufferView":1,
"componentType":5126,
"count":4,
"type":"VEC3"
},
{
"bufferView":2,
"componentType":5126,
"count":4,
"type":"VEC2"
},
{
"bufferView":3,
"componentType":5123,
"count":6,
"type":"SCALAR"
},
{
"bufferView":4,
"componentType":5126,
"count":24,
"max":[
1,
1,
1
],
"min":[
-1,
-1,
-1
],
"type":"VEC3"
},
{
"bufferView":5,
"componentType":5126,
"count":24,
"type":"VEC3"
},
{
"bufferView":6,
"componentType":5126,
"count":24,
"type":"VEC2"
},
{
"bufferView":7,
"componentType":5123,
"count":36,
"type":"SCALAR"
},
{
"bufferView":8,
"componentType":5126,
"count":1966,
"max":[
1.3671875,
0.984375,
0.8515625
],
"min":[
-1.3671875,
-0.984375,
-0.8515625
],
"type":"VEC3"
},
{
"bufferView":9,
"componentType":5126,
"count":1966,
"type":"VEC3"
},
{
"bufferView":10,
"componentType":5126,
"count":1966,
"type":"VEC2"
},
{
"bufferView":11,
"componentType":5123,
"count":2904,
"type":"SCALAR"
}
],
"bufferViews":[
{
"buffer":0,
"byteLength":48,
"byteOffset":0,
"target":34962
},
{
"buffer":0,
"byteLength":48,
"byteOffset":48,
"target":34962
},
{
"buffer":0,
"byteLength":32,
"byteOffset":96,
"target":34962
},
{
"buffer":0,
"byteLength":12,
"byteOffset":128,
"target":34963
},
{
"buffer":0,
"byteLength":288,
"byteOffset":140,
"target":34962
},
{
"buffer":0,
"byteLength":288,
"byteOffset":428,
"target":34962
},
{
"buffer":0,
"byteLength":192,
"byteOffset":716,
"target":34962
},
{
"buffer":0,
"byteLength":72,
"byteOffset":908,
"target":34963
},
{
"buffer":0,
"byteLength":23592,
"byteOffset":980,
"target":34962
},
{
"buffer":0,
"byteLength":23592,
"byteOffset":24572,
"target":34962
},
{
"buffer":0,
"byteLength":15728,
"byteOffset":48164,
"target":34962
},
{
"buffer":0,
"byteLength":5808,
"byteOffset":63892,
"target":34963
}
],
"buffers":[
{
"byteLength":69700,
"uri":"test.bin"
}
]
}

Binary file not shown.

View File

@@ -1,420 +0,0 @@
{
"asset":{
"generator":"Khronos glTF Blender I/O v4.5.49",
"version":"2.0"
},
"scene":0,
"scenes":[
{
"name":"Scene",
"nodes":[
0,
1,
2,
3
]
}
],
"nodes":[
{
"mesh":0,
"name":"Plane",
"scale":[
25,
25,
25
]
},
{
"mesh":1,
"name":"Cube",
"translation":[
0,
1,
2.458730936050415
]
},
{
"mesh":2,
"name":"Suzanne",
"rotation":[
0.08822915703058243,
-0.27138662338256836,
0.0949493795633316,
0.9537031054496765
],
"translation":[
6.071174144744873,
2.417121171951294,
0
]
},
{
"mesh":3,
"name":"Icosphere",
"translation":[
-2.5536391735076904,
2.877737522125244,
-0.012781083583831787
]
}
],
"materials":[
{
"doubleSided":true,
"name":"Ground",
"pbrMetallicRoughness":{
"baseColorFactor":[
0.37110745906829834,
0.39915257692337036,
0.364591121673584,
1
],
"metallicFactor":0,
"roughnessFactor":0.5
}
},
{
"doubleSided":true,
"name":"Cube",
"pbrMetallicRoughness":{
"baseColorFactor":[
0.8000937700271606,
0.00807161070406437,
0.025698840618133545,
1
],
"metallicFactor":0,
"roughnessFactor":0.5
}
},
{
"doubleSided":true,
"name":"Monkey",
"pbrMetallicRoughness":{
"baseColorFactor":[
0.12672929465770721,
0.03563183546066284,
0.8001565933227539,
1
],
"metallicFactor":0,
"roughnessFactor":0.5
}
},
{
"doubleSided":true,
"name":"Material",
"pbrMetallicRoughness":{
"baseColorFactor":[
0.13890013098716736,
0.8004242181777954,
0.06036654859781265,
1
],
"metallicFactor":0,
"roughnessFactor":0.5
}
}
],
"meshes":[
{
"name":"Plane",
"primitives":[
{
"attributes":{
"POSITION":0,
"NORMAL":1,
"TEXCOORD_0":2
},
"indices":3,
"material":0
}
]
},
{
"name":"Cube.001",
"primitives":[
{
"attributes":{
"POSITION":4,
"NORMAL":5,
"TEXCOORD_0":6
},
"indices":7,
"material":1
}
]
},
{
"name":"Suzanne",
"primitives":[
{
"attributes":{
"POSITION":8,
"NORMAL":9,
"TEXCOORD_0":10
},
"indices":11,
"material":2
}
]
},
{
"name":"Icosphere",
"primitives":[
{
"attributes":{
"POSITION":12,
"NORMAL":13,
"TEXCOORD_0":14
},
"indices":15,
"material":3
}
]
}
],
"accessors":[
{
"bufferView":0,
"componentType":5126,
"count":4,
"max":[
1,
0,
1
],
"min":[
-1,
0,
-1
],
"type":"VEC3"
},
{
"bufferView":1,
"componentType":5126,
"count":4,
"type":"VEC3"
},
{
"bufferView":2,
"componentType":5126,
"count":4,
"type":"VEC2"
},
{
"bufferView":3,
"componentType":5123,
"count":6,
"type":"SCALAR"
},
{
"bufferView":4,
"componentType":5126,
"count":24,
"max":[
1,
1,
1
],
"min":[
-1,
-1,
-1
],
"type":"VEC3"
},
{
"bufferView":5,
"componentType":5126,
"count":24,
"type":"VEC3"
},
{
"bufferView":6,
"componentType":5126,
"count":24,
"type":"VEC2"
},
{
"bufferView":7,
"componentType":5123,
"count":36,
"type":"SCALAR"
},
{
"bufferView":8,
"componentType":5126,
"count":1966,
"max":[
1.3671875,
0.984375,
0.8515625
],
"min":[
-1.3671875,
-0.984375,
-0.8515625
],
"type":"VEC3"
},
{
"bufferView":9,
"componentType":5126,
"count":1966,
"type":"VEC3"
},
{
"bufferView":10,
"componentType":5126,
"count":1966,
"type":"VEC2"
},
{
"bufferView":11,
"componentType":5123,
"count":2904,
"type":"SCALAR"
},
{
"bufferView":12,
"componentType":5126,
"count":240,
"max":[
0.9510578513145447,
1,
0.9999999403953552
],
"min":[
-0.9510578513145447,
-1,
-0.9999999403953552
],
"type":"VEC3"
},
{
"bufferView":13,
"componentType":5126,
"count":240,
"type":"VEC3"
},
{
"bufferView":14,
"componentType":5126,
"count":240,
"type":"VEC2"
},
{
"bufferView":15,
"componentType":5123,
"count":240,
"type":"SCALAR"
}
],
"bufferViews":[
{
"buffer":0,
"byteLength":48,
"byteOffset":0,
"target":34962
},
{
"buffer":0,
"byteLength":48,
"byteOffset":48,
"target":34962
},
{
"buffer":0,
"byteLength":32,
"byteOffset":96,
"target":34962
},
{
"buffer":0,
"byteLength":12,
"byteOffset":128,
"target":34963
},
{
"buffer":0,
"byteLength":288,
"byteOffset":140,
"target":34962
},
{
"buffer":0,
"byteLength":288,
"byteOffset":428,
"target":34962
},
{
"buffer":0,
"byteLength":192,
"byteOffset":716,
"target":34962
},
{
"buffer":0,
"byteLength":72,
"byteOffset":908,
"target":34963
},
{
"buffer":0,
"byteLength":23592,
"byteOffset":980,
"target":34962
},
{
"buffer":0,
"byteLength":23592,
"byteOffset":24572,
"target":34962
},
{
"buffer":0,
"byteLength":15728,
"byteOffset":48164,
"target":34962
},
{
"buffer":0,
"byteLength":5808,
"byteOffset":63892,
"target":34963
},
{
"buffer":0,
"byteLength":2880,
"byteOffset":69700,
"target":34962
},
{
"buffer":0,
"byteLength":2880,
"byteOffset":72580,
"target":34962
},
{
"buffer":0,
"byteLength":1920,
"byteOffset":75460,
"target":34962
},
{
"buffer":0,
"byteLength":480,
"byteOffset":77380,
"target":34963
}
],
"buffers":[
{
"byteLength":77860,
"uri":"test2.bin"
}
]
}

View File

@@ -1,117 +0,0 @@
import * as THREE from 'three';
import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js';
import { PointerLockControls } from 'three/addons/controls/PointerLockControls.js';
// Variables
const renderer = new THREE.WebGLRenderer({ canvas: document.querySelector('#kennel'), });
const camera = new THREE.PerspectiveCamera(60, window.innerWidth / window.innerHeight, 1, 1000);
const light = new THREE.HemisphereLight(0xeeeeff, 0x777788, 2.5);
const controls = new PointerLockControls(camera, renderer.domElement);
const scene = new THREE.Scene();
const clock = new THREE.Clock();
const keyMap = {}
// 3D Loaders.
const room = new GLTFLoader();
const image = new THREE.TextureLoader();
let pawTexture, fingerTexture, currentSprite;
init();
//Initialisation
function init() {
// Renderer
renderer.setSize(window.innerWidth, window.innerHeight);
// Camera
camera.position.z = 5;
// Light
light.position.set(0.5, 1, 0.75);
scene.add(light);
// Scene
scene.background = new THREE.Color(0x000000);
// Controller
document.addEventListener('click', () => {
controls.lock();
});
const onDocumentKey = (e) => {
keyMap[e.code] = e.type === 'keydown';
};
document.addEventListener('keydown', onDocumentKey, false);
document.addEventListener('keyup', onDocumentKey, false);
room.load(
// url of file
'test2.gltf',
// when resource is loaded
function(gltf) {
gltf.scene.position.y = -1;
scene.add(gltf.scene);
gltf.animations;
gltf.scene;
gltf.scenes;
gltf.cameras;
gltf.asset;
},
//when loading is progressing
function(xhr) {
console.log((xhr.loaded / xhr.total * 100) + '% loaded');
},
// when error
function(error) {
console.log('a fucking error lmao: ', error);
}
);
image.load('paw.png', (texture) => {
pawTexture = texture;
image.load('finger.png', (texture) => {
fingerTexture = texture;
const material = new THREE.SpriteMaterial({ map: texture });
currentSprite = new THREE.Sprite(material);
currentSprite.position.set(1, -0.7, -1.5);
camera.add(currentSprite);
scene.add(camera);
});
});
}
function animate() {
const delta = clock.getDelta();
if (controls.isLocked) {
if (keyMap['KeyW']) {
controls.moveForward(delta * 5);
}
if (keyMap['KeyS']) {
controls.moveForward(-delta * 5);
}
if (keyMap['KeyA']) {
controls.moveRight(-delta * 5);
}
if (keyMap['KeyD']) {
controls.moveRight(delta * 5);
}
if (keyMap['ShiftLeft']) {
if (currentSprite && fingerTexture && currentSprite.material.map !== fingerTexture) {
currentSprite.material.map = fingerTexture;
console.log("finger up");
}
} else {
if (currentSprite && pawTexture && currentSprite.material.map !== pawTexture) {
currentSprite.material.map = pawTexture;
console.log("finger down");
}
}
}
renderer.render(scene, camera);
}
renderer.setAnimationLoop(animate);

View File

@@ -41,14 +41,10 @@
</section>
</body>
<!-- Webrings -->
<footer id="footer">
<p> --- </p>
<center>
<a href="https://evilr.ing/cjsatnarine/previous">&lt;</a>
<a href="https://evilr.ing">EVILRING</a>
<a href="https://evilr.ing/cjsatnarine/next">&gt;</a>
<p> </p>
<script src="https://www.fluffpumpkin.net/webstring.js"></script>
<map name="noaimini3b">