text:
#!/usr/bin/env python3

'''
Downloads virtual tours from matterport.
Usage is either running this program with the URL/pageid as an argument or calling the initiateDownload(URL/pageid) method.
'''

import requests
import json
import threading
import concurrent.futures
import urllib.request
from urllib.parse import urlparse
import pathlib
import re
import os
import shutil
import sys
import time
import logging
from tqdm import tqdm
from http.server import HTTPServer, SimpleHTTPRequestHandler
import decimal

# Weird hack
accessurls = []
SHOWCASE_INTERNAL_NAME = "showcase-internal.js"

def makeDirs(dirname):
    pathlib.Path(dirname).mkdir(parents=True, exist_ok=True)

def getVariants():
    variants = []
    depths = ["512", "1k", "2k", "4k"]
    for depth in range(4):
        z = depths[depth]
        for x in range(2**depth):
            for y in range(2**depth):
                for face in range(6):
                    variants.append(f"{z}_face{face}_{x}_{y}.jpg")
    return variants

def downloadUUID(accessurl, uuid):
    downloadFile(accessurl.format(filename=f'{uuid}_50k.dam'), f'{uuid}_50k.dam')
    shutil.copy(f'{uuid}_50k.dam', f'..{os.path.sep}{uuid}_50k.dam')
    cur_file=""
    try:
        for i in range(1000):
            cur_file=accessurl.format(filename=f'{uuid}_50k_texture_jpg_high/{uuid}_50k_{i:03d}.jpg')
            downloadFile(cur_file, f'{uuid}_50k_texture_jpg_high/{uuid}_50k_{i:03d}.jpg')
            cur_file=accessurl.format(filename=f'{uuid}_50k_texture_jpg_low/{uuid}_50k_{i:03d}.jpg')
            downloadFile(cur_file, f'{uuid}_50k_texture_jpg_low/{uuid}_50k_{i:03d}.jpg')
    except Exception as ex:
        logging.warning(f'Exception downloading file: {cur_file} of: {str(ex)}')
        pass #very lazy and bad way to only download required files

def downloadSweeps(accessurl, sweeps):
    with tqdm(total=(len(sweeps)*len(getVariants()))) as pbar:
        with concurrent.futures.ThreadPoolExecutor(max_workers=32) as executor:
            for sweep in sweeps:
                for variant in getVariants():
                    pbar.update(1)
                    executor.submit(downloadFile, accessurl.format(filename=f'tiles/{sweep}/{variant}') + "&imageopt=1", f'tiles/{sweep}/{variant}')
                    while executor._work_queue.qsize() > 64:
                        time.sleep(0.01)

def downloadFileWithJSONPost(url, file, post_json_str, descriptor):
    global PROXY
    if "/" in file:
        makeDirs(os.path.dirname(file))
    if os.path.exists(file): #skip already downloaded files except idnex.html which is really json possibly wit hnewer access keys?
        logging.debug(f'Skipping json post to url: {url} ({descriptor}) as already downloaded')

    opener = getUrlOpener(PROXY)
    opener.addheaders.append(('Content-Type','application/json'))

    req = urllib.request.Request(url)

    for header in opener.addheaders: #not sure why we can't use the opener itself but it doesn't override it properly
        req.add_header(header[0],header[1])

    body_bytes = bytes(post_json_str, "utf-8")
    req.add_header('Content-Length', len(body_bytes))
    resp = urllib.request.urlopen(req, body_bytes)
    with open(file, 'w', encoding="UTF-8") as the_file:
        the_file.write(resp.read().decode("UTF-8"))
    logging.debug(f'Successfully downloaded w/ JSON post to: {url} ({descriptor}) to: {file}')

def downloadFile(url, file, post_data=None):
    global accessurls
    url = GetOrReplaceKey(url,False)

    if "/" in file:
        makeDirs(os.path.dirname(file))
    if "?" in file:
        file = file.split('?')[0]

    if os.path.exists(file): #skip already downloaded files except idnex.html which is really json possibly wit hnewer access keys?
        logging.debug(f'Skipping url: {url} as already downloaded')
        return
    try:
        _filename,headers = urllib.request.urlretrieve(url, file,None,post_data)
        logging.debug(f'Successfully downloaded: {url} to: {file}')
        return
    except urllib.error.HTTPError as err:
        logging.warning(f'URL error dling {url} of will try alt: {str(err)}')

        # Try again but with different accessurls (very hacky!)
        if "?t=" in url:
            for accessurl in accessurls:
                url2=""
                try:
                    url2=f"{url.split('?')[0]}?{accessurl}"
                    urllib.request.urlretrieve(url2, file)
                    logging.debug(f'Successfully downloaded through alt: {url2} to: {file}')
                    return
                except urllib.error.HTTPError as err:
                    logging.warning(f'URL error alt method tried url {url2} dling of: {str(err)}')
                    pass
        logging.error(f'Failed to succeed for url {url}')
        raise Exception
    logging.error(f'Failed2 to succeed for url {url}')#hopefully not getting here?

def downloadGraphModels(pageid):
    global GRAPH_DATA_REQ
    makeDirs("api/mp/models")

    for key in GRAPH_DATA_REQ:
        file_path = f"api/mp/models/graph_{key}.json"
        downloadFileWithJSONPost("https://my.matterport.com/api/mp/models/graph",file_path, GRAPH_DATA_REQ[key], key)

def downloadAssets(base):
    js_files = ["browser-check",
        "30","46","47","66","79","134","136","143","164","250","251","316","321","356","371","376","383","386","422","423",
        "464","524","525","539","580","584","606","614","666","670","718","721","726","755","764","828","833","838","932","947"]
    language_codes = ["af", "sq", "ar-SA", "ar-IQ", "ar-EG", "ar-LY", "ar-DZ", "ar-MA", "ar-TN", "ar-OM",
     "ar-YE", "ar-SY", "ar-JO", "ar-LB", "ar-KW", "ar-AE", "ar-BH", "ar-QA", "eu", "bg",
     "be", "ca", "zh-TW", "zh-CN", "zh-HK", "zh-SG", "hr", "cs", "da", "nl", "nl-BE", "en",
     "en-US", "en-EG", "en-AU", "en-GB", "en-CA", "en-NZ", "en-IE", "en-ZA", "en-JM",
     "en-BZ", "en-TT", "et", "fo", "fa", "fi", "fr", "fr-BE", "fr-CA", "fr-CH", "fr-LU",
     "gd", "gd-IE", "de", "de-CH", "de-AT", "de-LU", "de-LI", "el", "he", "hi", "hu",
     "is", "id", "it", "it-CH", "ja", "ko", "lv", "lt", "mk", "mt", "no", "pl",
     "pt-BR", "pt", "rm", "ro", "ro-MO", "ru", "ru-MI", "sz", "sr", "sk", "sl", "sb",
     "es", "es-AR", "es-GT", "es-CR", "es-PA", "es-DO", "es-MX", "es-VE", "es-CO",
     "es-PE", "es-EC", "es-CL", "es-UY", "es-PY", "es-BO", "es-SV", "es-HN", "es-NI",
     "es-PR", "sx", "sv", "sv-FI", "th", "ts", "tn", "tr", "uk", "ur", "ve", "vi", "xh",
     "ji", "zu"]
    font_files = ["ibm-plex-sans-100", "ibm-plex-sans-100italic", "ibm-plex-sans-200", "ibm-plex-sans-200italic", "ibm-plex-sans-300",
    "ibm-plex-sans-300italic", "ibm-plex-sans-500", "ibm-plex-sans-500italic", "ibm-plex-sans-600", "ibm-plex-sans-600italic",
    "ibm-plex-sans-700", "ibm-plex-sans-700italic", "ibm-plex-sans-italic", "ibm-plex-sans-regular", "mp-font", "roboto-100", "roboto-100italic",
    "roboto-300", "roboto-300italic", "roboto-500", "roboto-500italic", "roboto-700", "roboto-700italic", "roboto-900", "roboto-900italic",
    "roboto-italic", "roboto-regular"]

    #extension assumed to be .png unless it is .svg or .jpg, for anything else place it in assets
    image_files = ["360_placement_pin_maskH", "chrome", "Desktop-help-play-button.svg", "Desktop-help-spacebar", "edge", "escape", "exterior",
    "exterior_hover", "firefox", "headset-cardboard", "headset-quest", "interior", "interior_hover", "matterport-logo-light.svg",
    "mattertag-disc-128-free.v1", "mobile-help-play-button.svg", "nav_help_360", "nav_help_click_inside", "nav_help_gesture_drag",
    "nav_help_gesture_drag_two_finger", "nav_help_gesture_pinch", "nav_help_gesture_position", "nav_help_gesture_position_two_finger",
    "nav_help_gesture_tap", "nav_help_inside_key", "nav_help_keyboard_all", "nav_help_keyboard_left_right", "nav_help_keyboard_up_down",
    "nav_help_mouse_click", "nav_help_mouse_drag_left", "nav_help_mouse_drag_right", "nav_help_mouse_position_left",
    "nav_help_mouse_position_right", "nav_help_mouse_zoom", "nav_help_tap_inside", "nav_help_zoom_keys", "NoteColor", "NoteIcon", "pinAnchor",
    "puck_256_red", "roboto-700-42_0", "safari", "scope.svg", "showcase-password-background.jpg", "surface_grid_planar_256", "tagbg", "tagmask",
    "vert_arrows"]

    assets = ["css/showcase.css", "css/unsupported_browser.css", "cursors/grab.png", "cursors/grabbing.png", "cursors/zoom-in.png",
    "cursors/zoom-out.png", "locale/strings.json", "css/ws-blur.css"]

    downloadFile(base + "js/showcase.js","js/showcase.js")
    with open(f"js/showcase.js", "r", encoding="UTF-8") as f:
	    showcase_cont = f.read()
    #lets try to extract the js files it might be loading and make sure we know them
    js_extracted = re.findall(r'\.e\(([0-9]{2,3})\)', showcase_cont)
    js_extracted.sort()
    for js in js_extracted:
        if js not in js_files:
            print(f'JS FILE EXTRACTED BUT not known, please file a github issue and tell us to add: {js}.js, will download for you though:)')
            js_files.append(js)

    for image in image_files:
        if not image.endswith(".jpg") and not image.endswith(".svg"):
            image = image + ".png"
        assets.append("images/" + image)
    for js in js_files:
        assets.append("js/" + js + ".js")
    for f in font_files:
        assets.extend(["fonts/" + f + ".woff", "fonts/" + f + ".woff2"])
    for lc in language_codes:
        assets.append("locale/messages/strings_" + lc + ".json")
    with concurrent.futures.ThreadPoolExecutor(max_workers=16) as executor:
        for asset in assets:
            local_file = asset
            if local_file.endswith('/'):
                local_file = local_file    + "index.html"
            executor.submit(downloadFile, f"{base}{asset}", local_file)

def setAccessURLs(pageid):
    global accessurls
    with open(f"api/player/models/{pageid}/files_type2", "r", encoding="UTF-8") as f:
        filejson = json.load(f)
        accessurls.append(filejson["base.url"].split("?")[-1])
    with open(f"api/player/models/{pageid}/files_type3", "r", encoding="UTF-8") as f:
        filejson = json.load(f)
        accessurls.append(filejson["templates"][0].split("?")[-1])

def downloadInfo(pageid):
    assets = [f"api/v1/jsonstore/model/highlights/{pageid}", f"api/v1/jsonstore/model/Labels/{pageid}", f"api/v1/jsonstore/model/mattertags/{pageid}", f"api/v1/jsonstore/model/measurements/{pageid}", f"api/v1/player/models/{pageid}/thumb?width=1707&dpr=1.5&disable=upscale", f"api/v1/player/models/{pageid}/", f"api/v2/models/{pageid}/sweeps", "api/v2/users/current", f"api/player/models/{pageid}/files"]
    with concurrent.futures.ThreadPoolExecutor(max_workers=16) as executor:
        for asset in assets:
            local_file = asset
            if local_file.endswith('/'):
                local_file = local_file    + "index.html"
            executor.submit(downloadFile, f"https://my.matterport.com/{asset}", local_file    )
    makeDirs("api/mp/models")
    with open(f"api/mp/models/graph", "w", encoding="UTF-8") as f:
        f.write('{"data": "empty"}')
    for i in range(1,4):
        downloadFile(f"https://my.matterport.com/api/player/models/{pageid}/files?type={i}", f"api/player/models/{pageid}/files_type{i}")
    setAccessURLs(pageid)

def downloadPics(pageid):
    with open(f"api/v1/player/models/{pageid}/index.html", "r", encoding="UTF-8") as f:
        modeldata = json.load(f)
    with concurrent.futures.ThreadPoolExecutor(max_workers=16) as executor:
        for image in modeldata["images"]:
            executor.submit(downloadFile, image["src"], urlparse(image["src"]).path[1:])

def downloadModel(pageid,accessurl):
    global ADVANCED_DOWNLOAD_ALL
    with open(f"api/v1/player/models/{pageid}/index.html", "r", encoding="UTF-8") as f:
        modeldata = json.load(f)
    accessid = re.search(r'models/([a-z0-9-_./~]*)/\{filename\}', accessurl).group(1)
    makeDirs(f"models/{accessid}")
    os.chdir(f"models/{accessid}")
    downloadUUID(accessurl,modeldata["job"]["uuid"])
    downloadSweeps(accessurl, modeldata["sweeps"])

# Patch showcase.js to fix expiration issue
def patchShowcase():
    global SHOWCASE_INTERNAL_NAME
    with open("js/showcase.js","r",encoding="UTF-8") as f:
        j = f.read()
    j = re.sub(r"\&\&\(!e.expires\|\|.{1,10}\*e.expires>Date.now\(\)\)","",j)
    j = j.replace(f'"/api/mp/','`${window.location.pathname}`+"api/mp/')
    j = j.replace("${this.baseUrl}", "${window.location.origin}${window.location.pathname}")
    j = j.replace('e.get("https://static.matterport.com/geoip/",{responseType:"json",priority:n.RequestPriority.LOW})', '{"country_code":"US","country_name":"united states","region":"CA","city":"los angeles"}')
    with open(f"js/{SHOWCASE_INTERNAL_NAME}","w",encoding="UTF-8") as f:
        f.write(j)
    j = j.replace(f'"POST"','"GET"') #no post requests for external hosted
    with open("js/showcase.js","w",encoding="UTF-8") as f:
        f.write(j)

