Welcome to SECApedia! Please check out our rules, manual of style aswell as some info on the site.


The site is currently in a "grace period" where only users can edit articles so that we can set things up in peace. This should end within a few days or so. Soyoyuki (talk) 14:22, 21 June 2026 (UTC)


CURRENT MISSION: Update, uncensor and (if needed) rewrite all the imported pages from SNCApedia.
Additionally, please remove all unnecessary discussion pages, for example those with outdated info.

vichan

From SECApedia
Jump to navigationJump to search
Vichan is a gem.
Vichan puts the party in soyjak.party!
File:1-02 Party Hard.opus
The logo.

vichan, also known as vichan-devel, is the most popular imageboard software within the soysphere, and other places.. It is a free light-weight, fast, highly configurable and user-friendly imageboard software package and it is a fork of another imageboard software named TinyIB. It is written in PHP and has few dependencies.

It is less technologically advanced compared to LynxChan but is easier to fork/modify.

The official github repository and installation guides can be found at https://github.com/vichan-devel/vichan

Fork's of vichan

  • VinnyFork

Vinluv's fork of vichan used on sidson.city; the biggest change about it is the sidebar and deletion of a homepage its the hardest to use as it runs on a very old version of vichan.

  • RuFork

Yoot’s fork of vichan made for his 1 PPD website Ruzly, also known as Garty, or Frog Pond[Marge...]. It has a topbar and layout more similar to JSchan, however.

  • Kikemin's fork

based off the shemmy code, used on the chinny and binny[ev&doe it's just a frontend], Referred to as "gigglegrid"

  • Kuz's fork

the current fork used on soyjak.party, is the most notable and best designed and is mainly why Kuz was formerly considered one of the coders of vichan because of xis coding skills.

  • Shemmy Fork

used on the Shemmy, basically a mix of Kuz's fork, Kara's fork and Kikemin's fork

  • Kara's Fork

used on the old and new version of the Gacky, this one actually has a public source release but because it was made by a failtroll pedonigger and is rumored to contain malicious code it should not be used[lower-alpha 1].

Karachan/Shemmy/Chinny datamining

The rangeban and datamining code from Karachan are utilized on the Shemmy and Chinny, with the rangeban blocking Australia, the UK, Kuwait, and India by default, at nginx level (It will show a false 418 error "You are not allowed to access this site."), the datamining script "pearl.js" is a obsfucated script that uses obsfucator.io with debugger protection to freeze your browser if you attempt to debug it.

The script tracks your screen resolution, if you are on a mobile device (Android or iOS), if you are using a VPN and have WebRTC leaks, and scans your ports for Tuxler and Discord respectively, it also stores data to your localstorage and cookies to store a "tainted session" that persists between browser resets (use incognito to get around this), and sends a string for validation such as "karachan" (or "shemmy" in the case of the Shemmy). Most of these measures can be avoided by using incognito mode and a VPN and changing your screen resolution and window size. Do note it can also detect if you are using incognito too.

The unobsfucated source code for the datamining is here.

(async()=>{
	const results = {
		mobile: 0, //looks totally normal.
		dsc: 0,
		txl: 0,
		vpn: 0,
		cg: 0,
		wm: 0,
		hm: 0,
		wi: 0,
		hi: 0,
		vv: 'karachan',
		kp: ''
	}

	// Screen resolution check (if unpassable sets wm to -1)
	// This is fucking evil.
	try {
		results.wm = screen.width;
		results.hm = screen.height;
		results.wi = window.innerWidth;
		results.hi = window.innerHeight;
	} catch(e) {
		results.wm = -1
	}

	// Mobile check
	try {
		mobile = /Mobi|Android|iPhone|iPad/i.test(navigator.userAgent) ? 1 : 0;
	} catch(e) {
		mobile = 0;
	}

	// Kekpass (Yes, this is also evil. You don't know you're pozzed)
	try {
		results.kp = localStorage.getItem("kekpass") || '';
	} catch(e) {
		results.kp = '';
	}

	// Incognito check (chrome only, still sketchy)
	try {
		const fs = window.RequestFileSystem || window.webkitRequestFileSystem
		if(fs){
			fs(window.TEMPORARY, 100, ()=>{}, ()=>{ results.cg = 1 })
		}
	} catch(e){
		results.cg = 1
	}

	function trySocket(url, onSuccess){
		return new Promise((resolve)=>{
			let ws
			try {
				ws = new WebSocket(url)
				ws.onopen = ()=>{
					ws.close()
					onSuccess()
					resolve()
				}
				ws.onerror = ()=>resolve()
			} catch(e){
				resolve()
			}
		})
	}

	// WebSocket checks
	await trySocket("ws://127.0.0.1:6463/?v=1", ()=>{ results.dsc = 1 })
	await trySocket("ws://127.0.0.1:1701/tuxler", ()=>{ results.txl = 1 })
	await trySocket("ws://127.0.0.1:1700/tuxler", ()=>{ results.txl = 1 })

	// WebRTC leak check
	await new Promise((resolve)=>{
		let ips = new Set()

		let pc = new RTCPeerConnection({
			iceServers: [{urls: "stun:stun.l.google.com:19302"}]
		})

		pc.createDataChannel("check")

		pc.onicecandidate = (event)=>{
			if(event.candidate){
				let ipRegex = /([0-9]{1,3}(\.[0-9]{1,3}){3})/g
				let match = event.candidate.candidate.match(ipRegex)
				if(match){
					match.forEach(ip=>ips.add(ip))
				}
			} else {
				pc.close()

				// bruh logic: if we get any private IPs, it's likely local
				let hasLocal = false
				ips.forEach(ip=>{
					if(/^10\./.test(ip) || /^192\.168\./.test(ip) || /^172\.(1[6-9]|2[0-9]|3[0-1])\./.test(ip)){
						hasLocal = true
					}
				})

				results.vpn = hasLocal ? 0 : 1
				resolve()
			}
		}

		pc.createOffer().then(offer=>pc.setLocalDescription(offer))
	})

	// send it
	fetch('/kcindex.php', {method: 'POST', headers: {'Content-Type': 'application/x-www-form-urlencoded'}, body: new URLSearchParams(results)})
})()

How to install

Follow this tutorial from JewTube, you can also follow this one aswell.

Notes

  1. Also something to note is, the current release of it doesn't even work when you try to install it like you do with vichan, so there's no reason for you to use it.