def drange(x, y, jump):
  while x < y:
    yield float(x)
    x += decimal.Decimal(jump)

KNOWN_ACCESS_KEY=None
def GetOrReplaceKey(url, is_read_key):
    global KNOWN_ACCESS_KEY
    key_regex = r'(t=2\-.+?\-0)'
    match = re.search(key_regex,url)
    if match is None:
        return url
    url_key = match.group(1)
    if KNOWN_ACCESS_KEY is None and is_read_key:
        KNOWN_ACCESS_KEY = url_key
    elif not is_read_key and KNOWN_ACCESS_KEY:
        url = url.replace(url_key, KNOWN_ACCESS_KEY)
    return url

def downloadPage(pageid):
    global ADVANCED_DOWNLOAD_ALL
    makeDirs(pageid)
    os.chdir(pageid)

    ADV_CROP_FETCH = [
            {
                "start":"width=512&crop=1024,1024,",
                "increment":'0.5'
            },
            {
                "start":"crop=512,512,",
               "increment":'0.25'
            }
        ]

    try:
        logging.basicConfig(filename='run_report.log', encoding='utf-8', level=logging.DEBUG,  format='%(asctime)s %(levelname)-8s %(message)s',datefmt='%Y-%m-%d %H:%M:%S')
    except ValueError:
        logging.basicConfig(filename='run_report.log', level=logging.DEBUG,  format='%(asctime)s %(levelname)-8s %(message)s',datefmt='%Y-%m-%d %H:%M:%S')
    logging.debug(f'Started up a download run')
    page_root_dir = os.path.abspath('.')
    print("Downloading base page...")
    r = requests.get(f"https://my.matterport.com/show/?m={pageid}")
    r.encoding = "utf-8"
    staticbase = re.search(r'<base href="(https://static.matterport.com/.*?)">', r.text).group(1)
    match = re.search(r'"(https://cdn-\d*\.matterport\.com/models/[a-z0-9\-_/.]*/)([{}0-9a-z_/<>.]+)(\?t=.*?)"', r.text)
    if match:
        accessurl = f'{match.group(1)}~/{{filename}}{match.group(3)}'
        print(accessurl)
    else:
        raise Exception("Can't find urls")

    file_type_content = requests.get(f"https://my.matterport.com/api/player/models/{pageid}/files?type=3") #get a valid access key, there are a few but this is a common client used one, this also makes sure it is fresh
    GetOrReplaceKey(file_type_content.text,True)
    if ADVANCED_DOWNLOAD_ALL:
        print("Doing advanced download of dollhouse/floorplan data...")
        ## Started to parse the modeldata further.  As it is error prone tried to try catch silently for failures. There is more data here we could use for example:
        ## queries.GetModelPrefetch.data.model.locations[X].pano.skyboxes[Y].tileUrlTemplate
        ## queries.GetModelPrefetch.data.model.locations[X].pano.skyboxes[Y].urlTemplate
        ## queries.GetModelPrefetch.data.model.locations[X].pano.resolutions[Y] <--- has the resolutions they offer for this one
        ## goal here is to move away from some of the access url hacks, but if we are successful on try one won't matter:)

        try:
            match = re.search(r'window.MP_PREFETCHED_MODELDATA = (\{.+?\}\}\});', r.text)
            if match:
                preload_json = json.loads(match.group(1))
                #download dam files
                base_node = preload_json["queries"]["GetModelPrefetch"]["data"]["model"]["assets"]
                for mesh in base_node["meshes"]:
                    try:
                        downloadFile(mesh["url"], urlparse(mesh["url"]).path[1:])#not expecting the non 50k one to work but mgiht as well try
                    except:
                        pass
                for texture in base_node["textures"]:
                    try: #on first exception assume we have all the ones needed
                        for i in range(1000):
                            full_text_url = texture["urlTemplate"].replace("<texture>",f'{i:03d}')
                            crop_to_do = []
                            if texture["quality"] == "high":
                                crop_to_do = ADV_CROP_FETCH
                            for crop in crop_to_do:
                                for x in list(drange(0, 1, decimal.Decimal(crop["increment"]))):
                                    for y in list(drange(0, 1, decimal.Decimal(crop["increment"]))):
                                        xs = f'{x}'
                                        ys = f'{y}'
                                        if xs.endswith('.0'):
                                            xs = xs[:-2]
                                        if ys.endswith('.0'):
                                            ys = ys[:-2]
                                        complete_add=f'{crop["start"]}x{xs},y{ys}'
                                        complete_add_file = complete_add.replace("&","_")
                                        try:
                                            downloadFile(full_text_url + "&" + complete_add, urlparse(full_text_url).path[1:] + complete_add_file + ".jpg")
                                        except:
                                            pass

                            downloadFile(full_text_url, urlparse(full_text_url).path[1:])
                    except:
                        pass
        except:
            pass
    # Automatic redirect if GET param isn't correct
    injectedjs = 'if (window.location.search != "?m=' + pageid + '") { document.location.search = "?m=' + pageid + '"; }'
    content = r.text.replace(staticbase,".").replace('"https://cdn-1.matterport.com/','`${window.location.origin}${window.location.pathname}` + "').replace('"https://mp-app-prod.global.ssl.fastly.net/','`${window.location.origin}${window.location.pathname}` + "').replace("window.MP_PREFETCHED_MODELDATA",f"{injectedjs};window.MP_PREFETCHED_MODELDATA").replace('"https://events.matterport.com/', '`${window.location.origin}${window.location.pathname}` + "')
    content = re.sub(r"validUntil\":\s*\"20[\d]{2}-[\d]{2}-[\d]{2}T","validUntil\":\"2099-01-01T",content)
    with open("index.html", "w", encoding="UTF-8") as f:
        f.write(content )

    print("Downloading static assets...")
    if os.path.exists("js/showcase.js"): #we want to always fetch showcase.js in case we patch it differently or the patching function starts to not work well run multiple times on itself
        os.replace("js/showcase.js","js/showcase-bk.js") #backing up existing showcase file to be safe
    downloadAssets(staticbase)
    # Patch showcase.js to fix expiration issue and some other changes for local hosting
    patchShowcase()
    print("Downloading model info...")
    downloadInfo(pageid)
    print("Downloading images...")
    downloadPics(pageid)
    print("Downloading graph model data...")
    downloadGraphModels(pageid)
    print(f"Downloading model... access url: {accessurl}")
    downloadModel(pageid,accessurl)
    os.chdir(page_root_dir)
    open("api/v1/event", 'a').close()
    print("Done!")

def initiateDownload(url):
    downloadPage(getPageId(url))
def getPageId(url):
    return url.split("m=")[-1].split("&")[0]

class OurSimpleHTTPRequestHandler(SimpleHTTPRequestHandler):
    def send_error(self, code, message=None):
        if code == 404:
            logging.warning(f'404 error: {self.path} may not be downloading everything right')
        SimpleHTTPRequestHandler.send_error(self, code, message)

    def do_GET(self):
        global SHOWCASE_INTERNAL_NAME
        redirect_msg=None
        orig_request = self.path
        if self.path.startswith("/js/showcase.js") and os.path.exists(f"js/{SHOWCASE_INTERNAL_NAME}"):
            redirect_msg = "using our internal showcase.js file"
            self.path = f"/js/{SHOWCASE_INTERNAL_NAME}"

        if self.path.startswith("/locale/messages/strings_") and not os.path.exists(f".{self.path}"):
            redirect_msg = "original request was for a locale we do not have downloaded"
            self.path = "/locale/strings.json"
        raw_path, _, query = self.path.partition('?')
        if "crop=" in query and raw_path.endswith(".jpg"):
            query_args = urllib.parse.parse_qs(query)
            crop_addition = query_args.get("crop", None)
            if crop_addition is not None:
                crop_addition = f'crop={crop_addition[0]}'
            else:
                crop_addition = ''

            width_addition = query_args.get("width", None)
            if width_addition is not None:
                width_addition = f'width={width_addition[0]}_'
            else:
                width_addition = ''
            test_path = raw_path + width_addition + crop_addition + ".jpg"
            if os.path.exists(f".{test_path}"):
                self.path = test_path
                redirect_msg = "dollhouse/floorplan texture request that we have downloaded, better than generic texture file"
        if redirect_msg is not None or orig_request != self.path:
            logging.info(f'Redirecting {orig_request} => {self.path} as {redirect_msg}')

        SimpleHTTPRequestHandler.do_GET(self)
        return;
    def do_POST(self):
        post_msg=None
        try:
            if self.path == "/api/mp/models/graph":
                self.send_response(200)
                self.end_headers()
                content_len = int(self.headers.get('content-length'))
                post_body = self.rfile.read(content_len).decode('utf-8')
                json_body = json.loads(post_body)
                option_name = json_body["operationName"]
                if option_name in GRAPH_DATA_REQ:
                    file_path = f"api/mp/models/graph_{option_name}.json"
                    if os.path.exists(file_path):
                        with open(file_path, "r", encoding="UTF-8") as f:
                            self.wfile.write(f.read().encode('utf-8'))
                            post_msg=f"graph of operationName: {option_name} we are handling internally"
                            return;
                    else:
                        post_msg=f"graph for operationName: {option_name} we don't know how to handle, but likely could add support, returning empty instead"

                self.wfile.write(bytes('{"data": "empty"}', "utf-8"))
                return
        except Exception as error:
            post_msg = f"Error trying to handle a post request of: {str(error)} this should not happen"
            pass
        finally:
            if post_msg is not None:
                logging.info(f'Handling a post request on {self.path}: {post_msg}')

        self.do_GET() #just treat the POST as a get otherwise:)

    def guess_type(self, path):
        res = SimpleHTTPRequestHandler.guess_type(self, path)
        if res == "text/html":
            return "text/html; charset=UTF-8"
        return res

PROXY=False
ADVANCED_DOWNLOAD_ALL=False

GRAPH_DATA_REQ = {}

def openDirReadGraphReqs(path,pageId):
    for root, dirs, filenames in os.walk(path):
        for file in filenames:
            with open(os.path.join(root, file), "r", encoding="UTF-8") as f:
                GRAPH_DATA_REQ[file.replace(".json","")] = f.read().replace("[MATTERPORT_MODEL_ID]",pageId)

def getUrlOpener(use_proxy):
    if (use_proxy):
        proxy = urllib.request.ProxyHandler({'http': use_proxy,'https': use_proxy})
        opener = urllib.request.build_opener(proxy)
    else:
        opener = urllib.request.build_opener()
    opener.addheaders = [('User-Agent','Mozilla/5.0 (Windows NT 10.0; Win64; x64)'),('x-matterport-application-name','showcase')]
    return opener

def getCommandLineArg(name, has_value):
    for i in range(1,len(sys.argv)):
        if sys.argv[i] == name:
            sys.argv.pop(i)
            if has_value:
                return sys.argv.pop(i)
            else:
                return True
    return False

if __name__ == "__main__":
    ADVANCED_DOWNLOAD_ALL = getCommandLineArg("--advanced-download", False)
    PROXY = getCommandLineArg("--proxy", True)
    OUR_OPENER = getUrlOpener(PROXY)
    urllib.request.install_opener(OUR_OPENER)
    pageId = ""
    if len(sys.argv) > 1:
        pageId = getPageId(sys.argv[1])
    openDirReadGraphReqs("graph_posts",pageId)
    if len(sys.argv) == 2:
        initiateDownload(pageId)
    elif len(sys.argv) == 4:
        os.chdir(getPageId(pageId))
        try:
            logging.basicConfig(filename='server.log', encoding='utf-8', level=logging.DEBUG,  format='%(asctime)s %(levelname)-8s %(message)s',datefmt='%Y-%m-%d %H:%M:%S')
        except ValueError:
            logging.basicConfig(filename='server.log', level=logging.DEBUG,  format='%(asctime)s %(levelname)-8s %(message)s',datefmt='%Y-%m-%d %H:%M:%S')
        logging.info("Server started up")
        print ("View in browser: http://" + sys.argv[2] + ":" + sys.argv[3])
        httpd = HTTPServer((sys.argv[2], int(sys.argv[3])), OurSimpleHTTPRequestHandler)
        httpd.serve_forever()
    else:
        print (f"Usage:\n\tFirst Download: matterport-dl.py [url_or_page_id]\n\tThen launch the server 'matterport-dl.py [url_or_page_id] 127.0.0.1 8080' and open http://127.0.0.1:8080 in a browser\n\t--proxy 127.0.0.1:1234 -- to have it use this web proxy\n\t--advanced-download -- Use this option to try and download the cropped files for dollhouse/floorplan support")

repo_language: Python


text:
# matterport-dl
A tool to download/archive [Matterport](https://matterport.com) virtual tours.  Supports most matterport virtual tour links ( ie https://my.matterport.com/show/?m=roWLLMMmPL8 ). This project is not in any way associated with or supported by matterport.com in any way. It supports offline viewing of virtual tours and most tour features including: Walking/browsing the tour using mouse or keyboard.  Virtual reality supported tours.   Measuring items within the tour.  Information nodes and popup data.  Dollhouse* and floorplan* views (see "Advanced Options" section below).

# Usage

1. Install Python 3.6 or higher.
2. Download the files from this repository (click Code button near upper right and click download zip).
3. Extract these files to a local folder.
4. Archive a virtual tour by running `matterport-dl.py [url_or_page_id]`, you may need to use `python3 matterport-dl.py ...` or `python matterport-dl.py ...` instead.
5. Revisit an archived virtual tour by running `matterport-dl.py [url_or_page_id] 127.0.0.1 8080` and visiting http://127.0.0.1:8080 in a browser.

# Advanced Options
-   Add `--proxy 127.0.0.1:1234` to a download run to use a proxy for requests
-   Add `--advanced-download` to a download run to try and download the needed textures and files for supporting dollhouse/floorplan views.  NOTE: Must use built in webserver to host content for this to work.

# Additional Notes
* It is possible to host these Matterport archives using standard web servers however: 1) Certain features beyond the tour itself may not work.  2)  #1 may be fixable by specific rewrite rules for apache/nginx.  These are not currently provided but if you look at `OurSimpleHTTPRequestHandler` class near the bottom of the source file you can likely figure out what redirects we do.

* As improvements are made to the script you can often upgrade old archives but simply running the script again.  Any existing files downloaded are generally skipped so it will run much faster.  This is not a guarantee so backup your important archives first.

* As matterport changes their code things will likely need to be updated in the script. A good place to start is looking at the server.log file for any lines that say "404 error" in them, these are likely additional files we need to download for the archive to work.

# [Reddit thread](https://www.reddit.com/r/DataHoarder/comments/nycjj4/release_matterportdl_a_tool_for_archiving/)

mime_type: text/plain


text:
# CYBERPUNK
a list of cyberpunk stuff

### Collaborate:
- diffs over email (figure out).
- PR over Github.
- [honk](https://honk.x61.sh/) me.
- [elon](https://twitter.com/x61sh) me.

### Mirrors:
- [sourcehut](https://git.sr.ht/~gonzalo/cyberpunk)
- [codeberg](https://codeberg.org/gonzalo/cyberpunk)

![CyberPunk Logo](/wallpapers/teufelsberg.png)

## Table of Contents
- [CYBERPUNK](#cyberpunk)
    - [Collaborate](#collaborate)
    - [Mirrors](#mirrors)
- [Anime](#anime)
- [Art](#art)
- [Books](#books)
- [Code/Software](#code)
- [Comics](#comics)
- [Hardware](#hardware)
- [Magazines](#magazines)
- [Manga](#manga)
- [Movies](#movies)
- [Music](#music)
- [Podcasts](#podcasts)
- [Social](#social)
- [TV Shows](#tv-shows)
- [Texts](#texts)
- [Video Games](#video-games)
- [Videos](#videos)
- [WWW](#www)
- [Wallpapers](/wallpapers/)
- [Wearable](#wearable)

## Movies
* [Ghost in the Shell](https://www.imdb.com/title/tt1219827/): In the near future, Major Mira Killian is the first of her kind: A human saved from a terrible crash, who is cyber-enhanced to be a perfect soldier devoted to stopping the world's most dangerous criminals.
* [Gamer](https://www.imdb.com/title/tt1034032/):  In a future mind-controlling game, death row convicts are forced to battle in a 'Doom'-type environment. Convict Kable, controlled by Simon, a skilled teenage gamer, must survive thirty sessions in order to be set free.
* [Alita: Battle Angel](https://www.imdb.com/title/tt0437086/):  A deactivated cyborg's revived, but can't remember anything of her past and goes on a quest to find out who she is.
* [Blade Runner](https://www.imdb.com/title/tt0083658/): A blade runner must pursue and terminate four replicants who stole a ship in space, and have returned to Earth to find their creator.
* [Blade Runner 2049](https://www.imdb.com/title/tt1856101):  Young Blade Runner K's discovery of a long-buried secret leads him to track down former Blade Runner Rick Deckard, who's been missing for thirty years.
* The Matrix:
  - [The Matrix](https://www.imdb.com/title/tt0133093): When a beautiful stranger leads computer hacker Neo to a forbidding underworld, he discovers the shocking truth--the life he knows is the elaborate deception of an evil cyber-intelligence.
  - [The Matrix Reloaded](https://www.imdb.com/title/tt0234215/): Freedom fighters Neo, Trinity and Morpheus continue to lead the revolt against the Machine Army, unleashing their arsenal of extraordinary skills and weaponry against the systematic forces of repression and exploitation.
  - [The Matrix Revolutions](https://www.imdb.com/title/tt0242653/): The human city of Zion defends itself against the massive invasion of the machines as Neo fights to end the war at another front while also opposing the rogue Agent Smith.
* [Ready Player One](https://www.imdb.com/title/tt1677720/): When the creator of a virtual reality called the OASIS dies, he makes a posthumous challenge to all OASIS users to find his Easter Egg, which will give the finder his fortune and control of his world.
* [Upgrade](https://www.imdb.com/title/tt6499752): Set in the near-future, technology controls nearly all aspects of life. But when the world of Grey, a self-labeled technophobe, is turned upside down, his only hope for revenge is an experimental computer chip implant.
* [The Fifth Element](https://www.imdb.com/title/tt0119116/): In the colorful future, a cab driver unwittingly becomes the central figure in the search for a legendary cosmic weapon to keep Evil and Mr. Zorg at bay.
* [Minority Report](https://www.imdb.com/title/tt0181689/): In a future where a special police unit is able to arrest murderers before they commit their crimes, an officer from that unit is himself accused of a future murder.
* [Oblivion](https://www.imdb.com/title/tt1483013/): A veteran assigned to extract Earth's remaining resources begins to question what he knows about his mission and himself.
* TRON:
  - [TRON](https://www.imdb.com/title/tt0084827/): A computer hacker is abducted into the digital world and forced to participate in gladiatorial games where his only chance of escape is with the help of a heroic security program.
  - [TRON: Legacy](https://www.imdb.com/title/tt1104001/):  The son of a virtual world designer goes looking for his father and ends up inside the digital world that his father designed. He meets his father's corrupted creation and a unique ally who was born inside the digital world.
* [Looper](https://www.imdb.com/title/tt1276104/): In 2074, when the mob wants to get rid of someone, the target is sent into the past, where a hired gun awaits - someone like Joe - who one day learns the mob wants to 'close the loop' by sending back Joe's future self for assassination.
* [Total Recall](https://www.imdb.com/title/tt0100802/): When a man goes for virtual vacation memories of the planet Mars, an unexpected and harrowing series of events forces him to go to the planet for real - or is he?
* [Total Recall (remake)](https://www.imdb.com/title/tt1386703/): A factory worker, Douglas Quaid, begins to suspect that he is a spy after visiting Rekall - a company that provides its clients with implanted fake memories of a life they would like to have led - goes wrong and he finds himself on the run.
* [Elysium](https://www.imdb.com/title/tt1535108/): In the year 2154, the very wealthy live on a man-made space station while the rest of the population resides on a ruined Earth. A man takes on a mission that could bring equality to the polarized worlds.
* [Chappie](https://www.imdb.com/title/tt1823672/): In the near future, crime is patrolled by a mechanized police force. When one police droid, Chappie, is stolen and given new programming, he becomes the first robot with the ability to think and feel for himself.
* [A.I. Artificial Intelligence](https://www.imdb.com/title/tt0212720/): A highly advanced robotic boy longs to become "real" so that he can regain the love of his human mother.
* [Equilibrium](https://www.imdb.com/title/tt0238380/): In an oppressive future where all forms of feeling are illegal, a man in charge of enforcing the law rises to overthrow the system and state.
* Dredd:
  - [Judge Dredd](https://www.imdb.com/title/tt0113492/): In a dystopian future, Joseph Dredd, the most famous Judge (a police officer with instant field judiciary powers), is convicted for a crime he did not commit and must face his murderous counterpart.
  - [Dredd](https://www.imdb.com/title/tt1343727/): In a violent, futuristic city where the police have the authority to act as judge, jury and executioner, a cop teams with a trainee to take down a gang that deals the reality-altering drug, SLO-MO.
* [I, Robot](https://www.imdb.com/title/tt0343818/): In 2035, a technophobic cop investigates a crime that may have been perpetrated by a robot, which leads to a larger threat to humanity.
* [Love, Death & Robots](https://www.imdb.com/title/tt9561862/): A collection of animated short stories that span various genres including science fiction, fantasy, horror and comedy.
* [Fortress](https://www.imdb.com/title/tt0106950/): In a future, private underground prison/Fortress, the inmates are computer controlled with CCTV, dream readers and devices that can cause pain or death. John and his illegally pregnant wife are inside but want to escape before birth.
* [Cyborg 2](https://www.imdb.com/title/tt0106639): Two companies battle for Cyborg domination. One's built a cyborg so human, that they hope, she'll get into the competition's HQ and explode. But she escapes with her human martial arts instructor.
* [Grid Runners](https://www.imdb.com/title/tt0113220): _A border cop must defeat the virtual reality warrior while learning to relate to one of the cybersex babes._
* [Avalon](https://www.imdb.com/title/tt0099073/): A Polish-Jewish family comes to the U.S. at the beginning of the twentieth century. There, the family and their children try to make themselves a better future in the so-called promised land.
* [Until the end of the world](https://www.imdb.com/title/tt0101458/): In 1999, Claire's life is forever changed after she survives a car crash. She rescues Sam and starts traveling around the world with him. Writer Eugene follows them and writes their story, as a way of recording dreams is being invented.
* [Hardware](https://www.imdb.com/title/tt0099740): The head of a cyborg reactivates, rebuilds itself, and goes on a violent rampage in a space marine's girlfriend's apartment.
* [Cyberpunk (90's documentary)](https://www.imdb.com/title/tt0398910/): Stylistic documentary about the cyberpunk movement. William Gibson, author of cyberpunk classic Neuromancer, and Timothy Leary, famous advocate of psychedelic drugs, share their thoughts on the future of society and technology.
* [Techno Warriors](https://www.imdb.com/title/tt0256428): _No synopsis._
* [Cypher](https://www.imdb.com/title/tt0284978/):  An unsuspecting, disenchanted man finds himself working as a spy in the dangerous, high-stakes world of corporate espionage. Quickly getting way over-his-head, he teams up with a mysterious femme fatale.
* [New Rose Hotel](https://www.imdb.com/title/tt0133122/):  Two businessmen are hired to steal secrets from a rival, and decide to use a beautiful call girl to do so.
* [Webmaster](https://www.imdb.com/title/tt0136535/): _After hacking into the most powerful of all domains the Stoiser domain, JB thought that the cruel Stoiser would kill him. But instead he gave him a job - as a webmaster._
* [Gattaca](https://www.imdb.com/title/tt0119177): A genetically inferior man assumes the identity of a superior one in order to pursue his lifelong dream of space travel.
* [Brazil](https://www.imdb.com/title/tt0088846/): A bureaucrat in a dystopic society becomes an enemy of the state as he pursues the woman of his dreams.
* [Zero Theorem](https://www.imdb.com/title/tt2333804/): A hugely talented but socially isolated computer operator is tasked by Management to prove the Zero Theorem: that the universe ends as nothing, rendering life meaningless. But meaning is what he already craves.
* [13th Floor](https://www.imdb.com/title/tt8978542/): _No synopsis._
* [Nirvana](https://www.imdb.com/title/tt0119794): The main character Solo in Nirvana, a computer game developed by Jimi for release in 3 days, has gained self-awareness after a virus attack. Solo wants to be deleted. Jimi wants to find his ex.
* [Johnny Mnemonic](https://www.imdb.com/title/tt0113481/): A data courier, literally carrying a data package inside his head, must deliver it before he dies from the burden or is killed by the Yakuza.
* [Strange days](https://www.imdb.com/title/tt0114558/): A former cop turned street-hustler accidentally uncovers a conspiracy in Los Angeles in 1999.
* [Lawnmower Man](https://www.imdb.com/title/tt0116839/): _No synopsis._
* [Dark city](https://www.imdb.com/title/tt0118929/): A man struggles with memories of his past, which includes a wife he cannot remember, and a nightmarish world, no one else seems to be waking up from.
* [La Jetée](https://www.imdb.com/title/tt0056119/): The story of a man forced to explore his memories in the wake of World War III's devastation, told through still images.
* [Metropolis (1927)](https://en.m.wikipedia.org/wiki/Metropolis_(1927_film)): In the future, in the Million-acre city of Metropolis, wealthy industrialists and business magnates and their top employees reign from 50 to 1,000-story skyscrapers, while underground-dwelling workers toil to operate the great machines that power the city.
* [Hackers](https://www.imdb.com/title/tt0113243/): Hackers are blamed for making a virus that will capsize five oil tankers.
* [Technotise: Edit and I](https://en.wikipedia.org/wiki/Technotise:_Edit_%26_I): Edit, a psychology student, installs herself a stolen military chip to pass the university. But due certain circumstances Edit develops a second personality.
* [Space Sweepers](https://www.imdb.com/title/tt12838766/): Year 2092 and follows the crew of a space junk collector ship called The Victory.
* [Kamikaze](https://www.imdb.com/title/tt0084191)
* [Hands of Steel](https://www.imdb.com/title/tt0091166/)
* [Class of 1999](https://www.imdb.com/title/tt0099277/)
* [Crime Zone](https://www.imdb.com/title/tt0094918/)
* [Full Metal Yakuza](https://www.imdb.com/title/tt0299910/)
* [2047: Virtual Revolution](https://www.imdb.com/title/tt4054004/): In a future mega city, where most people spend most time hooked up to a virtual world.
* [Advantageous](https://www.imdb.com/title/tt3090670/): In a near-future city where soaring opulence overshadows economic hardship.
* [Ares](https://www.imdb.com/title/tt4216902/): In a future France with many unemployed, big companies run the country.
* [Finch](https://www.imdb.com/title/tt3420504/): On a post-apocalyptic Earth, a robot, built to protect the life of his creator's beloved dog.
* [Anon (2018)](https://www.imdb.com/title/tt5397194/): In a world without anonymity or crime, a detective meets a woman who threatens their security.

## Podcasts
* [Compromised](https://player.fm/series/compromised)
* [Cyberpunk Librarian](https://cyberpunklibrarian.com/)
* [Cyberpunk News](https://cyberpunknews.com/category/podcast/)
* [Cyberpunk Radio](https://www.cyberpunk-radio.de/)
* [Cyberpunk Red](https://cyberpunkred.net/)
* [Cyberpunk Uncensored](https://player.fm/series/cyberpunk-uncensored)
* [Cyberpunk](https://www.bbc.co.uk/programmes/p06msxvh)
* [Cyberpunks and Lizards](https://www.podchaser.com/podcasts/cyberpunks-and-lizards-1652004)
* [Dark Future Dice | A Cyberpunk 2020](https://player.fm/series/dark-future-dice-a-cyberpunk-2020-podcast)
* [Defense One](https://www.defenseone.com/topic/podcast/)
* [Flash Forward Pod](https://www.flashforwardpod.com/)
* [Hack a day](https://open.spotify.com/show/3NRV0mhZa8xeRT0EyLPaIp)
* [Host in the Shell](https://hostsintheshell.buzzsprout.com/)
* [Inside Skunk Works](https://www.lockheedmartin.com/en-us/who-we-are/business-areas/aeronautics/skunkworks/insideskunkworks.html)
* [Jovem Nerd](https://www.jovemnerd.com.br/playlist/rpg-cyberpunk/)
* [Megacorp](https://open.spotify.com/show/4i5u3yip3lCdRr9HM3s9rL)
* [Moonshot](https://moonshot.audio/)
* [Neo-Anarchist Podcast](http://neo-anarchist.com/)
* [NeoScum: A Shadowrun Actual Play Podcast](https://neoscum.com/)
* [Nerd Noise Radio](https://nerdnoiseradio.blogspot.com/)
* [Omega Tau](https://omegataupodcast.net/)
* [Planetary Radio](https://www.planetary.org/planetary-radio)
* [Radio Free Cybertron: The Transformers Podcast](https://www.tfradio.net/)
* [Robohub](https://robohub.org/podcast/)
* [Sleeping Situation](https://sleepingsituation.com/)
* [Tales from the afternow](http://rantmedia.ca/afternow/)
* [Talking to Ghosts](http://talkingtoghosts.com/)
* [The Andi-Dystopians](https://open.spotify.com/show/7c1sNJ20U6xEEr628KMJZK)
* [The Arcology Podcast](http://arcologypodcast.com/)
* [The GOGP Show](https://gog.show/)
* [The Leviathan Chronicles](https://www.leviathanchronicles.com/)
* [The Neon Streets](https://player.fm/series/the-neon-streets)
* [The RetroBlasting Star Wars Collecting Show](http://www.retroblasting.com/)
* [The Sixth World Podcast](http://sixthworldpodcast.blogspot.com/)
* [Titans of nuclear](https://www.titansofnuclear.com/)

## Social
* [Cyberpunk Forums](https://cyberpunkforums.com)
* [Freeradical](https://freeradical.zone/about)
* [Cybre.space](https://cybre.space/about)
* [Glitch Social](https://glitch.social/about)
* [Pleroma/Soykaf](https://pleroma.soykaf.com/main/all)

## TV Shows
* [Aeon Flux](https://www.imdb.com/title/tt0111873/)
* [Almost Human](https://www.imdb.com/title/tt2654580/)
* [Altered Carbon](https://www.imdb.com/title/tt2261227/)
* [Battlestar Galactica](https://www.imdb.com/title/tt0407362/)
* [Black Mirror](https://www.imdb.com/title/tt2085059/)
* [Blade Runner: Black Lotus](https://www.imdb.com/title/tt12672962/)
* [Caprica](https://www.imdb.com/title/tt0799862/)
* [Continuum](https://www.imdb.com/title/tt1954347/)
* [Cowboy Bebop (Live Action)](https://www.imdb.com/title/tt1267295/)
* [Cyber City Oedo 808](https://www.imdb.com/title/tt0106626/)
* [Cyberpunk: Edgerunners](https://www.imdb.com/title/tt12469742/)
* [Dark](https://www.imdb.com/title/tt5753856/)
* [Devs](https://www.imdb.com/title/tt8134186/)
* [Dollhouse](https://www.imdb.com/title/tt1135300/)
* [Electric Dreams](https://www.imdb.com/title/tt5711280/)
* [Firefly](https://www.imdb.com/title/tt0303461/)
* [Fringe](https://www.imdb.com/title/tt1119644/)
* [Humans](https://www.imdb.com/title/tt4122068/)
* [Love, Death & Robots](https://www.imdb.com/title/tt9561862/)
* [Mr. Robot](https://www.imdb.com/title/tt4158110/)
* [Sense8](https://www.imdb.com/title/tt2431438/)
* [Stargate SG-1](https://www.imdb.com/title/tt0118480/)
* [The Expanse](https://www.imdb.com/title/tt3230854/)
* [Westworld](https://www.imdb.com/title/tt0475784/)

## Anime
* [009 Re: Cyborg](https://www.imdb.com/title/tt2078523/)
* [8 Man After (Cyber Desesperado](https://www.imdb.com/title/tt0124971/)
* [964 Pinocchio](https://www.imdb.com/title/tt0225009/)
* [AD Police File 1: The Phantom Woman (Voomer Madness)](https://www.imdb.com/title/tt0088655/)
* [AD Police File 2: The Ripper (The Paradise Loop](https://www.imdb.com/title/tt0088656/)
* [AD Police File 3: The Man Who Bites His Tongue (I Want Medicine...](https://www.imdb.com/title/tt0088657/)
* [AD Police: To Protect And Serve](https://www.imdb.com/title/tt0189238/)
* [Aeon Flux](https://www.imdb.com/title/tt0111873/)
* [Akira](https://www.imdb.com/title/tt0094625/)
* [Akudama Drive](https://www.imdb.com/title/tt12331342/)
* [Altered Carbon: Resleeved](https://www.imdb.com/title/tt9310328/)
* [Andromedia](https://www.imdb.com/title/tt0303658/)
* [Angel Cop](https://www.imdb.com/title/tt0096816/)
* [Appleseed](https://www.imdb.com/title/tt0094668/)
* [Appleseed](https://www.imdb.com/title/tt0401233/)
* [Appleseed Alpha](https://www.imdb.com/title/tt3638012/)
* [Appleseed XIII](https://www.imdb.com/title/tt1756988/)
* [Appleseed XIII: Tartaros](https://www.imdb.com/title/tt4232272/)
* [Appleseed: Ex Machina](https://www.imdb.com/title/tt1043842/)
* [Armitage III](https://www.imdb.com/title/tt0366186/)
* [Armitage III: Poly-Matrix](https://www.imdb.com/title/tt0109151/)
* [Armitage: Dual Matrix](https://www.imdb.com/title/tt0303678/)
* [Astro Boy](https://www.imdb.com/title/tt0375568/)
* [Avalon](https://www.imdb.com/title/tt0267287)
* [Bionic Six](https://www.imdb.com/title/tt0092323/)
* [Black Magic M-66](https://www.imdb.com/title/tt0092664/)
* [Blade Runner: Black Lotus](https://www.imdb.com/title/tt9359796/)
* [Blame!](https://www.imdb.com/title/tt6574146/)
* [Breaker](https://www.imdb.com/title/tt6857848/)
* [Bubblegum Crash](https://www.imdb.com/title/tt0101514/)
* [Bubblegum Crisis](https://www.imdb.com/title/tt0088863/)
* [Bubblegum Crisis: Tokyo 2040](https://www.imdb.com/title/tt0175385/)
* [Burst City](https://www.imdb.com/title/tt0083609/)
* [Casshern Sins](https://www.imdb.com/title/tt0235119/)
* [Cowboy Bebop](https://www.imdb.com/title/tt0213338/)
* [Cowboy Bebop: The Movie](https://www.imdb.com/title/tt0275277/)
* [Cybernetics Guardian](https://www.imdb.com/title/tt0097137/)
* [Cyberpunk: Edgerunners](https://www.imdb.com/title/tt12590266/)
* [Cybersix](https://www.imdb.com/title/tt0211793/)
* [Cyborg 009](https://www.imdb.com/title/tt0060926/)
* [Cyborg 009](https://www.imdb.com/title/tt0188327/)
* [Cyborg 009](https://www.imdb.com/title/tt0372650/)
* [Cyborg 009: Call Of Justice ](https://www.imdb.com/title/tt6921524/)
* [Cyborg 009: Call Of Justice I](https://www.imdb.com/title/tt5894272/)
* [Cyborg 009: Call Of Justice II](https://www.imdb.com/title/tt5894274/)
* [Cyborg 009: Call Of Justice III](https://www.imdb.com/title/tt5894276/)
* [Cyborg Girl](https://www.imdb.com/title/tt0929860/)
* [Dead Or Alive: Final](https://www.imdb.com/title/tt0301167/)
* [Dimension W](https://www.imdb.com/title/tt5334292/)
* [Dirty Pair: Project Eden](https://www.imdb.com/title/tt0088507/)
* [Dominion Tank Police](https://www.imdb.com/title/tt0158591/)
* [DRAMAtical Murder](https://www.imdb.com/title/tt3639836/)
* [DRAMAtical Murder: Data_xx_Transitory](https://www.imdb.com/title/tt5540572/)
* [Ergo Proxy](https://www.imdb.com/title/tt0791205/)
* [Exaella](https://www.imdb.com/title/tt2160163/)
* [Fragile Machine](https://www.imdb.com/title/tt0455951/)
* [Genocyber](https://www.imdb.com/title/tt0158634/)
* [Ghost In The Shell](https://www.imdb.com/title/tt0113568/)
* [Ghost In The Shell 2.0](https://www.imdb.com/title/tt1260502/)
* [Ghost In The Shell 2: Innocence](https://www.imdb.com/title/tt0347246/)
* [Ghost In The Shell Arise: Border 5 - Pyrophoric Cult](https://www.imdb.com/title/tt5973984)
* [Ghost In The Shell: Arise - Ghost Pain](https://www.imdb.com/title/tt2636124/)
* [Ghost In The Shell: Arise - Ghost Stands Alone](https://www.imdb.com/title/tt4016942/)
* [Ghost In The Shell: Arise - Ghost Tears](https://www.imdb.com/title/tt3579524/)
* [Ghost In The Shell: Arise - Ghost Whispers](https://www.imdb.com/title/tt3017864/)
* [Ghost in the Shell: S.A.C. 2nd GIG - Individual Eleven](https://www.imdb.com/title/tt1024214/)
* [Ghost In The Shell: SAC_2045](https://www.imdb.com/title/tt9466298/)
* [Ghost In The Shell: SAC_2045(Movie)](https://www.imdb.com/title/tt15392166/)
* [Ghost In The Shell: Solid State Society](https://www.imdb.com/title/tt0856797/)
* [Ghost In The Shell: Stand Alone Complex](https://www.imdb.com/title/tt0346314/)
* [Ghost in the Shell: Stand Alone Complex - The Laughing Man](https://www.imdb.com/title/tt1024215/)
* [Ghost In The Shell: The New Movie](https://www.imdb.com/title/tt4337072/)
* [Goku Midnight Eye](https://www.imdb.com/title/tt0097445/)
* [Grey Digital Target](https://www.imdb.com/title/tt0093118/)
* [Guinea Pig: Android of Notre Dame](https://www.imdb.com/title/tt0161633/)
* [Gundress](https://www.imdb.com/title/tt0331508/)
* [Gunhed](https://www.imdb.com/title/tt0097410/)
* [Gunslinger Girl](https://www.imdb.com/title/tt0476042/)
* [Harmony](https://www.imdb.com/title/tt3615204/)
* [Heat Guy J](https://www.imdb.com/title/tt0395393/)
* [Ingress: The Animation](https://www.imdb.com/title/tt9561968/)
* [Lady Battle Cop](https://www.imdb.com/title/tt0188804/)
* [Macross Plus](https://www.imdb.com/title/tt0110426/)
* [Malice@Doll](https://www.imdb.com/title/tt0363277/)
* [Mega Man](https://www.imdb.com/title/tt0165046/)
* [Megalo Box](https://www.imdb.com/title/tt7965802/)
* [Megazone 23 - Part 1](https://www.imdb.com/title/tt0160521/)
* [Megazone 23 - Part 2](https://www.imdb.com/title/tt0160522/)
* [Megazone 23 - Part 3](https://www.imdb.com/title/tt0160523/)
* [Metropolis](https://www.imdb.com/title/tt0293416/)
* [Neo Tokyo](https://www.imdb.com/title/tt0185481/)
* [Neon Genesis Evangelion](https://www.imdb.com/title/tt0112159/)
* [Neon Genesis Evangelion: The End Of Evangelion](https://www.imdb.com/title/tt0169858/)
* [Pale Cocoon](https://www.imdb.com/title/tt1506448/)
* [Paprika](https://www.imdb.com/title/tt0851578/)
* [Patlabor 2: The Movie](https://www.imdb.com/title/tt0124770/)
* [Patlabor: The Movie](https://www.imdb.com/title/tt0100339/)
* [Project ARMS](https://www.imdb.com/title/tt0429416/)
* [Psycho-Pass](https://www.imdb.com/title/tt2379308/)
* [Psycho-Pass 3: First Inspector](https://www.imdb.com/title/tt11433874/)
* [Psycho-Pass: The Movie](https://www.imdb.com/title/tt4219130/)
* [Real Drive](https://www.imdb.com/title/tt1213889/)
* [Returner](https://www.imdb.com/title/tt0339579/)
* [RoboGeisha](https://www.imdb.com/title/tt1381512/)
* [Robot Carnival](https://www.imdb.com/title/tt0093871/)
* [Robot Detective (Robotto keiji](https://www.imdb.com/title/tt0182628/)
* [Screamers](https://www.imdb.com/title/tt0114367)
* [Serial Experiments: Lain](https://www.imdb.com/title/tt0500092/)
* [Silent Mobius](https://www.imdb.com/title/tt0250921/)
* [Silent Mobius 2](https://www.imdb.com/title/tt0160869/)
* [Sin: The Movie](https://www.imdb.com/title/tt0253709/)
* [Summer Wars](https://www.imdb.com/title/tt1474276/)
* [Space Cobra](https://www.imdb.com/title/tt0235138/)
* [Space The Animation](https://www.imdb.com/title/tt2454264/)
* [Sword Art Online The Movie: Ordinal Scale](https://www.imdb.com/title/tt5544384/)
* [Techno Police 21C](https://www.imdb.com/title/tt0084774/)
* [Texhnolyze](https://www.imdb.com/title/tt0409630/)
* [The Animatrix](https://www.imdb.com/title/tt0328832/)
* [The Mobile Cop Jiban (Mobile Sheriff Jiban](https://www.imdb.com/title/tt0185812/)
* [Time Of Eve](https://www.imdb.com/title/tt1506339/)
* [Un-Go](https://www.imdb.com/title/tt2127216/)
* [Vexille](https://www.imdb.com/title/tt0970472/)
* [Virus Buster Serge](https://www.imdb.com/title/tt0421480/)
* [Viper's Creed](https://www.imdb.com/title/tt2033910/)
* [WXIII: Patlabor the Movie 3](https://www.imdb.com/title/tt0318819/)

## Manga
* [20th Century Boys](https://en.wikipedia.org/wiki/20th_Century_Boys)
* [A.D. Police Files](https://en.wikipedia.org/wiki/A.D._Police_Files#Manga)
* [ARMS](https://en.wikipedia.org/wiki/ARMS_(manga))
* [AR∀GO](https://en.wikipedia.org/wiki/AR%C2%80GO)
* [Abara](https://en.wikipedia.org/wiki/Abara)
* [Akira](https://en.wikipedia.org/wiki/Akira_(manga))
* [Akumetsu](https://en.wikipedia.org/wiki/Akumetsu)
* [All you need is kill](https://en.wikipedia.org/wiki/All_You_Need_Is_Kill)
* [Angel Cop](https://en.wikipedia.org/wiki/Angel_Cop)
* [Aposimz](https://en.wikipedia.org/wiki/Aposimz)
* [Appleseed](https://en.wikipedia.org/wiki/Appleseed_(manga))
* [Bakuretsu Tenshi](https://en.wikipedia.org/wiki/Burst_Angel)
* [Battle Angel Alita](https://en.wikipedia.org/wiki/Battle_Angel_Alita)
* [Bio Booster Armor Guyver](https://en.wikipedia.org/wiki/Bio_Booster_Armor_Guyver)
* [Biomega](https://en.wikipedia.org/wiki/Biomega_(manga))
* [Black Lagoon](https://en.wikipedia.org/wiki/Black_Lagoon)
* [Black Magic](https://en.wikipedia.org/wiki/Black_Magic_(manga))
* [Blame! Academy and So On](https://en.wikipedia.org/wiki/Blame!_Academy_and_So_On)
* [Blame!](https://en.wikipedia.org/wiki/Blame!)
* [Chobits](https://en.wikipedia.org/wiki/Chobits)
* [Cyber Blue](https://en.wikipedia.org/wiki/Cyber_Blue)
* [Cyber City Oedo 808](https://en.wikipedia.org/wiki/Cyber_City_Oedo_808)
* [Cyber Knight](https://en.wikipedia.org/wiki/Cyber_Knight)
* [Dimension W](https://en.wikipedia.org/wiki/Dimension_W)
* [Dogs: Bullets & Carnage](https://en.wikipedia.org/wiki/Dogs:_Bullets_%26_Carnage)
* [Dominion: Tank Police](https://en.wikipedia.org/wiki/Dominion:_Tank_Police)
* [Dorohedoro](https://en.wikipedia.org/wiki/Dorohedoro)
* [Eden: It's an Endless World!](https://en.wikipedia.org/wiki/Eden:_It%27s_an_Endless_World!)
* [Fire Candy](https://en.wikipedia.org/wiki/Fire_Candy)
* [Gantz](https://en.wikipedia.org/wiki/Gantz)
* [Ghost in the Shell](https://en.wikipedia.org/wiki/Ghost_in_the_Shell)
* [Giganto Maxia](https://en.wikipedia.org/wiki/Giganto_Maxia)
* [Gunm: Mars Chronicle](https://en.wikipedia.org/wiki/Gunm:_Mars_Chronicle)
* [Gunnm: Last Order](https://en.wikipedia.org/wiki/Gunnm:_Last_Order)
* [Humanity Has Declined](https://en.wikipedia.org/wiki/Humanity_Has_Declined)
* [Kanshikan Tsunemori Akane](https://en.wikipedia.org/wiki/Kanshikan_Tsunemori_Akane)
* [King of Thorn](https://en.wikipedia.org/wiki/King_of_Thorn)
* [Metropolis](https://en.wikipedia.org/wiki/Metropolis_(manga))
* [Neon Genesis Evangelion](https://en.wikipedia.org/wiki/Neon_Genesis_Evangelion)
* [No Guns Life](https://en.wikipedia.org/wiki/No_Guns_Life)
* [No. 6](https://en.wikipedia.org/wiki/No._6)
* [Origin](https://tvtropes.org/pmwiki/pmwiki.php/Manga/Origin)
* [Pandora in the Crimson Shell: Ghost Urn](https://en.wikipedia.org/wiki/Pandora_in_the_Crimson_Shell:_Ghost_Urn)
* [Paranoia Star](https://en.wikipedia.org/wiki/Paranoia_Star)
* [Parasyte](https://en.wikipedia.org/wiki/Parasyte)
* [Pluto](https://en.wikipedia.org/wiki/Pluto_(manga))
* [Post-Human](https://en.wikipedia.org/wiki/Post-Human_(manga))
* [Prophecy](https://en.wikipedia.org/wiki/Prophecy_(manga))
* [Psycho-Pass: Inspector Shinya Kogami](https://en.wikipedia.org/wiki/Psycho-Pass:_Inspector_Shinya_Kogami)
* [Real Account](https://en.wikipedia.org/wiki/Real_Account)
* [Saber Marionette J](https://en.wikipedia.org/wiki/Saber_Marionette_J)
* [Serial Experiments Lain](https://en.wikipedia.org/wiki/Serial_Experiments_Lain)
* [Terra Formars](https://en.wikipedia.org/wiki/Terra_Formars)
* [Texhnolyze](https://en.wikipedia.org/wiki/Texhnolyze)
* [Time of Eve](https://en.wikipedia.org/wiki/Time_of_Eve)
* [Trigun](https://en.wikipedia.org/wiki/Trigun)
* [Venus Wars](https://en.wikipedia.org/wiki/Venus_Wars)
* [Weathering With You](https://en.wikipedia.org/wiki/Weathering_with_You)
* [Wolf's Rain](https://en.wikipedia.org/wiki/Wolf%27s_Rain)
* [Yokohama Kaidashi Kikou](https://en.wikipedia.org/wiki/Yokohama_Kaidashi_Kik%C5%8D)

## Magazines
* [2600](https://www.2600.com/): The Hacker Quarterly
* [CYBR](https://cybrmagazine.com/)
* [Datenschleuder](https://ds.ccc.de/): German hacker magazine that is published at irregular intervals by the Chaos Computer Club (CCC). Topics include primarily political and technical aspects of the digital world (freedom of information, data privacy (data protection), closed-circuit television, personal privacy (personal rights), cryptography and many more).
* MONDO 2000 ([current](https://www.mondo2000.com/), [covers](http://www.mondo2000.net/), [archive](https://archive.org/details/mondohistory)): Mondo 2000 was a glossy cyberculture magazine published in California during the 1980s and 1990s. It covered cyberpunk topics such as virtual reality and smart drugs.
* Reality Hackers: pre-MONDO 2000. See up in _archive_.
* [Lainzine](https://lainzine.org/)
* [WIRED](http://wired.com/): WIRED is a monthly American magazine, published in print and online editions, that focuses on how emerging technologies affect culture, the economy, and politics.

## Comics
* [2020 Visions](https://en.wikipedia.org/wiki/2020_Visions)
* [Hacktivist](https://www.comixology.com/Hacktivist/comics-series/12680)
* [Judge Dredd](https://en.wikipedia.org/wiki/Judge_Dredd): Judge Dredd is a law enforcement officer in the dystopian future city of Mega-City One and a "street judge", empowered to summarily arrest, convict, sentence, and execute criminals.
* [Outcasts](https://en.wikipedia.org/wiki/Outcasts_(DC_Comics))
* [Transmetropolitan](https://www.cbr.com/tag/transmetropolitan/)
* [Huxley](https://benmaurodesign.com/HUXLEY-GRAPHIC-NOVEL)

## Hardware
* [mntmn](https://shop.mntmn.com/)
* [mntre](https://mntre.com/)

## WWW
* [Neon Dystopia](https://www.neondystopia.com/): Neon Dystopia was created in November 2014 with the idea of bringing together fans of Cyberpunk.
* [Reddit r/cyberpunk](https://www.reddit.com/r/Cyberpunk/)
* [8kun.top/cyber](https://8kun.top/cyber/catalog.html)
* http://0110000101111000.tumblr.com/
* http://virtualizedmemories.tumblr.com/
* http://alteredcarbone.tumblr.com/
* https://archillect.com/
* http://blackiochronicles.tumblr.com/
* http://c-yberpunk.tumblr.com/
* http://cf-12.tumblr.com/
* http://cheezeb0rg.tumblr.com/
* http://cyberphonetics.tumblr.com/
* http://cyberpunkhero.tumblr.com/
* http://cyberpunkimages.tumblr.com/
* http://cyberpunknoise.tumblr.com/
* http://cyberpunkonline.net/
* http://cyberpunktokyo.tumblr.com/
* http://cybertunage.tumblr.com/
* http://cypulchre.tumblr.com/
* http://deathdol.tumblr.com/
* http://deatherit.tumblr.com
* http://digitalisticnoise.tumblr.com/
* http://drawforbroke.tumblr.com/
* http://dystopianfuture.tumblr.com/
* http://echoesfromtheruins.tumblr.com/
* http://enjoydigitallife.tumblr.com/
* http://fleshcoatedtechnology.tumblr.com/
* http://futurefanfare.tumblr.com/
* http://hedonicglitch.tumblr.com/
* http://helaeon.tumblr.com/
* http://instinctualization.tumblr.com/
* http://internet-of-dreams.tumblr.com/
* http://khymeira.tumblr.com/
* http://noclipdesigns.tumblr.com/
* http://ono-sendai-cyberspace7.tumblr.com/
* http://opticalcamouflage.tumblr.com/
* http://otakugangsta.com/
* http://parallaxdimension.tumblr.com/
* http://powerglove.tumblr.com/
* http://rekall.tumblr.com/
* http://reverse-digital.tumblr.com/
* http://roboticnetwork.tumblr.com/
* http://scarecrow-feedback.tumblr.com/
* http://slimetroop.tumblr.com/
* http://shinobigang.com/
* http://sid766.tumblr.com/
* http://spanglypants-mcfuckyou.tumblr.com/
* https://tacticalneuralimplant.tumblr.com/
* http://thechromenet.tumblr.com/
* http://tohaheavyindustries.tumblr.com/
* http://trenchcoatsheep.tumblr.com/
* http://uzicopter.tumblr.com/
* http://wondershock.tumblr.com/
* http://cerebralzero.tumblr.com/
* http://feedbackwild.tumblr.com/
* https://n-o-d-e.net
* https://wiki.xxiivv.com/site/illustration.html
* http://fauux.neocities.org
* https://mebious.neocities.org
* https://blackwings.neocities.org
* https://webnavi.neocities.org
* https://newchapter.neocities.org
* https://angusnicneven.com
* https://j0n.k4w411.net/
* https://unplug.neocities.org/
* https://rvklein.me/
* http://playing.hypernom.com/monkeys
* http://burymewithmymoney.com/
* https://apollobase.neocities.org/news.html
* [Cyberpunk forums](https://cyberpunkforums.com/viewtopic.php?id=361)
* [Project Cybperpunk](http://project.cyberpunk.ru/idb/)
* [Jinteki](https://jinteki.industries/)
* [Wolfram Alpha](https://www.wolframalpha.com/)
* [16colo.rs](https://16colo.rs/)
* [Dangeru](https://dangeru.us/)
* [Anon-Cafe](https://anon.cafe/cyber/)
* [Wirechan](https://wirechan.org/)
* [Cyberpunk Database](https://cyberpunkdatabase.net/)
* [Cyberpunk Noise](https://cyberpunknoise.tumblr.com/)
* [Wired - Cyberpunk](https://www.wired.com/tag/cyberpunk/)
* [Cyberpunk Culture](https://www.cyberpunkculture.com/)

## Videos
* [Charlie Chaplin Eating Machine](https://www.youtube.com/watch?v=17PkUsTVa7g)
* [CyberPunk Documentary](https://www.youtube.com/watch?v=sttm8Q9rOdQ)
* [N-O-D-E TV](https://www.youtube.com/c/NODEtv/videos)
* [SeanHodgins](https://www.youtube.com/c/SeanHodgins/videos)
* [Sean Hodgins](https://www.youtube.com/c/SeanHodgins/videos)
* [Cyberpunk Documentary PART 1](https://www.youtube.com/watch?v=sttm8Q9rOdQ)
* [BBS Documentary](https://www.youtube.com/watch?v=nO5vjmDFZaI)

## Texts
* [A Cyberpunk Manifesto](http://blog.9while9.com/manifesto-anthology/1997.html) by Christian As. Kirtchev. (1997)

## Books
* [Accelerando](https://www.goodreads.com/book/show/17863.Accelerando) by Charles Stross
* [All Tomorrow's Parties](https://www.goodreads.com/book/show/827.All_Tomorrow_s_Parties) by William Gibson
* [Altered Carbon](https://www.goodreads.com/book/show/40445.Altered_Carbon): Part #1, also read Broken Angels and Woken Furies
* [Altered Carbon](https://www.goodreads.com/book/show/40651883-altered-carbon) by Richard K. Morgan
* [Altered States](https://www.goodreads.com/book/show/284438.Altered_States) by Paddy Chayefsky
* [Autonomous](https://www.goodreads.com/book/show/28209634-autonomous)
* [Count Zero](https://www.goodreads.com/book/show/827.Count_Zero) by William Gibson
* [Do Androids Dream of Electric Sheep?](https://www.goodreads.com/book/show/7082.Do_Androids_Dream_of_Electric_Sheep_) by Philip K. Dick
* [Dogs of War](https://www.goodreads.com/book/show/35827220-dogs-of-war)
* [Ghost in the Shell](https://www.goodreads.com/book/show/182537.Ghost_in_the_Shell) by Masamune Shirow
* [Hard-Boiled Wonderland and the End of the World](https://www.goodreads.com/book/show/10349.Hard_Boiled_Wonderland_and_the_End_of_the_World) by Haruki Murakami
* [Hardwired](https://www.goodreads.com/book/show/814835.Hardwired) by Walter Jon Williams
* [Islands in the Net](https://www.goodreads.com/book/show/218571.Islands_in_the_Net)
* [Metro 2033](https://www.goodreads.com/book/show/172621.METRO_2033) by Dmitry Glukhovsky
* [Mirrorshades](https://www.goodreads.com/book/show/302702.Mirrorshades): The Cyberpunk Anthology
* [Mona Lisa Overdrive](https://www.goodreads.com/book/show/827.Mona_Lisa_Overdrive) by William Gibson
* [N-O-D-E](https://n-o-d-e.live/zine/NODE_VOL_02.pdf)
* [Necrotech](https://www.goodreads.com/book/show/30183216-necrotech)
* [Neuromancer](https://www.goodreads.com/book/show/22328.Neuromancer) by William Gibson
* [Nexus](https://www.goodreads.com/book/show/13642710-nexus): Part 1 of 3 (also read Crux and Apex)
* [Pattern Recognition](https://www.goodreads.com/book/show/901.Pattern_Recognition) by William Gibson
* [Permutation City](https://www.goodreads.com/book/show/81981.Permutation_City) by Greg Egan
* [REAMDE](https://www.goodreads.com/book/show/10552338-reamde)
* [Rainbows End](https://www.goodreads.com/book/show/131704.Rainbows_End) by Vernor Vinge
* [Ready Player One](https://www.goodreads.com/book/show/9969571-ready-player-one) by Ernest Cline
* [Ready Player Two](https://www.goodreads.com/book/show/51935000-ready-player-two) by Ernest Cline
* [Schismatrix Plus](https://www.goodreads.com/book/show/11765.Schismatrix_Plus) by Bruce Sterling
* [Snow Crash](https://www.goodreads.com/book/show/830.Snow_Crash) by Neal Stephenson
* [Spares](https://www.goodreads.com/book/show/21010.Spares)
* [Sprawl trilogy](https://en.wikipedia.org/wiki/Sprawl_trilogy)
* [Synners](https://www.goodreads.com/book/show/84484.Synners) by Pat Cadigan
* [The Departure](https://www.goodreads.com/book/show/10648878-the-departure)
* [The Diamond Age: Or, A Young Lady's Illustrated Primer](https://www.goodreads.com/book/show/827.The_Diamond_Age) by Neal Stephenson
* [The Peripheral](https://www.goodreads.com/book/show/20986005-the-peripheral) by William Gibson
* [The Quantum Thief](https://www.goodreads.com/book/show/8717268-the-quantum-thief) by Hannu Rajaniemi
* [The Stars My Destination](https://www.goodreads.com/book/show/21697.The_Stars_My_Destination) by Alfred Bester
* [The Ware Tetralogy](https://www.goodreads.com/book/show/530443.The_Ware_Tetralogy) by Rudy Rucker
* [The Water Knife](https://www.goodreads.com/book/show/23209924-the-water-knife)
* [The Windup Girl](https://www.goodreads.com/book/show/6597651-the-windup-girl) by Paolo Bacigalupi
* [Thin Air](https://www.goodreads.com/book/show/25835917-thin-air)
* [Virtual Light](https://www.goodreads.com/book/show/179753.Virtual_Light) by William Gibson
* [Vurt](https://www.goodreads.com/book/show/14064.Vurt) by Jeff Noon
* [Walkaway](https://www.goodreads.com/book/show/40604388-walkaway): Also read Little Brother, Makers, Attack Surface or basically anything by Doctorow for amazing near-future cyberpunk
* [When Gravity Fails](https://www.goodreads.com/book/show/23629.When_Gravity_Fails) by George Alec Effinger

## Art
* [Art prints by Sheng Lam](https://www.inprnt.com/gallery/8bitwizard/)
* [Simon Stålenhag](https://www.simonstalenhag.se/index.html)
* [Fine Art America](https://fineartamerica.com/art/cyberpunk)
* [DeviantArt](https://www.deviantart.com/tag/cyberpunk)
* [Kontrolaltdelt](https://www.instagram.com/kontrolaltdelt/)
* [Bouss Bouss/](https://www.instagram.com/bouss_bouss/)
* [Michera Machine/](https://www.instagram.com/michera.machine/)
* [Death Herald](https://deathherald.tumblr.com/)
* [Pao](https://www.artstation.com/pao)

## Code
* [prometheux-ar/cyberpunk](https://github.com/prometheux-ar/cyberpunk): A crazy Cyberpunk theme for Visual Studio Code
* [roboron3042/Cyberpunk-Neon](https://github.com/Roboron3042/Cyberpunk-Neon): Tons of cyberpunk theme files
* [dhaitz/mplcyberpunk](https://github.com/dhaitz/mplcyberpunk): Python package on top of matplotlib to create 'cyberpunk' style plots
* [keijiro/KinoGlitch](https://github.com/keijiro/KinoGlitch): Collection of glitch video effects
* [snorpey/jpg-glitch](https://github.com/snorpey/jpg-glitch): Jpg glitch for the browser
* [propjockey/augmented-ui](https://github.com/propjockey/augmented-ui): Cyberpunk UI components in CSS
* [arwes/arwes](Arwes): Scifi UI CSS
* [Dark Reader](https://addons.mozilla.org/en-US/firefox/addon/darkreader/)
* [Jinteki code](https://github.com/Hal47/cyberlife-site)

## Music
* [3TEETH](https://3teeth.org/)
* [Access to Arasaka](https://tympanikaudio.bandcamp.com/album/oppidan)
* [Aphex Twin](https://aphextwin.warp.net/)
* [Atari Teenage Riot](https://www.atari-teenage-riot.com/)
* [Billy Idol's _Cyberpunk_ record](https://en.wikipedia.org/wiki/Cyberpunk_(album))
* [Front 242](https://en.wikipedia.org/wiki/Front_242)
* [Front Line Assembly (or FLA)](https://en.wikipedia.org/wiki/Front_Line_Assembly)
* [Haujobb](https://haujobb.bandcamp.com/album/solutions-for-a-small-planet)
* [In Flames - Colony](https://en.wikipedia.org/wiki/Colony_(In_Flames_album))
* [Joey Danger - Surrender](https://www.youtube.com/watch?v=ZzcXhTYLUvQ)
* [Perturbator](https://perturbator.bandcamp.com/)
* [Skinny Puppy](https://en.wikipedia.org/wiki/Skinny_Puppy)
* [Squarepusher](https://squarepusher.net/)
* [The Prodigy](https://en.wikipedia.org/wiki/The_Prodigy)
* [Youth Code](https://www.discogs.com/es/artist/3148183-Youth-Code)
* [Lainchan's radio stream](https://lainchan.org/radio)
* [Plaza One](https://plaza.one/)
* [Poolsuite](https://poolsuite.net/)
* [LORN](https://www.youtube.com/channel/UCxebkO4OJxj3sUWJj4dH1ug)

## Video Games
* [2064: Read Only Memories](https://en.wikipedia.org/wiki/2064%3A_Read_Only_Memories)
* [Beneath a Steel Sky](https://www.gog.com/game/beneath_a_steel_sky)
* [Blade Runner](https://www.gog.com/game/blade_runner)
* [Cloudpunk](https://store.steampowered.com/app/746850/Cloudpunk/)
* [Cryptomancer RPG](http://cryptorpg.com/)
* [CyberPunk 2077 (2020)](https://www.cyberpunk.net/)
* [Cypher](https://cabrerabrothers.com/)
* [Deus Ex Machina (1984)](https://en.wikipedia.org/wiki/Deus_Ex_Machina_(video_game))
* [Deus Ex (2000)](https://en.wikipedia.org/wiki/Deus_Ex_(video_game))
* [ExaPunks](https://store.steampowered.com/app/716490/EXAPUNKS/)
* [Gamedec](https://store.steampowered.com/app/917720/Gamedec/)
* [Gemini Rue](https://store.steampowered.com/app/80310/Gemini_Rue/)
* [Gunpoint](https://store.steampowered.com/app/206190/Gunpoint/)
* [>observer_](https://store.steampowered.com/app/514900/observer/)
* [Orwell](https://store.steampowered.com/app/491950/Orwell_Keeping_an_Eye_On_You/)
* [RUINER](https://store.steampowered.com/app/464060/RUINER/)
* [Satellite Reign](https://store.steampowered.com/app/268870/Satellite_Reign/)
* [Shadowrun: Dragonfall](https://store.steampowered.com/app/300550/Shadowrun_Dragonfall__Directors_Cut/)
* [Shadowrun: Hong Kong](https://store.steampowered.com/app/346940/Shadowrun_Hong_Kong__Extended_Edition/)
* [Snatcher](https://www.myabandonware.com/game/snatcher-7te)
* [System Shock 2](https://store.steampowered.com/app/238210/System_Shock_2/)
* [Technobabylon](https://store.steampowered.com/app/307580/Technobabylon/)
* [The Moment of Silence](https://store.steampowered.com/app/339840/The_Moment_of_Silence/)
* [Uplink](https://store.steampowered.com/app/1510/Uplink/)
* [VA-11 Hall-A](https://en.wikipedia.org/wiki/VA-11_Hall-A)
* [VirtuaVerse](https://store.steampowered.com/app/1019310/VirtuaVerse/)
* [Watch Dogs 2](https://store.steampowered.com/app/447040/Watch_Dogs_2/)
* [while True: learn()](https://store.steampowered.com/app/619150/while_True_learn/)
* [Xenosaga](https://en.wikipedia.org/wiki/Xenosaga)
* [Cyberpunk review](https://www.cyberpunkreview.com/)

## Wearable
* [5060/Machine56](https://5060.bigcartel.com/)
* [ACRONYM](https://acrnm.com/)
* [BlackTailor](https://www.blacktailor.store/)
* [Demobaza](https://www.demobaza.com/)
* [Dustrial](https://dustrial.net/)
* [Enshadower](https://www.enshadower.me/)
* [Guerilla Group](https://guerrilla-group.co/)
* [HackAttack Shoes](https://www.aliveshoes.com/brand/hackattack)
* [Krakatau](https://en.krakatauwear.com/)
* [neo4ic](https://neo4ic.com/)
* [Niepce Inc](https://niepceinc.com/)
* [N O D E](https://n-o-d-e.shop/)
* [ZOLNAR](https://www.etsy.com/shop/ZOLNAR)

repo_name: gonzalo-/cyberpunk


text:
import processing.svg.*;
import controlP5.*;

int radius1 = 100;
int diameter1 = 100;
int division1 = 30;
int thickness1 = 1;
int rotate1 = 0;

int radius2 = 100;
int diameter2 = 100;
int division2 = 30;
int thickness2 = 0;
int rotate2 = 0;

int radius3 = 100;
int diameter3 = 100;
int division3 = 30;
int thickness3 = 0;
int rotate3 = 0;

boolean hasChangedValue = false;

boolean needToSavePNG = false;
boolean needToSaveSVG = false;
String outFilename = "";

PGraphics outPNG;

ControlP5 cp5;
Textlabel lblStatus;
boolean clearLabel = false;
long startMillis;
int clearInterval = 5000;

void setup() {
  size(1400,800,P2D);

  // COOL THING ALERT!!
  // If you have a HiDPI monitor (MacBook Pro Retina, Surface Book, etc)
  // you can make extra hi-res images by uncommenting the following line.
  // BUT!!!!!!
  // You also need to change the maximum memory in Processing Preferences
  // to 512MB
  // -----------------------------------
  //pixelDensity(displayDensity()); // <-- uncomment for HiDPI screens
  // -----------------------------------

  cp5 = new ControlP5(this);

  background(200);
  smooth(4);

  outPNG = createGraphics(2400,2400,P2D);
  outPNG.beginDraw();
  outPNG.background(255);
  outPNG.smooth(4);
  outPNG.endDraw();

  cp5.addSlider("division1").setPosition(40,120).setSize(300,20).setValue(30).setRange(2,100).setColorCaptionLabel(#000000);
  cp5.addSlider("radius1").setPosition(40,60).setSize(300,20).setValue(100).setRange(10,300).setColorCaptionLabel(#000000);
  cp5.addSlider("diameter1").setPosition(40,90).setSize(300,20).setValue(100).setRange(10,200).setColorCaptionLabel(#000000);
  cp5.addSlider("thickness1").setPosition(40,30).setSize(300,20).setValue(1).setRange(0,10).setColorCaptionLabel(#000000);
  cp5.addSlider("rotate1").setPosition(40,150).setSize(300,20).setValue(0).setRange(0,180).setColorCaptionLabel(#000000);

  cp5.addSlider("division2").setPosition(40,320).setSize(300,20).setValue(30).setRange(2,100).setColorCaptionLabel(#000000);
  cp5.addSlider("radius2").setPosition(40,260).setSize(300,20).setValue(100).setRange(10,300).setColorCaptionLabel(#000000);
  cp5.addSlider("diameter2").setPosition(40,290).setSize(300,20).setValue(100).setRange(10,200).setColorCaptionLabel(#000000);
  cp5.addSlider("thickness2").setPosition(40,230).setSize(300,20).setValue(0).setRange(0,10).setColorCaptionLabel(#000000);
  cp5.addSlider("rotate2").setPosition(40,350).setSize(300,20).setValue(0).setRange(0,180).setColorCaptionLabel(#000000);

  cp5.addSlider("division3").setPosition(40,520).setSize(300,20).setValue(30).setRange(2,100).setColorCaptionLabel(#000000);
  cp5.addSlider("radius3").setPosition(40,460).setSize(300,20).setValue(100).setRange(10,300).setColorCaptionLabel(#000000);
  cp5.addSlider("diameter3").setPosition(40,490).setSize(300,20).setValue(100).setRange(10,200).setColorCaptionLabel(#000000);
  cp5.addSlider("thickness3").setPosition(40,430).setSize(300,20).setValue(0).setRange(0,10).setColorCaptionLabel(#000000);
  cp5.addSlider("rotate3").setPosition(40,550).setSize(300,20).setValue(0).setRange(0,180).setColorCaptionLabel(#000000);

  cp5.addButton("savePNG").setPosition(40,630).setSize(140,30).setCaptionLabel("Save PNG");
  cp5.addButton("saveSVG").setPosition(200,630).setSize(140,30).setCaptionLabel("Save SVG");

  lblStatus = cp5.addTextlabel("lblStatus").setPosition(40,670).setText("").setColorValue(#000000);

}

void generateImage() {
  background(255);

  outPNG.beginDraw();
  outPNG.clear();
  outPNG.stroke(0);
  outPNG.noFill();
  outPNG.ellipseMode(RADIUS);
  outPNG.endDraw();

  float c;

  if (thickness1 > 0) {
    c = TWO_PI/division1;
    outPNG.beginDraw();
    outPNG.strokeWeight(thickness1);
    for (float i=0;i<TWO_PI;i+=TWO_PI/division1) {
      if (abs(TWO_PI - i) > c/2.0) {
        outPNG.pushMatrix();
        outPNG.translate(outPNG.width/2,outPNG.height/2);
        outPNG.scale(2.0);
        outPNG.rotate(radians(rotate1));
        outPNG.ellipse(sin(i)*diameter1, cos(i) * diameter1, radius1, radius1);
        outPNG.popMatrix();
      }
    }
    outPNG.endDraw();
  }
  if (thickness2 > 0) {
    c = TWO_PI/division2;
    outPNG.beginDraw();
    outPNG.strokeWeight(thickness2);
    for (float i=0;i<TWO_PI;i+=TWO_PI/division2) {
      if (abs(TWO_PI - i) > c/2.0) {
        outPNG.pushMatrix();
        outPNG.translate(outPNG.width/2,outPNG.height/2);
        outPNG.scale(2.0);
        outPNG.rotate(radians(rotate2));
        outPNG.ellipse(sin(i)*diameter2, cos(i) * diameter2, radius2, radius2);
        outPNG.popMatrix();
      }
    }
    outPNG.endDraw();
  }
  if (thickness3 > 0) {
    c = TWO_PI/division3;
    outPNG.beginDraw();
    outPNG.strokeWeight(thickness3);
    for (float i=0;i<TWO_PI;i+=TWO_PI/division3) {
      if (abs(TWO_PI - i) > c/2.0) {
        outPNG.pushMatrix();
        outPNG.translate(outPNG.width/2,outPNG.height/2);
        outPNG.scale(2.0);
        outPNG.rotate(radians(rotate3));
        outPNG.ellipse(sin(i)*diameter3, cos(i) * diameter3, radius3, radius3);
        outPNG.popMatrix();
      }
    }
    outPNG.endDraw();
  }

}

void savePNG() {
  selectOutput("Select a name and location to save PNG","saveAsPng");
}

void saveAsPng(File saveLocation) {
  if (saveLocation != null) {
    String path = saveLocation.getAbsolutePath();
    String filename = saveLocation.getName();
    if (filename.indexOf(".png") < 0) {
      path += ".png";
    }
    outFilename = path;
    needToSavePNG = true;
  }
}

void saveSVG() {
  selectOutput("Select a name and location to save SVG","saveAsSvg");
}

void saveAsSvg(File saveLocation) {
  if (saveLocation != null) {
    String path = saveLocation.getAbsolutePath();
    String filename = saveLocation.getName();
    if (filename.indexOf(".svg") < 0) {
      path += ".svg";
    }
    outFilename = path;
    needToSaveSVG = true;
  }
}

void draw() {
  if (hasChangedValue) {
    // only regenerate if we've changed a value
    generateImage();
    hasChangedValue = false;
  }

  // draw the generated image
  background(255);
  image(outPNG,350,-200,1200,1200);

  // handle saving PNG or SVG
  if (needToSavePNG) {
    if (outFilename != "") {
      // we can just save our off-screen canvas
      outPNG.save(outFilename);
      lblStatus.setText("Saved PNG as " + outFilename);
      startMillis = millis();
      clearLabel = true;
    }
    needToSavePNG = false;
  }
  if (needToSaveSVG) {
    // we need to re-render into a SVG canvas
    renderSVG();
  }

  if (clearLabel) {
    if (millis() - startMillis > clearInterval) {
      lblStatus.setText("");
      clearLabel = false;
    }
  }
}

public void controlEvent(ControlEvent theEvent) {
  hasChangedValue = true;
}

void renderSVG() {
  lblStatus.setText("Saving...");
  PGraphics s = createGraphics(2400,2400,SVG,outFilename);
  s.beginDraw();
  s.stroke(0);
  s.noFill();
  s.ellipseMode(RADIUS);
  float c;
  if (thickness1 > 0) {
    c = TWO_PI/division1;
    s.strokeWeight(thickness1);
    for (float i=0.0;i<TWO_PI;i+=TWO_PI/division1) {
      if (abs(TWO_PI - i) > c/2.0) {
        s.pushMatrix();
        s.translate(s.width/2,s.height/2);
        s.scale(2.0);
        s.rotate(rotate1);
        s.ellipse(sin(i)*diameter1, cos(i) * diameter1, radius1, radius1);
        s.popMatrix();
      }
    }
  }
  if (thickness2 > 0) {
    c = TWO_PI/division2;
    s.strokeWeight(thickness2);
    for (float i=0;i<TWO_PI;i+=TWO_PI/division2) {
      if (abs(TWO_PI - i) > c/2.0) {
        s.pushMatrix();
        s.translate(s.width/2,s.height/2);
        s.scale(2.0);
        s.rotate(rotate2);
        s.ellipse(sin(i)*diameter2, cos(i) * diameter2, radius2, radius2);
        s.popMatrix();
      }
    }
  }
  if (thickness3 > 0) {
    c = TWO_PI/division3;
    s.strokeWeight(thickness3);
    for (float i=0;i<TWO_PI;i+=TWO_PI/division3) {
      if (abs(TWO_PI - i) > c/2.0) {
        s.pushMatrix();
        s.translate(s.width/2,s.height/2);
        s.scale(2.0);
        s.rotate(rotate3);
        s.ellipse(sin(i)*diameter3, cos(i) * diameter3, radius3, radius3);
        s.popMatrix();
      }
    }
  }
  s.dispose();
  s.endDraw();
  needToSaveSVG = false;
  lblStatus.setText("Saved SVG as " + outFilename);
  startMillis = millis();
  clearLabel = true;
}

repo_name: gwygonik/Spiroh

repo_language: Processing


text:
# Spiroh

Processing app to create guilloche-like images—similar to a spirograph—using three layers of repeating circles, with controls over each layer.

The app starts with a single layer. Adjust the sliders at the top-left to change different paramaters including size, thickness, number of repeats, and even rotation angle. The design will update in real-time with your changes. Setting a thickness value to 0 (zero) will turn off a layer, while any other value will turn on that layer.

After creating a design you like, you can export either a PNG or SVG of your design. You can use PNGs to raster engrave with a laser cutter, or the SVG to send to a CNC or pen-plotter (e.g.: AxiDraw)

To run this app you will need Processing (processing.org) and the ControlP5 library (Sketch->Import Library...->Add Library...)

Here are a few examples, including the interface:

![spiroh_5294199](https://cloud.githubusercontent.com/assets/2564583/23840282/482de9b8-0761-11e7-84e5-319aba74f0d8.png)

NOTE: In-app images may go outside the bounds of the screen, but the saved PNGs and SVGs are NOT cut off! I wouldn't do that to you! :-)


text:
# [Linux administrator](https://infinite.education/view/linux_administrator)
Linux administrator or system engineer - is a popular profession in IT
More then half of IT company at world use Linux at production, so linux administrator will always has a work

## **[Automation](https://infinite.education/view/automation)**
* `Article` [What is configuration management?](https://www.redhat.com/en/topics/automation/what-is-configuration-management)
* `Article` [An Introduction to Configuration Management | DigitalOcean](https://www.digitalocean.com/community/tutorials/an-introduction-to-configuration-management)
* `Article` [Top 5 configuration management tools | Opensource.com](https://opensource.com/article/18/12/configuration-management-tools)

**Chef**
* `Article` [Chef Web Docs](https://docs.chef.io/)
* `Article` [DevDocs — Chef 12 documentation](https://devdocs.io/chef~12/)
* `Documentation` [A Beginner's Guide to Chef | Linode](https://www.linode.com/docs/applications/configuration-management/beginners-guide-chef/)

**Puppet**
* `Article` [Chef Web Docs](https://docs.chef.io/)
* `Article` [DevDocs — Chef 12 documentation](https://devdocs.io/chef~12/)
* `Documentation` [A Beginner's Guide to Chef | Linode](https://www.linode.com/docs/applications/configuration-management/beginners-guide-chef/)

**Ansible**
* `Article` [Chef Web Docs](https://docs.chef.io/)
* `Article` [DevDocs — Chef 12 documentation](https://devdocs.io/chef~12/)
* `Documentation` [A Beginner's Guide to Chef | Linode](https://www.linode.com/docs/applications/configuration-management/beginners-guide-chef/)

## **[Linux containers](https://infinite.education/view/linux_containers)**
* `Article` [Docker internals](https://medium.com/@BeNitinAgarwal/understanding-the-docker-internals-7ccb052ce9fe)

**Docker**
* `Video` [What is Docker? - YouTube](https://www.youtube.com/watch?v=u-YWtdbpEhQ)
* `Video` [What is Kubernetes | Kubernetes explained in 15 mins - YouTube](https://www.youtube.com/watch?v=VnvRFRk_51k)
* `Video` [Introduction to docker compose | Docker - YouTube](https://www.youtube.com/watch?v=vQmk9moF8vw)

**Linux LVM**
* `Video` [What is Docker? - YouTube](https://www.youtube.com/watch?v=u-YWtdbpEhQ)
* `Video` [What is Kubernetes | Kubernetes explained in 15 mins - YouTube](https://www.youtube.com/watch?v=VnvRFRk_51k)
* `Video` [Introduction to docker compose | Docker - YouTube](https://www.youtube.com/watch?v=vQmk9moF8vw)

**Linux docker basics**
* `Video` [What is Docker? - YouTube](https://www.youtube.com/watch?v=u-YWtdbpEhQ)
* `Video` [What is Kubernetes | Kubernetes explained in 15 mins - YouTube](https://www.youtube.com/watch?v=VnvRFRk_51k)
* `Video` [Introduction to docker compose | Docker - YouTube](https://www.youtube.com/watch?v=vQmk9moF8vw)

## **[Programming](https://infinite.education/view/programming)**

**Bash programming language**
* `Documentation` [Bash Reference Manual](https://tiswww.case.edu/php/chet/bash/bashref.html)
* `Documentation` [Bash Reference Manual](https://www.gnu.org/savannah-checkouts/gnu/bash/manual/bash.html)

**Linux dynamic libraries**
* `Documentation` [Bash Reference Manual](https://tiswww.case.edu/php/chet/bash/bashref.html)
* `Documentation` [Bash Reference Manual](https://www.gnu.org/savannah-checkouts/gnu/bash/manual/bash.html)

**Linux package concepts**
* `Documentation` [Bash Reference Manual](https://tiswww.case.edu/php/chet/bash/bashref.html)
* `Documentation` [Bash Reference Manual](https://www.gnu.org/savannah-checkouts/gnu/bash/manual/bash.html)

**Python**
* `Documentation` [Bash Reference Manual](https://tiswww.case.edu/php/chet/bash/bashref.html)
* `Documentation` [Bash Reference Manual](https://www.gnu.org/savannah-checkouts/gnu/bash/manual/bash.html)

**Basic Usage of Git**
* `Documentation` [Bash Reference Manual](https://tiswww.case.edu/php/chet/bash/bashref.html)
* `Documentation` [Bash Reference Manual](https://www.gnu.org/savannah-checkouts/gnu/bash/manual/bash.html)

**Go**
* `Documentation` [Bash Reference Manual](https://tiswww.case.edu/php/chet/bash/bashref.html)
* `Documentation` [Bash Reference Manual](https://www.gnu.org/savannah-checkouts/gnu/bash/manual/bash.html)

## **[Linux: basic commands](https://infinite.education/view/linux_basic_commands)**
* `Article` [linux basic commands - Google Suche](https://www.google.com/search?q=linux+basic+commands)
* `Article` [40 Basic Linux Commands used Frequently](https://linoxide.com/linux-command/essential-linux-basic-commands/)

**Linux command: other**

**Linux commands: network management**

**Linux commands: process management**

**Linux commands group: file editors**

**Linux commands group: text processors**

**Linux commands: file management**

## **[Linux](https://infinite.education/view/linux)**
* `Article` [Linux - Wikipedia](https://en.wikipedia.org/wiki/Linux)
* `Article` [Expertise: Linux administrator (roadmap)](https://infinite.education/expertise/linux_administrator)

**How OSs work in General**
* `Article` [Operating Systems Tutorial | Sophia Learning](https://www.sophia.org/tutorials/operating-systems)
* `Article` [Principles of operating systems](http://www.toves.org/books/os/index.html)
* `Video` [Operating System Basics](https://www.youtube.com/watch?v=9GDX-IyZ_C8&t=346s)
* `Video` [What is an Operating System as Fast As Possible - YouTube](https://www.youtube.com/watch?v=pVzRTmdd9j0)
* `Article` [Operating system - Wikipedia](https://en.wikipedia.org/wiki/Operating_system)
* `Article` [Operating System - Overview - Tutorialspoint](https://www.tutorialspoint.com/operating_system/os_overview.htm)

**Linux: time**
* `Article` [Operating Systems Tutorial | Sophia Learning](https://www.sophia.org/tutorials/operating-systems)
* `Article` [Principles of operating systems](http://www.toves.org/books/os/index.html)
* `Video` [Operating System Basics](https://www.youtube.com/watch?v=9GDX-IyZ_C8&t=346s)
* `Video` [What is an Operating System as Fast As Possible - YouTube](https://www.youtube.com/watch?v=pVzRTmdd9j0)
* `Article` [Operating system - Wikipedia](https://en.wikipedia.org/wiki/Operating_system)
* `Article` [Operating System - Overview - Tutorialspoint](https://www.tutorialspoint.com/operating_system/os_overview.htm)

**Linux: signals**
* `Article` [Operating Systems Tutorial | Sophia Learning](https://www.sophia.org/tutorials/operating-systems)
* `Article` [Principles of operating systems](http://www.toves.org/books/os/index.html)
* `Video` [Operating System Basics](https://www.youtube.com/watch?v=9GDX-IyZ_C8&t=346s)
* `Video` [What is an Operating System as Fast As Possible - YouTube](https://www.youtube.com/watch?v=pVzRTmdd9j0)
* `Article` [Operating system - Wikipedia](https://en.wikipedia.org/wiki/Operating_system)
* `Article` [Operating System - Overview - Tutorialspoint](https://www.tutorialspoint.com/operating_system/os_overview.htm)

**Linux: process management**
* `Article` [Operating Systems Tutorial | Sophia Learning](https://www.sophia.org/tutorials/operating-systems)
* `Article` [Principles of operating systems](http://www.toves.org/books/os/index.html)
* `Video` [Operating System Basics](https://www.youtube.com/watch?v=9GDX-IyZ_C8&t=346s)
* `Video` [What is an Operating System as Fast As Possible - YouTube](https://www.youtube.com/watch?v=pVzRTmdd9j0)
* `Article` [Operating system - Wikipedia](https://en.wikipedia.org/wiki/Operating_system)
* `Article` [Operating System - Overview - Tutorialspoint](https://www.tutorialspoint.com/operating_system/os_overview.htm)

**Base linux concepts**
* `Article` [Operating Systems Tutorial | Sophia Learning](https://www.sophia.org/tutorials/operating-systems)
* `Article` [Principles of operating systems](http://www.toves.org/books/os/index.html)
* `Video` [Operating System Basics](https://www.youtube.com/watch?v=9GDX-IyZ_C8&t=346s)
* `Video` [What is an Operating System as Fast As Possible - YouTube](https://www.youtube.com/watch?v=pVzRTmdd9j0)
* `Article` [Operating system - Wikipedia](https://en.wikipedia.org/wiki/Operating_system)
* `Article` [Operating System - Overview - Tutorialspoint](https://www.tutorialspoint.com/operating_system/os_overview.htm)

**Linux: threads**
* `Article` [Operating Systems Tutorial | Sophia Learning](https://www.sophia.org/tutorials/operating-systems)
* `Article` [Principles of operating systems](http://www.toves.org/books/os/index.html)
* `Video` [Operating System Basics](https://www.youtube.com/watch?v=9GDX-IyZ_C8&t=346s)
* `Video` [What is an Operating System as Fast As Possible - YouTube](https://www.youtube.com/watch?v=pVzRTmdd9j0)
* `Article` [Operating system - Wikipedia](https://en.wikipedia.org/wiki/Operating_system)
* `Article` [Operating System - Overview - Tutorialspoint](https://www.tutorialspoint.com/operating_system/os_overview.htm)

To see a interactive roadmap click on picture

[![alt text](https://raw.githubusercontent.com/infinite-education/linux-admin-roadmap/main/linux_administrator.png)](https://infinite.education/skillset/linux_administrator)

repo_name: infinite-education/linux-admin-roadmap


text:
![39438916879fc6e20fca16cbc962a44f272e102f (1)](https://user-images.githubusercontent.com/89364200/173401712-a37e77e5-3b64-4947-91ea-8326e63ba992.png)

---

# Index

- [What is Obsidian?](#what-is-obsidian)
- [Project Description](#project-description)
- [Usage](#usage)
- [Frequently Asked Questions (FAQ)](#faq)
- [Contribution Guide Lines](#contribution-guide-lines)
- [Special Thanks ](#special-thanks)

# What is Obsidian?

**The human brain is non-linear: we jump from idea to idea, all the time. Your second brain should work the same.**

**In Obsidian, making and following connections is frictionless. Tend to your notes like a gardener; at the end of the day, sit back and marvel at your own knowledge graph.**

- [Official Obsidian Website](https://obsidian.md)

---

---

# Project Description

Obsidian Template Hub started on the 13th of June 2022. It was set up to gather information on as many note templates as possible.

Because every person have a different workflow, note structure, thinking process etc. This place was set up so every one can add the templates they use for others to try, test, adopt or reconfigure to fit the induvial needs.

---

---

# Usage

I recommend you download the repository and add to you Obsidian to view how the templates will look like. Make sure to have all the required plugins for the notes you are testing.

You can also create a new Vault just to test the templates.

---

---

# FAQ

	❓ - How do i add the templates ?

A: Simply copy the templates folder or the specific template file to your vault.

	❓ - How do I use the templates ?

A: As a general rule, most templates need to be "Imported". In other words, make sure you have at least Obsidian native templates option enabled and configured.

	❓ - Can I contribute to the repository ?

A: YES! You are free to submit any template you use.

	❓ - How many templates can I add?

A: As many as you want, however make sure to follow the [guide lines](#guide-lines)

	❓ - Can i clone the repository?

A: Yes, just make sure to leave the credits for every one that contributed to the repository. You may link this repository contributors file.

	❓ - I have some templates but i don't use GitHub. How can i contribute.

A: You can message me directly on Discord (Zektor#5616) or in Obsidian Forum (Zektor).

	❓ - Is there any pre-requisite plugin to use the templates?

A: If a template requires a plugin the exact name will be at the top of the template so you can search on the application.

	❓ - My question is not listed here, how can i get an answer ?

A: You can use the Obsidian Forum thread dedicated to this repository and I or some one else that have the knowledge will answer it, or you can directly message me in the forum and in Discord (Zektor#5616).

	❓ - Where are the credits ?

A: At the moment I started this repository I'm the only one. But if any one contributes there will be a credits section linking to the repository of all participants

---

---

# Contribution Guide Lines

Following is a list of rule that must be followed for any pull request to be accepted.

1. If there is no folder for the template you want to add create the folder following the same rule. All folders start with a number followed by the specific type of template.

    1. EX: 1 - Daily Notes

    2. EX2: 2 - Book Notes

2. All templates must be added in it's specific folder. There will not be a folder with random notes. Nothing can be that random.

    1. EX: A daily note template must be placed inside the Daily Notes Folder

3. All templates must have the name with the following configuration, in case you have more than one template for the same type of note

    1. EX: YourGitHubName-DailyNotes-0

    2. EX2: YourGitHubName-DailyNotes-1

4. If your template requires any specific plugin, please leave at the top of the template the exact name to be found in Obsidian or the URL to where it can be downloaded.

5. When submitting the pull request, remember to leave the URL for the repository of your templates so proper credits can be given.

---

---

# Special Thanks

kmaasrud, for the project image desinged "Inspiration" and the project front page "README.md".

Obsidian Community Team, for the awesome example made with the Obsidian Hub.

---


text:
---
aliases: ["Topic: {{title}}", "Project:"]
created: ["{{date}} {{time}}"]
---
# 🚀 Meeting ->

---
## 📢 - Project information
Created::. {{date: DD-MM-YYYY}} {{time}}
Deadline::
Hibernating::.
Completion date expected::.
Completed::.
Type::.
Tags::.
Platform::.
Meeting Members ::.
# 📅 - Agenda
1.
# 🎯 - Goals
1.
# 📝 Discussion notes
-

# 💠 Action items
- [ ] Meeting Notes Distributed to the Team
- [ ] Tasks & Projects Completed, Processed or Delegated
- [ ] Key Dates Completed or Scheduled


text:
---
aliases: ["Topic: {{title}}"]
created: ["{{date}} {{time}}"]
---
# 🏦 Company ->

---
## 📢 - Project information
Created::. {{date: DD-MM-YYYY}} {{time}}
Type::
Tags::
# 📅 - Agenda
1.


text:
---
created: ["{{date}} {{time}}"]
tags: ["#Frame/"]
---

# 📚 Slip Box
## 1⃣ - Life
## 2⃣ - Happiness
## 3⃣ - Meaning
## 4⃣ - Work
## 5⃣ - Reading
## 6⃣ - Luck
## 7⃣ - Self-Improvement
## 8⃣ - Relationships
## 9⃣ - Helping People
## 1⃣0⃣ - Decision-Making
## 1⃣1⃣ - Money
## 1⃣2⃣ - Lifestyle
## 1⃣3⃣ - Writing
## 1⃣4⃣ - Social Skills
## 1⃣5⃣ - Productivity
## 1⃣6⃣ - Task Management
## 1⃣7⃣ - Studying & Learning
## 1⃣8⃣- Teaching

# Recommendation

If you are using dataview, I recommend using something  like this.
""
dataview
TABLE created AS "Date", status AS "Status" FROM #Reading AND !"0A_Templates"
""


text:
---
created: ["{{date}} {{time}}"]
tags: ["#Personal/"]
---

>Keeping track of a habit we what to get rid of or that we want to build helps us stay focused on the challenge.
>This is a 30 day Track for a habit that we want gain or lose

# 📅 My 30 Day's Challenge
## 📃 Challenge Information
Created:: {{date: DD-MM-YYYY}} {{time}}
Starting On::
Completed::
Type::
Tags::

## 🎯 The habit I will gain/lose
-

# ❗ Challenge Log

| #     | #   | #   | #   | #   | #   | #   | #   |
| ----- | --- | --- | --- | --- | --- | --- | --- |
| Day   | 1   | 2   | 3   | 4   | 5   | 6   | 7   |
| Notes |     |     |     |     |     |     |     |
| Day   | 8   | 9   | 10  | 11  | 12  | 13  | 14  |
| Notes |     |     |     |     |     |     |     |
| Day   | 15  | 16  | 17  | 18  | 19  | 20  | 21  |
| Notes |     |     |     |     |     |     |     |
| Day   | 22  | 23  | 24  | 25  | 26  | 27  | 28  |
| Notes |     |     |     |     |     |     |     |
| Day   | 29  | 30  |     |     |     |     |     |
| Notes      |     |     |     |     |     |     |     |

### Congratulations! You made it to 30 days! You see if you can keep going.


text:
---
created: ["{{date}} {{time}}"]
tags: ["#Log/MonthLylog"]
---

# 📆 Month {{date: MM/YYYY}}

## 📦 - Related Files
-

## 🔃 Reflection
-
### 🔷 Daily tasks completion rate

### 💯 Rating 0 -10
Happiness::
Productivity::
Relationships::
Focus::
### 📜 Events
**Biggest Personal Milestone**
-
**Biggest Career Milestone**
-
### 🚀 Projects
-
### 🏢 Career
-
### 📅 Future Plan
-
### ✅ Action
> ***Be thorough in planning!***
- [ ] Update Tasks lists

### 📚 To Read

### 💾 Information to retain from the daily logs


text:
---
created: ["{{date}} {{time}}"]
aliases: ["Games: {{title}}"]
---
## 🎮 Game Review ->
# ❓ Information
Type::.
Subject::.
Started on::.
Completed on::.
Perched on::.
Price::.
Tags::.

1. Player Bases
	1. [ ] Kids
	2. [ ] Everyone
	3. [ ] Mature
	4. [ ] Causal Players
	5. [ ] Pro Players
2. Graphics
	1. [ ] Potato
	2. [ ] Made in 1960
	3. [ ] Bad
	4. [ ] OK
	5. [ ] Good
	6. [ ] Beautiful
	7. [ ] Masterpiece
3. Price recommendation
	1. [ ] Free
	2. [ ] Don't buy it
	3. [ ] Refund it if you can
	4. [ ] Wait for sale
	5. [ ] Full price
4. Requirements
	1. [ ] Minimum
	2. [ ] Medium
	3. [ ] High end
	4. [ ] Super machine
5. Difficulty
	1. [ ] Easy
	2. [ ] Medium
	3. [ ] Hard
	4. [ ] Very hard
	5. [ ] Dark Souls
	6. [ ] Dark Souls Blind folded
6. Game Length
	1. [ ] Really short ( 0 -2 Hours)
	2. [ ] Short ( 2 - 8 Hours)
	3. [ ] Medium ( 8 - 16 Hours)
	4. [ ] Long ( 16+ Hours)
	5. [ ] Endless
7. Story
	1. [ ] It doesn't have one
	2. [ ] 5 year old can make it better
	3. [ ] Horrible
	4. [ ] OK
	5. [ ] Average
	6. [ ] Good
	7. [ ] Like watching a movie
8. Music or sound
	1. [ ] My ears are bleeding
	2. [ ] Horrible
	3. [ ] Decent
	4. [ ] Average
	5. [ ] Good
	6. [ ] Amazing
9. Gameplay
	1. [ ] Terrible
	2. [ ] OK
	3. [ ] Average
	4. [ ] Good
	5. [ ] Fantastic
10. Bugs
	1. [ ] The game is a bug
	2. [ ] Game braking bugs
	3. [ ] Lots of bugs
	4. [ ] Few bugs
	5. [ ] Nothing
11. Smurf's or Cheaters
	1. [ ] Like CS:GO
	2. [ ] Horrible
	3. [ ] Decent
	4. [ ] Average
	5. [ ] Good
	6. [ ] Amazing
12. Play style
	1. [ ] Single player
	2. [ ] Multi player
13. Final score
	1. 0/10