Compare commits
147 Commits
3bf9e043fe
...
feat/prelo
| Author | SHA1 | Date | |
|---|---|---|---|
|
e65fe8cd30
|
|||
|
21f725baf3
|
|||
|
c2a1995292
|
|||
|
af93330bf5
|
|||
|
e43ae63d8a
|
|||
|
add64ba889
|
|||
|
8d13297cb0
|
|||
|
eee95df47c
|
|||
|
1febeaf8a3
|
|||
|
088be26b48
|
|||
|
7f055f3607
|
|||
|
5a455fcdca
|
|||
|
846e28d92f
|
|||
|
ec3563093f
|
|||
|
0ec96b4461
|
|||
|
873504ecbf
|
|||
|
51f4a3462b
|
|||
|
0656d8a95d
|
|||
|
a79c795672
|
|||
|
159a40ecb5
|
|||
|
9d359640d3
|
|||
|
f0c60a4cea
|
|||
|
2c5ac7b475
|
|||
|
6a64de155d
|
|||
|
f5ba80fc16
|
|||
|
f8f48e9353
|
|||
|
f734e9ade4
|
|||
|
95e161aba9
|
|||
|
e4331e712a
|
|||
|
4804016fdf
|
|||
|
ccb6cdb454
|
|||
|
dade1f5d8d
|
|||
|
cecfdea07f
|
|||
|
7bea502bdf
|
|||
|
1fd539bcb9
|
|||
|
f940f4418d
|
|||
|
de476eb7ab
|
|||
|
2fbf21eaaf
|
|||
|
8ccbe2ebf1
|
|||
|
d4136a396a
|
|||
|
622a4038ac
|
|||
|
a65896b80d
|
|||
|
415703e21b
|
|||
|
89bf5eecd7
|
|||
|
b4059910ec
|
|||
|
7896f71534
|
|||
|
f9b30a3fe6
|
|||
|
31c80276de
|
|||
|
840ba4c10c
|
|||
|
53bf28b208
|
|||
|
d651e3a20c
|
|||
|
fb376a4906
|
|||
|
cd69d86246
|
|||
|
1ae1eeb159
|
|||
|
5171fffab5
|
|||
|
ca1e99013d
|
|||
|
7c71c994f2
|
|||
|
70655a4d39
|
|||
|
1551799b88
|
|||
|
4ab0db973f
|
|||
|
a3a2748d15
|
|||
|
ce8897d578
|
|||
|
637562f920
|
|||
|
42aff1f455
|
|||
|
855f6b3c99
|
|||
|
8a50ae7e32
|
|||
|
1a3572e64c
|
|||
|
ad6e3fe9d8
|
|||
|
99b63592d0
|
|||
|
6c004d14bd
|
|||
|
a6b488d1a6
|
|||
|
0cef259ecc
|
|||
|
150bc17ed4
|
|||
|
c9e9c9be46
|
|||
|
90d8dc3428
|
|||
|
863d11cffd
|
|||
|
b3d965d220
|
|||
|
496205c6b4
|
|||
|
9552df4b4e
|
|||
|
9881584cdb
|
|||
|
867583d30c
|
|||
|
125768b01e
|
|||
|
320538ad17
|
|||
|
56a5539106
|
|||
|
56b1048622
|
|||
|
3e4d5c2633
|
|||
|
cdb7eb86a5
|
|||
|
6de2518f1f
|
|||
|
34580eeab4
|
|||
|
0dd03e544c
|
|||
|
84a6310189
|
|||
|
68f8c55817
|
|||
|
9c0d592a24
|
|||
|
56349561f9
|
|||
|
702282d11f
|
|||
|
46856a9399
|
|||
|
eecf9b8db8
|
|||
|
1c891d971f
|
|||
|
6dfa664807
|
|||
|
5a27be5a3c
|
|||
|
8687daecfd
|
|||
|
6b5fe4bc2f
|
|||
|
c86bae36ad
|
|||
|
ef40e8078c
|
|||
|
80fc1cdc4d
|
|||
|
331de40dfd
|
|||
|
f3ee6607e7
|
|||
|
eec66b13ca
|
|||
|
9fc218feb1
|
|||
|
9ed68d1f0b
|
|||
|
80cc8022eb
|
|||
|
6bf45b9c2b
|
|||
|
860d070c55
|
|||
|
7e49d23736
|
|||
|
69fb34c2ba
|
|||
|
6664de6c07
|
|||
|
b93515ff32
|
|||
|
230042cc7b
|
|||
|
98acc8543c
|
|||
|
eea21cea1e
|
|||
|
fb8136f3b6
|
|||
|
e84c39030d
|
|||
|
75308cb264
|
|||
|
9b81a0bf18
|
|||
|
005a306fc6
|
|||
|
cb13ca0a3b
|
|||
|
5685830cba
|
|||
|
1f9b38306c
|
|||
|
9568cfe177
|
|||
|
18619efe39
|
|||
|
719221d74f
|
|||
|
5d95307ae2
|
|||
|
1b017d919a
|
|||
|
ce5ec9aace
|
|||
|
668dc8683b
|
|||
|
65dc5991c0
|
|||
|
05be03225d
|
|||
|
52dd703fa6
|
|||
|
e40ec28509
|
|||
|
1cb8f3ea65
|
|||
|
922a0f5d47
|
|||
|
94c32a3b30
|
|||
|
3024c3de32
|
|||
|
d936a8f96b
|
|||
|
1eb32828ec
|
|||
|
bf6236e60b
|
|||
|
26c91c030a
|
@@ -4,7 +4,7 @@ on:
|
|||||||
push:
|
push:
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
Build Image:
|
BuildImage:
|
||||||
runs-on: [ubuntu-latest, amd]
|
runs-on: [ubuntu-latest, amd]
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
|
|||||||
4
.gitignore
vendored
@@ -2,3 +2,7 @@
|
|||||||
__pycache__/
|
__pycache__/
|
||||||
|
|
||||||
.env
|
.env
|
||||||
|
.vs/
|
||||||
|
.venv/
|
||||||
|
*.tmp
|
||||||
|
testing/
|
||||||
|
|||||||
@@ -1,6 +0,0 @@
|
|||||||
{
|
|
||||||
"ExpandedNodes": [
|
|
||||||
""
|
|
||||||
],
|
|
||||||
"PreviewInSolutionExplorer": false
|
|
||||||
}
|
|
||||||
BIN
.vs/slnx.sqlite
8
.well-known/assetlinks.json
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
[{
|
||||||
|
"relation": ["delegate_permission/common.handle_all_urls"],
|
||||||
|
"target": {
|
||||||
|
"namespace": "android_app",
|
||||||
|
"package_name": "au.woodburn.nathan",
|
||||||
|
"sha256_cert_fingerprints": ["D8:97:22:C4:C5:AA:AC:6D:7B:57:F0:19:FF:A1:E7:2A:92:71:EE:CF:1F:E1:AF:5A:87:22:0D:00:76:9D:83:80"]
|
||||||
|
}
|
||||||
|
}]
|
||||||
6
.well-known/wallets/.BTC.proof
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
I hereby confirm that I am the owner of the Bitcoin address bc1qzsp3wc2nwayl8awun57tggjn92w0awp9mzsn90.
|
||||||
|
Nathan.Woodburn/
|
||||||
|
--------------------
|
||||||
|
HzEsSV17nmbMwnz55sW6jW/AnmYxW0TAdgiJsYRUyWs7WjBaGlzrvXkH1R8qosQXSvQ1nZNe9dS5SUCZtbNZzuM=
|
||||||
|
--------------------
|
||||||
|
You can verify this signature by pasting it into a signature verification tool such as https://www.verifybitcoinmessage.com/. Don't forget to remove trailing newlines.
|
||||||
6
.well-known/wallets/.ETH.proof
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
I hereby confirm that I am the owner of the EVM address 0x6cB4B39bEc23a921C9a20D061Bf17d4640B0d39e.
|
||||||
|
Nathan.Woodburn/
|
||||||
|
--------------------
|
||||||
|
0x254919e1f2035a4f04614da9e1fbc1f45dab31b03b0baf1bb3325a9f9e437f1f787b99ebc6716b822fc190284c2c678054c91835492ff0df239ec60f6166587f1c
|
||||||
|
--------------------
|
||||||
|
You can verify this signature by pasting it into a signature verification tool such as https://etherscan.io/verifiedSignatures
|
||||||
13
.well-known/wallets/.SOL.proof
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
I hereby confirm that I am the owner of the SOL address AJsPEEe6S7XSiVcdZKbeV8GRp1QuhFUsG8mLrqL4XgiU.
|
||||||
|
Nathan.Woodburn/
|
||||||
|
--------------------
|
||||||
|
[71,63,207,190,90,17,145,39,4,98,110,176,86,140,143,107,237,96,24,43,2,116,21,70,47,98,192,24,193,210,89,220,30,128,219,105,9,35,146,188,216,143,164,32,255,44,146,249,153,33,54,214,203,159,80,26,107,165,217,240,153,61,39,0]
|
||||||
|
--------------------
|
||||||
|
0x473fcfbe5a11912704626eb0568c8f6bed60182b027415462f62c018c1d259dc1e80db69092392bcd88fa420ff2c92f9992136d6cb9f501a6ba5d9f0993d2700
|
||||||
|
--------------------
|
||||||
|
2Rd2EkAUwC8u4DtCZ5BXTkJEvWxozrxmcEzn7VbJFFbL81YLQngH9V1bTu3vivaQz7ZGqs5YtpPWxomsYeE7Ws6F
|
||||||
|
--------------------
|
||||||
|
Rz/PvloRkScEYm6wVoyPa+1gGCsCdBVGL2LAGMHSWdwegNtpCSOSvNiPpCD/LJL5mSE21sufUBprpdnwmT0nAA==
|
||||||
|
--------------------
|
||||||
|
You can verify this signature by pasting it into a signature verification tool such as https://amacar.github.io/solana-tools/#verify-message
|
||||||
|
Please note I have included various formats for the signature to make it easier to verify.
|
||||||
@@ -23,5 +23,10 @@
|
|||||||
"TON": "Toncoin (TON)",
|
"TON": "Toncoin (TON)",
|
||||||
"OP": "Optimism (OP)",
|
"OP": "Optimism (OP)",
|
||||||
"IAA": "IRIS (IAA)",
|
"IAA": "IRIS (IAA)",
|
||||||
"NEAR": "NEAR Protocol (NEAR)"
|
"NEAR": "NEAR Protocol (NEAR)",
|
||||||
|
"KAS": "Kasper (KAS)",
|
||||||
|
"XLM": "Stellar (XLM)",
|
||||||
|
"APT": "Aptos (APT)",
|
||||||
|
"TRX": "Tron (TRX)",
|
||||||
|
"BCH": "Bitcoin Cash (BCH)"
|
||||||
}
|
}
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"ETH":"woodburn.au",
|
"ETH":"woodburn.au",
|
||||||
"HNS":"woodburn",
|
"HNS":"nathan.woodburn",
|
||||||
"SOL":"woodburn.sol",
|
"SOL":"woodburn.sol",
|
||||||
"ADA": "$nathanwoodburn",
|
"ADA": "$nathanwoodburn",
|
||||||
"MATIC": "woodburn.au",
|
"MATIC": "woodburn.au",
|
||||||
|
|||||||
@@ -19,6 +19,21 @@
|
|||||||
"name": "USDC",
|
"name": "USDC",
|
||||||
"chain": "SOL"
|
"chain": "SOL"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"symbol": "USDC",
|
||||||
|
"name": "USDC",
|
||||||
|
"chain": "NOBLE"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"symbol": "PYUSD",
|
||||||
|
"name": "PayPal USD",
|
||||||
|
"chain": "ETH"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"symbol": "PYUSD",
|
||||||
|
"name": "PayPal USD",
|
||||||
|
"chain": "SOL"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"symbol": "WDBRN",
|
"symbol": "WDBRN",
|
||||||
"name": "Woodburn",
|
"name": "Woodburn",
|
||||||
@@ -63,6 +78,11 @@
|
|||||||
"symbol": "BTC",
|
"symbol": "BTC",
|
||||||
"name": "Bitcoin Lightning",
|
"name": "Bitcoin Lightning",
|
||||||
"chain": "null",
|
"chain": "null",
|
||||||
"address": "hushedmercury55@walletofsatoshi.com"
|
"address": "thinbadger6@primal.net"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"symbol": "stWDBRN",
|
||||||
|
"name": "Woodburn Vault",
|
||||||
|
"chain": "SOL"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
@@ -1 +1 @@
|
|||||||
addr1qyudjff2lfuxjjjfz0y542drw4srxq2xxtgrq22vm8ymvwwagq028esaz4rsexct8zzsuds29e03eaykahlvhdx0k9es4gnk27
|
addr1qy5l7vmx9l2uexv44hzjak4zmwecee4hht0k6shtk5jh7cjzu99z8vx5n467fquzradx7p42grdylv3zq2cgfw0f32fs443hxs
|
||||||
1
.well-known/wallets/APT
Normal file
@@ -0,0 +1 @@
|
|||||||
|
0x372b3c513d149e5511912eba22e31f07d2b289e20ba84b2e0b7756e7a00295c3
|
||||||
1
.well-known/wallets/BCH
Normal file
@@ -0,0 +1 @@
|
|||||||
|
qpsgs9daa6e2mn4v0u02pfunsme68a5uayn7e8knug
|
||||||
@@ -1 +1 @@
|
|||||||
bc1qhs94zzcw64qnwq4hvk056rwxwvgrkd7tq7d4xw
|
bc1qzsp3wc2nwayl8awun57tggjn92w0awp9mzsn90
|
||||||
1
.well-known/wallets/DASH
Normal file
@@ -0,0 +1 @@
|
|||||||
|
Xpr5auWs1waBmWT3XsWXwzu8Di32x8VfH2
|
||||||
@@ -1 +1 @@
|
|||||||
hs1qk4sq6mk3kcshp02xgchukv09m38czdnq5qv76w
|
hs1qh7uzytf2ftwkd9dmjjs7az9qfver5m7dd7x4ej
|
||||||
1
.well-known/wallets/KAS
Normal file
@@ -0,0 +1 @@
|
|||||||
|
kaspa:qzl7av7gq5j594pcs2gn6zf2xadpmhdm90nygjstvte0n6gt9f4fgx0w2dhm8
|
||||||
1
.well-known/wallets/NOBLE
Normal file
@@ -0,0 +1 @@
|
|||||||
|
noble1ugraczuyfmxy8k38nps4fu7e5derryzxywjul2
|
||||||
@@ -1 +1 @@
|
|||||||
UQAtpYb-yOaTSA40mJRvUxKv1WVeIPi-g_4Jqn0oWYypsQIf
|
UQDqC1B0a3S9th8ncaQHYJ689dnu9c0zJXeV727UMak9WbBm
|
||||||
|
|||||||
1
.well-known/wallets/TRX
Normal file
@@ -0,0 +1 @@
|
|||||||
|
THjwavxGZahj1scVw75fhGP2HCAcjNxwsK
|
||||||
1
.well-known/wallets/XLM
Normal file
@@ -0,0 +1 @@
|
|||||||
|
GCK4PA53V26MNP6U57EPK7EA42TBQMGJ4TUPMUPLLQNPZ64YX3XVLZGQ
|
||||||
12
.well-known/xrp-ledger.toml
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
[METADATA]
|
||||||
|
modified = 2024-07-02T00:00:00.000Z
|
||||||
|
expires = 2050-07-02T00:00:00.000Z
|
||||||
|
|
||||||
|
[[ACCOUNTS]]
|
||||||
|
address = "rKzdnYvwDyeki5VCgMwjuofjBjAbg3DJnB"
|
||||||
|
desc = "Nathan.Woodburn/ (Twitter: @nathanwoodburn)"
|
||||||
|
|
||||||
|
[[PRINCIPALS]]
|
||||||
|
name = "Nathan Woodburn"
|
||||||
|
email = "xrp@nathan.woodburn.au"
|
||||||
|
social_1 = "https://nathan.woodburn.au"
|
||||||
@@ -4,7 +4,7 @@ WORKDIR /app
|
|||||||
|
|
||||||
COPY requirements.txt /app
|
COPY requirements.txt /app
|
||||||
RUN --mount=type=cache,target=/root/.cache/pip \
|
RUN --mount=type=cache,target=/root/.cache/pip \
|
||||||
pip3 install -r requirements.txt
|
python3 -m pip install -r requirements.txt
|
||||||
|
|
||||||
COPY . /app
|
COPY . /app
|
||||||
|
|
||||||
@@ -14,4 +14,4 @@ COPY . /app
|
|||||||
ENTRYPOINT ["python3"]
|
ENTRYPOINT ["python3"]
|
||||||
CMD ["main.py"]
|
CMD ["main.py"]
|
||||||
|
|
||||||
FROM builder as dev-envs
|
FROM builder AS dev-envs
|
||||||
@@ -1 +0,0 @@
|
|||||||
include: [".well-known"]
|
|
||||||
35
addCoin.py
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
import os
|
||||||
|
import json
|
||||||
|
|
||||||
|
if not os.path.exists('.well-known/wallets'):
|
||||||
|
os.makedirs('.well-known/wallets')
|
||||||
|
|
||||||
|
def addCoin(token:str, name:str, address:str):
|
||||||
|
with open('.well-known/wallets/'+token.upper(),'w') as f:
|
||||||
|
f.write(address)
|
||||||
|
|
||||||
|
with open('.well-known/wallets/.coins','r') as f:
|
||||||
|
coins = json.load(f)
|
||||||
|
|
||||||
|
coins[token.upper()] = f'{name} ({token.upper()})'
|
||||||
|
with open('.well-known/wallets/.coins','w') as f:
|
||||||
|
f.write(json.dumps(coins, indent=4))
|
||||||
|
|
||||||
|
def addDomain(token:str, domain:str):
|
||||||
|
with open('.well-known/wallets/.domains','r') as f:
|
||||||
|
domains = json.load(f)
|
||||||
|
|
||||||
|
domains[token.upper()] = domain
|
||||||
|
with open('.well-known/wallets/.domains','w') as f:
|
||||||
|
f.write(json.dumps(domains, indent=4))
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
# Ask user for token
|
||||||
|
token = input('Enter token symbol: ')
|
||||||
|
name = input('Enter token name: ')
|
||||||
|
address = input('Enter wallet address: ')
|
||||||
|
addCoin(token, name, address)
|
||||||
|
|
||||||
|
if input('Do you want to add a domain? (y/n): ').lower() == 'y':
|
||||||
|
domain = input('Enter domain: ')
|
||||||
|
addDomain(token, domain)
|
||||||
102
blog.py
Normal file
@@ -0,0 +1,102 @@
|
|||||||
|
import os
|
||||||
|
from flask import render_template
|
||||||
|
from datetime import datetime
|
||||||
|
import markdown
|
||||||
|
from markdown.extensions.codehilite import CodeHiliteExtension
|
||||||
|
from markdown.extensions.fenced_code import FencedCodeExtension
|
||||||
|
from bs4 import BeautifulSoup
|
||||||
|
import re
|
||||||
|
|
||||||
|
|
||||||
|
def list_blog_page_files():
|
||||||
|
blog_pages = os.listdir("data/blog")
|
||||||
|
# Remove .md extension
|
||||||
|
blog_pages = [page.removesuffix(".md") for page in blog_pages if page.endswith(".md")]
|
||||||
|
|
||||||
|
return blog_pages
|
||||||
|
|
||||||
|
|
||||||
|
def render_blog_page(date,handshake_scripts=None):
|
||||||
|
# Convert md to html
|
||||||
|
if not os.path.exists(f"data/blog/{date}.md"):
|
||||||
|
return render_template("404.html"), 404
|
||||||
|
|
||||||
|
with open(f"data/blog/{date}.md", "r") as f:
|
||||||
|
content = f.read()
|
||||||
|
# Get the title from the file name
|
||||||
|
title = date.removesuffix(".md").replace("_", " ")
|
||||||
|
# Convert the md to html
|
||||||
|
content = markdown.markdown(content, extensions=['sane_lists', 'codehilite', 'fenced_code'])
|
||||||
|
# Add target="_blank" to all links
|
||||||
|
content = content.replace('<a href="', '<a target="_blank" href="')
|
||||||
|
|
||||||
|
content = content.replace("<h4", "<h4 style='margin-bottom:0px;'")
|
||||||
|
|
||||||
|
content = fix_numbered_lists(content)
|
||||||
|
|
||||||
|
return render_template(
|
||||||
|
"blog/template.html",
|
||||||
|
title=title,
|
||||||
|
content=content,
|
||||||
|
handshake_scripts=handshake_scripts,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def fix_numbered_lists(html):
|
||||||
|
soup = BeautifulSoup(html, 'html.parser')
|
||||||
|
|
||||||
|
# Find the <p> tag containing numbered steps
|
||||||
|
paragraphs = soup.find_all('p')
|
||||||
|
for p in paragraphs:
|
||||||
|
content = p.decode_contents()
|
||||||
|
|
||||||
|
# Check for likely numbered step structure
|
||||||
|
if re.search(r'1\.\s', content):
|
||||||
|
# Split into pre-list and numbered steps
|
||||||
|
# Match: <br>, optional whitespace, then a number and dot
|
||||||
|
parts = re.split(r'(?:<br\s*/?>)?\s*(\d+)\.\s', content)
|
||||||
|
|
||||||
|
# Result: [pre-text, '1', step1, '2', step2, ..., '10', step10]
|
||||||
|
pre_text = parts[0].strip()
|
||||||
|
steps = parts[1:]
|
||||||
|
|
||||||
|
# Assemble the ordered list
|
||||||
|
ol_items = []
|
||||||
|
for i in range(0, len(steps), 2):
|
||||||
|
if i+1 < len(steps):
|
||||||
|
step_html = steps[i+1].strip()
|
||||||
|
ol_items.append(f"<li style='list-style: auto;'>{step_html}</li>")
|
||||||
|
|
||||||
|
# Build the final list HTML
|
||||||
|
ol_html = "<ol>\n" + "\n".join(ol_items) + "\n</ol>"
|
||||||
|
|
||||||
|
# Rebuild paragraph with optional pre-text
|
||||||
|
new_html = f"{pre_text}<br />\n{ol_html}" if pre_text else ol_html
|
||||||
|
|
||||||
|
# Replace old <p> with parsed version
|
||||||
|
new_fragment = BeautifulSoup(new_html, 'html.parser')
|
||||||
|
p.replace_with(new_fragment)
|
||||||
|
break # Only process the first matching <p>
|
||||||
|
|
||||||
|
return str(soup)
|
||||||
|
|
||||||
|
|
||||||
|
def render_blog_home(handshake_scripts=None):
|
||||||
|
# Get a list of pages
|
||||||
|
blog_pages = list_blog_page_files()
|
||||||
|
# Create a html list of pages
|
||||||
|
blog_pages = [
|
||||||
|
f"""<li class="list-group-item">
|
||||||
|
|
||||||
|
<p style="margin-bottom: 0px;"><a href='/blog/{page}'>{page.replace("_"," ")}</a></p>
|
||||||
|
</li>"""
|
||||||
|
for page in blog_pages
|
||||||
|
]
|
||||||
|
# Join the list
|
||||||
|
blog_pages = "\n".join(blog_pages)
|
||||||
|
# Render the template
|
||||||
|
return render_template(
|
||||||
|
"blog/blog.html",
|
||||||
|
blogs=blog_pages,
|
||||||
|
handshake_scripts=handshake_scripts,
|
||||||
|
)
|
||||||
36
cleanSite.py
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
import os
|
||||||
|
|
||||||
|
def cleanSite(path:str):
|
||||||
|
# Check if the file is sitemap.xml
|
||||||
|
if path.endswith('sitemap.xml'):
|
||||||
|
# Open the file
|
||||||
|
with open(path, 'r') as f:
|
||||||
|
# Read the content
|
||||||
|
content = f.read()
|
||||||
|
# Replace all .html with empty string
|
||||||
|
content = content.replace('.html', '')
|
||||||
|
# Write the content back to the file
|
||||||
|
with open(path, 'w') as f:
|
||||||
|
f.write(content)
|
||||||
|
# Skip the file
|
||||||
|
return
|
||||||
|
|
||||||
|
# If the file is not an html file, skip it
|
||||||
|
if not path.endswith('.html'):
|
||||||
|
if os.path.isdir(path):
|
||||||
|
for file in os.listdir(path):
|
||||||
|
cleanSite(path + '/' + file)
|
||||||
|
|
||||||
|
return
|
||||||
|
|
||||||
|
# Open the file
|
||||||
|
with open(path, 'r') as f:
|
||||||
|
# Read and remove all .html
|
||||||
|
content = f.read().replace('.html"', '"')
|
||||||
|
# Write the cleaned content back to the file
|
||||||
|
with open(path, 'w') as f:
|
||||||
|
f.write(content)
|
||||||
|
|
||||||
|
|
||||||
|
for file in os.listdir('templates'):
|
||||||
|
cleanSite('templates/' + file)
|
||||||
27
data/blog/Fingertip_on_Linux_Mint.md
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
[View video tutorial](https://cloud.woodburn.au/s/n7Q3k7QyEnwygjX)
|
||||||
|
|
||||||
|
|
||||||
|
Install prerequisites:
|
||||||
|
```bash
|
||||||
|
sudo apt install libfuse2 libunbound-dev
|
||||||
|
```
|
||||||
|
|
||||||
|
Download latest release AppImage from SANE version of Fingertip:
|
||||||
|
[Fingertip Github Repo](https://github.com/randomlogin/fingertip)
|
||||||
|
|
||||||
|
Make the AppImage executable:
|
||||||
|
```bash
|
||||||
|
chmod +x Fingertip-*.AppImage
|
||||||
|
```
|
||||||
|
Run the AppImage:
|
||||||
|
```bash
|
||||||
|
./Fingertip-*.AppImage
|
||||||
|
```
|
||||||
|
|
||||||
|
You should see the fingertip notification icon in the system tray, right-click and select Options > Help. This should open a browser window with the Fingertip status page.
|
||||||
|
Go to the "Manual Setup" page, download the certificate and copy the proxy pac URL.
|
||||||
|
|
||||||
|
Open the system settings > Network > Network Proxy. Set the Method to Automatic and paste in the URL.
|
||||||
|
|
||||||
|
Next we need to import the certificate authority into your preferred browser.
|
||||||
|
You can usually just open the settings in the browser and search for "Certificates". Then import the certificate into the "Authorities" tab and make sure you select the option to trust it for identifying websites.
|
||||||
28
data/blog/Nameserver_Setup_On_BobWallet.md
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
|
||||||
|
Setting up a Nameserver for your domains held in BobWallet is needed in order to use your domains for websites or other services.
|
||||||
|
This guide will walk you through the process of setting up a nameserver using the BobWallet app.
|
||||||
|
|
||||||
|
|
||||||
|
<br>
|
||||||
|
#### Prerequisites
|
||||||
|
* [BobWallet](https://bobwallet.io) with at least 1 domain
|
||||||
|
|
||||||
|
Once you have your domain in BobWallet, you can set up a nameserver using the HNSAU service. This is a free service that allows you to create a nameserver for your domains.
|
||||||
|
1. Create an account at [HNSAU's free Nameserver service](https://domains.hns.au)
|
||||||
|
2. In the Add Site section, enter your domain name. Ensure you don't include any protocols (http:// or https://), subdomains (www.), or trailing slashes (/).
|
||||||
|
3. You should now see your domain listed in the External Domains section.
|
||||||
|
4. Click on the manage button next to the domain name to view its details. Keep this page open, as you will need to copy the nameserver and DS info later.
|
||||||
|
5. In BobWallet, go to Domain Manger and select the domain you want to set up a nameserver for.
|
||||||
|
6. In the Records section for the domain, remove any existing records with TYPE NS or DS.
|
||||||
|
7. Click on the Add Record button and select the TYPE NS. Add the NS value from the HNSAU page. Make sure you include the trailing dot (.) at the end of the nameserver. Repeat this for all the Nameservers listed on the HNSAU page.
|
||||||
|
- ns1.australia.
|
||||||
|
- ns2.australia.
|
||||||
|
8. Click on the Add Record button again and select the TYPE DS. Add the DS value from the DNSSEC section in HNSAU. This DS value is unique to each domain and is used to verify the authenticity of the nameserver.
|
||||||
|
9. Submit the changes and wait for the DNS records to propagate onchain. This will take up to 7 hrs (depending on the next tree update).
|
||||||
|
10. You can now use the HNSAU nameserver to point your domain to any website or service.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
[View demonstration video](https://youtu.be/Ong8A7FDH24)
|
||||||
77
data/nathanwoodburn.asc
Normal file
@@ -0,0 +1,77 @@
|
|||||||
|
-----BEGIN PGP PUBLIC KEY BLOCK-----
|
||||||
|
|
||||||
|
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
|
||||||
|
i0GVXA==
|
||||||
|
=W9Zx
|
||||||
|
-----END PGP PUBLIC KEY BLOCK-----
|
||||||
BIN
data/resume.pdf
Normal file
@@ -1,50 +1,70 @@
|
|||||||
[
|
[
|
||||||
{
|
{
|
||||||
"url": "https://nathan3dprinting.au",
|
"url": "https://nathan3dprinting.au",
|
||||||
"img": "/assets/img/favicon_trans.webp",
|
"img": "/assets/img/external/nathan3dprinting.webp",
|
||||||
"name": "Nathan 3D Printing",
|
"name": "Nathan 3D Printing",
|
||||||
"description": "Offering 3D Printing and CAD modelling services to the Canberra region"
|
"description": "Offering 3D Printing and CAD modelling services to the Canberra region",
|
||||||
|
"enabled": false
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"url": "https://domains.hns.au",
|
"url": "https://domains.hns.au",
|
||||||
"img": "/assets/img/HNSAU.webp",
|
"img": "/assets/img/external/HNSAU.webp",
|
||||||
"name": "HNSAU Registry",
|
"name": "HNSAU Registry",
|
||||||
"description": "An easy to use DNS provider and domain reselling platform"
|
"description": "An easy to use DNS provider and domain reselling platform"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"url": "https://hns.au",
|
"url": "https://hns.au",
|
||||||
"img": "/assets/img/HNSAU.webp",
|
"img": "/assets/img/external/HNSAU.webp",
|
||||||
"name": "HNSAU",
|
"name": "HNSAU",
|
||||||
"description": "The group for Handshake enthusiasts in Australia"
|
"description": "The group for Handshake enthusiasts in Australia"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"url": "https://hnshosting.au",
|
"url": "https://hnshosting.au",
|
||||||
"img": "/assets/img/logo.png",
|
"img": "/favicon.png",
|
||||||
"name": "HNS Hosting",
|
"name": "HNS Hosting",
|
||||||
"description": "Simple Wordpress hosting for Handshake domains with builtin SSL using DANE"
|
"description": "Simple Wordpress hosting for Handshake domains with builtin SSL using DANE"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"url": "https://firewallet.au",
|
"url": "https://firewallet.au",
|
||||||
"img": "/assets/img/firewallet.png",
|
"img": "/assets/img/external/firewallet.png",
|
||||||
"name": "FireWallet",
|
"name": "FireWallet",
|
||||||
"description": "An opensource Handshake wallet that is Fire!"
|
"description": "An opensource Handshake wallet that is Fire!"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"url": "https://shakecities.com",
|
"url": "https://shakecities.com",
|
||||||
"img": "/assets/img/HNSW.png",
|
"img": "/assets/img/external/HNSW.png",
|
||||||
"name": "ShakeCities",
|
"name": "ShakeCities",
|
||||||
"description": "A single page website creator where each user's page on their free HNS domain"
|
"description": "A single page website creator where each user's page on their free HNS domain"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"url": "https://git.woodburn.au",
|
"url": "https://git.woodburn.au",
|
||||||
"img": "/assets/img/logo.png",
|
"img": "/favicon.png",
|
||||||
"name": "Git Server",
|
"name": "Git Server",
|
||||||
"description": "Selfhosted Git server to host my repos with custom hosted CI/CD"
|
"description": "Selfhosted Git server to host my repos with custom hosted CI/CD"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"url": "https://linkr",
|
"url": "https://linkr",
|
||||||
"img": "/assets/img/logo.png",
|
"img": "/favicon.png",
|
||||||
"name": "LINKR/",
|
"name": "LINKR/",
|
||||||
"description": "A free link shortener with a Handshake TLD and using DNS for authentication"
|
"description": "A free link shortener with a Handshake TLD and using DNS for authentication",
|
||||||
|
"enabled": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"url": "https://faucet.woodburn.au",
|
||||||
|
"img": "/favicon.png",
|
||||||
|
"name": "HNS Domain Faucet",
|
||||||
|
"description": "A service providing free Handshake TLDs to allow for quick testing for new users"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"url":"https://hnsdoh.com",
|
||||||
|
"img": "/assets/img/external/HNS.png",
|
||||||
|
"name": "HNS DoH",
|
||||||
|
"description": "A DNS over HTTPS resolver for Handshake domains"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"url": "https://ipfs.hnsproxy.au",
|
||||||
|
"img": "https://ipfs.hnsproxy.au/fireportal.png",
|
||||||
|
"name": "FirePortal",
|
||||||
|
"description": "A Handshake domain IPFS gateway that allows you to access IPFS content using Handshake domains"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
2895
dnsedit.html
102
mail.py
Normal file
@@ -0,0 +1,102 @@
|
|||||||
|
import smtplib
|
||||||
|
import re
|
||||||
|
from email.mime.text import MIMEText
|
||||||
|
from email.mime.multipart import MIMEMultipart
|
||||||
|
from email.utils import formataddr
|
||||||
|
from flask import jsonify
|
||||||
|
import os
|
||||||
|
|
||||||
|
|
||||||
|
# This is used to send emails via API
|
||||||
|
# The process should be something like this
|
||||||
|
# curl --request POST \
|
||||||
|
# --url https://nathan.c.woodburn.au/api/email \
|
||||||
|
# --header 'Content-Type: application/json' \
|
||||||
|
# --data '{
|
||||||
|
# "key":"api-key",
|
||||||
|
# "to": "recipient@nathan.woodburn.au",
|
||||||
|
# "from": "sender@nathan.woodburn.au",
|
||||||
|
# "sender":"Nathan.Woodburn/",
|
||||||
|
# "subject":"Test email from api",
|
||||||
|
# "body":"G'\''day\nThis is a test email from my website api\n\nRegards,\nNathan.Woodburn/"
|
||||||
|
# }'
|
||||||
|
|
||||||
|
def validateSender(email):
|
||||||
|
domains = os.getenv("EMAIL_DOMAINS").split(",")
|
||||||
|
for domain in domains:
|
||||||
|
if re.match(r".+@" + domain, email):
|
||||||
|
return True
|
||||||
|
|
||||||
|
return False
|
||||||
|
|
||||||
|
def sendEmail(data):
|
||||||
|
fromEmail = "noreply@woodburn.au"
|
||||||
|
if "from" in data:
|
||||||
|
fromEmail = data["from"]
|
||||||
|
|
||||||
|
if not validateSender(fromEmail):
|
||||||
|
return jsonify({
|
||||||
|
"status": 400,
|
||||||
|
"message": "Bad request 'from' email invalid"
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
if "to" not in data:
|
||||||
|
return jsonify({
|
||||||
|
"status": 400,
|
||||||
|
"message": "Bad request 'to' json data missing"
|
||||||
|
})
|
||||||
|
to = data["to"]
|
||||||
|
|
||||||
|
if "subject" not in data:
|
||||||
|
return jsonify({
|
||||||
|
"status": 400,
|
||||||
|
"message": "Bad request 'subject' json data missing"
|
||||||
|
})
|
||||||
|
subject = data["subject"]
|
||||||
|
|
||||||
|
if "body" not in data:
|
||||||
|
return jsonify({
|
||||||
|
"status": 400,
|
||||||
|
"message": "Bad request 'body' json data missing"
|
||||||
|
})
|
||||||
|
body = data["body"]
|
||||||
|
|
||||||
|
if not re.match(r"[^@]+@[^@]+\.[^@]+", to):
|
||||||
|
raise ValueError("Invalid recipient email address.")
|
||||||
|
|
||||||
|
if not subject:
|
||||||
|
raise ValueError("Subject cannot be empty.")
|
||||||
|
|
||||||
|
if not body:
|
||||||
|
raise ValueError("Body cannot be empty.")
|
||||||
|
|
||||||
|
fromName = "Nathan Woodburn"
|
||||||
|
if 'sender' in data:
|
||||||
|
fromName = data['sender']
|
||||||
|
|
||||||
|
# Create the email message
|
||||||
|
msg = MIMEMultipart()
|
||||||
|
msg['From'] = formataddr((fromName, fromEmail))
|
||||||
|
msg['To'] = to
|
||||||
|
msg['Subject'] = subject
|
||||||
|
msg.attach(MIMEText(body, 'plain'))
|
||||||
|
|
||||||
|
# Sending the email
|
||||||
|
try:
|
||||||
|
with smtplib.SMTP_SSL(os.getenv("EMAIL_SMTP"), 465) as server:
|
||||||
|
server.login(os.getenv("EMAIL_USER"), os.getenv("EMAIL_PASS"))
|
||||||
|
server.sendmail(fromEmail, to, msg.as_string())
|
||||||
|
print("Email sent successfully.")
|
||||||
|
return jsonify({
|
||||||
|
"status": 200,
|
||||||
|
"message": "Send email successfully"
|
||||||
|
})
|
||||||
|
except Exception as e:
|
||||||
|
return jsonify({
|
||||||
|
"status": 500,
|
||||||
|
"error": "Sending email failed",
|
||||||
|
"exception":e
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
48
now.py
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
import os
|
||||||
|
from flask import render_template
|
||||||
|
from datetime import datetime
|
||||||
|
|
||||||
|
|
||||||
|
def list_now_page_files():
|
||||||
|
now_pages = os.listdir("templates/now")
|
||||||
|
now_pages = [
|
||||||
|
page for page in now_pages if page != "template.html" and page != "old.html"
|
||||||
|
]
|
||||||
|
now_pages.sort(reverse=True)
|
||||||
|
return now_pages
|
||||||
|
|
||||||
|
def list_now_dates():
|
||||||
|
now_pages = list_now_page_files()
|
||||||
|
now_dates = [page.split(".")[0] for page in now_pages]
|
||||||
|
return now_dates
|
||||||
|
|
||||||
|
def get_latest_now_date(formatted=False):
|
||||||
|
if formatted:
|
||||||
|
date=list_now_dates()[0]
|
||||||
|
date = datetime.strptime(date, "%y_%m_%d")
|
||||||
|
date = date.strftime("%A, %B %d, %Y")
|
||||||
|
return date
|
||||||
|
return list_now_dates()[0]
|
||||||
|
|
||||||
|
#region Rendering
|
||||||
|
def render_now_page(date,handshake_scripts=None):
|
||||||
|
# If the date is not available, render the latest page
|
||||||
|
if date is None:
|
||||||
|
return render_latest_now(handshake_scripts=handshake_scripts)
|
||||||
|
# Remove .html
|
||||||
|
date = date.removesuffix(".html")
|
||||||
|
|
||||||
|
if not date in list_now_dates():
|
||||||
|
return render_template("404.html"), 404
|
||||||
|
|
||||||
|
|
||||||
|
date_formatted = datetime.strptime(date, "%y_%m_%d")
|
||||||
|
date_formatted = date_formatted.strftime("%A, %B %d, %Y")
|
||||||
|
return render_template(f"now/{date}.html",DATE=date_formatted,handshake_scripts=handshake_scripts)
|
||||||
|
|
||||||
|
|
||||||
|
def render_latest_now(handshake_scripts=None):
|
||||||
|
now_page = list_now_dates()[0]
|
||||||
|
return render_now_page(now_page,handshake_scripts=handshake_scripts)
|
||||||
|
|
||||||
|
#endregion
|
||||||
26
pwa/manifest.json
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
{
|
||||||
|
"short_name": "Nathan.Woodburn/",
|
||||||
|
"name": "Nathan.Woodburn/",
|
||||||
|
"icons": [
|
||||||
|
{
|
||||||
|
"src": "https://nathan.woodburn.au/assets/img/favicon/android-chrome-192x192.png",
|
||||||
|
"type": "image/png",
|
||||||
|
"sizes": "192x192"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"src": "https://nathan.woodburn.au/assets/img/favicon/android-chrome-512x512.png",
|
||||||
|
"type": "image/png",
|
||||||
|
"sizes": "512x512"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"start_url": "https://nathan.woodburn.au",
|
||||||
|
"background_color": "#000000",
|
||||||
|
"theme_color": "#000000",
|
||||||
|
"display": "fullscreen",
|
||||||
|
"orientation": "portrait",
|
||||||
|
"id": "nathanwoodburn",
|
||||||
|
"description": "Nathan.Woodburn/",
|
||||||
|
"scope": "https://nathan.woodburn.au",
|
||||||
|
"dir": "ltr",
|
||||||
|
"lang": "en"
|
||||||
|
}
|
||||||
37
pwa/sw.js
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
// This is the service worker with the combined offline experience (Offline page + Offline copy of pages)
|
||||||
|
|
||||||
|
const CACHE = "pwabuilder-offline-page";
|
||||||
|
|
||||||
|
importScripts('https://storage.googleapis.com/workbox-cdn/releases/5.1.2/workbox-sw.js');
|
||||||
|
|
||||||
|
const PRECACHE_ASSETS = [
|
||||||
|
'/',
|
||||||
|
'/404',
|
||||||
|
'/assets/bootstrap/css/bootstrap.min.css',
|
||||||
|
'https://fonts.googleapis.com/css?family=Lora:400,700,400italic,700italic&display=swap',
|
||||||
|
'https://fonts.googleapis.com/css?family=Cabin:700&display=swap',
|
||||||
|
'https://fonts.googleapis.com/css?family=Anonymous+Pro&display=swap',
|
||||||
|
'https://fonts.googleapis.com/css?family=Roboto:300,400,500,700',
|
||||||
|
'/assets/css/styles.min.css',
|
||||||
|
'/assets/css/404.min.css',
|
||||||
|
'/assets/css/profile.min.css',
|
||||||
|
'/assets/bootstrap/js/bootstrap.min.js',
|
||||||
|
'/assets/js/script.min.js',
|
||||||
|
'/assets/js/404.min.js',
|
||||||
|
'/assets/img/favicon/favicon-16x16.png',
|
||||||
|
'/assets/img/favicon/android-chrome-192x192.png'
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
self.addEventListener("message", (event) => {
|
||||||
|
if (event.data && event.data.type === "SKIP_WAITING") {
|
||||||
|
self.skipWaiting();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
self.addEventListener('install', async (event) => {
|
||||||
|
event.waitUntil(
|
||||||
|
caches.open(CACHE)
|
||||||
|
.then((cache) => cache.addAll(PRECACHE_ASSETS))
|
||||||
|
);
|
||||||
|
});
|
||||||
@@ -1,3 +1,4 @@
|
|||||||
|
pydantic
|
||||||
flask
|
flask
|
||||||
Flask-Cors
|
Flask-Cors
|
||||||
python-dotenv
|
python-dotenv
|
||||||
@@ -5,4 +6,12 @@ gunicorn
|
|||||||
requests
|
requests
|
||||||
cloudflare
|
cloudflare
|
||||||
qrcode
|
qrcode
|
||||||
|
Pillow
|
||||||
ansi2html
|
ansi2html
|
||||||
|
cachetools
|
||||||
|
solana
|
||||||
|
solders
|
||||||
|
weasyprint
|
||||||
|
markdown
|
||||||
|
pygments
|
||||||
|
beautifulsoup4
|
||||||
@@ -5,34 +5,36 @@
|
|||||||
<meta charset="utf-8">
|
<meta charset="utf-8">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no">
|
||||||
<title>Nathan.Woodburn/</title>
|
<title>Nathan.Woodburn/</title>
|
||||||
<meta name="theme-color" content="#97009a">
|
<meta name="theme-color" content="#000000">
|
||||||
<link rel="canonical" href="https://nathan.woodburn.au/404">
|
<link rel="canonical" href="https://nathan.woodburn.au/404">
|
||||||
<meta property="og:url" content="https://nathan.woodburn.au/404">
|
<meta property="og:url" content="https://nathan.woodburn.au/404">
|
||||||
<meta http-equiv="onion-location" content="http://wdbrncwefot4hd7bdrz5rzb74mefay7zvrjn2vmkpdm44l7fwnih5ryd.onion">
|
<meta name="fediverse:creator" content="@nathanwoodburn@mastodon.woodburn.au">
|
||||||
<meta name="twitter:description" content="G'day, this is my personal website. You can find out about me or check out some of my projects.">
|
<meta name="twitter:description" content="G'day, this is my personal website. You can find out about me or check out some of my projects.">
|
||||||
<meta name="description" content="G'day, this is my personal website. You can find out about me or check out some of my projects.">
|
|
||||||
<meta property="og:title" content="Nathan.Woodburn/">
|
<meta property="og:title" content="Nathan.Woodburn/">
|
||||||
<meta name="twitter:card" content="summary">
|
<meta name="twitter:card" content="summary">
|
||||||
<meta name="twitter:image" content="https://nathan.woodburn.au/assets/img/profile.jpg">
|
<meta name="twitter:image" content="https://nathan.woodburn.au/assets/img/profile.jpg">
|
||||||
<meta property="og:image" content="https://nathan.woodburn.au/assets/img/profile.jpg">
|
|
||||||
<meta property="og:type" content="website">
|
<meta property="og:type" content="website">
|
||||||
<meta name="twitter:title" content="Nathan.Woodburn/">
|
<meta name="twitter:title" content="Nathan.Woodburn/">
|
||||||
<meta property="og:description" content="G'day, this is my personal website. You can find out about me or check out some of my projects.">
|
<meta property="og:description" content="G'day, this is my personal website. You can find out about me or check out some of my projects.">
|
||||||
<link rel="apple-touch-icon" type="image/png" sizes="180x180" href="/assets/img/apple-touch-icon.png">
|
<meta name="description" content="G'day, this is my personal website. You can find out about me or check out some of my projects.">
|
||||||
<link rel="icon" type="image/png" sizes="16x16" href="/assets/img/favicon-16x16.png">
|
<meta property="og:image" content="https://nathan.woodburn.au/assets/img/profile.jpg">
|
||||||
<link rel="icon" type="image/png" sizes="32x32" href="/assets/img/favicon-32x32.png">
|
<link rel="apple-touch-icon" type="image/png" sizes="180x180" href="/assets/img/favicon/apple-touch-icon.png">
|
||||||
<link rel="icon" type="image/png" sizes="180x180" href="/assets/img/apple-touch-icon.png">
|
<link rel="icon" type="image/png" sizes="16x16" href="/assets/img/favicon/favicon-16x16.png">
|
||||||
<link rel="icon" type="image/png" sizes="192x192" href="/assets/img/android-chrome-192x192.png">
|
<link rel="icon" type="image/png" sizes="32x32" href="/assets/img/favicon/favicon-32x32.png">
|
||||||
<link rel="icon" type="image/png" sizes="512x512" href="/assets/img/android-chrome-512x512.png">
|
<link rel="icon" type="image/png" sizes="180x180" href="/assets/img/favicon/apple-touch-icon.png">
|
||||||
|
<link rel="icon" type="image/png" sizes="192x192" href="/assets/img/favicon/android-chrome-192x192.png">
|
||||||
|
<link rel="icon" type="image/png" sizes="512x512" href="/assets/img/favicon/android-chrome-512x512.png">
|
||||||
<link rel="stylesheet" href="/assets/bootstrap/css/bootstrap.min.css">
|
<link rel="stylesheet" href="/assets/bootstrap/css/bootstrap.min.css">
|
||||||
<link rel="manifest" href="/manifest.json" crossorigin="use-credentials">
|
<link rel="manifest" href="/manifest.json" crossorigin="use-credentials">
|
||||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Lora:400,700,400italic,700italic&display=swap">
|
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Lora:400,700,400italic,700italic&display=swap">
|
||||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Cabin:700&display=swap">
|
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Cabin:700&display=swap">
|
||||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Anonymous+Pro&display=swap">
|
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Anonymous+Pro&display=swap">
|
||||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,400,500,700">
|
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,400,500,700&display=swap">
|
||||||
<link rel="stylesheet" href="/assets/css/styles.min.css">
|
<link rel="stylesheet" href="/assets/css/styles.min.css">
|
||||||
<link rel="stylesheet" href="/assets/css/404.min.css">
|
<link rel="stylesheet" href="/assets/css/404.min.css">
|
||||||
|
<link rel="stylesheet" href="/assets/css/brand-reveal.min.css">
|
||||||
<link rel="stylesheet" href="/assets/css/profile.min.css">
|
<link rel="stylesheet" href="/assets/css/profile.min.css">
|
||||||
|
<link rel="stylesheet" href="/assets/css/Social-Icons.min.css">
|
||||||
<link rel="me" href="https://mastodon.woodburn.au/@nathanwoodburn" />
|
<link rel="me" href="https://mastodon.woodburn.au/@nathanwoodburn" />
|
||||||
<script async src="https://umami.woodburn.au/script.js" data-website-id="6a55028e-aad3-481c-9a37-3e096ff75589"></script>
|
<script async src="https://umami.woodburn.au/script.js" data-website-id="6a55028e-aad3-481c-9a37-3e096ff75589"></script>
|
||||||
</head>
|
</head>
|
||||||
@@ -44,6 +46,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<script src="/assets/bootstrap/js/bootstrap.min.js"></script>
|
<script src="/assets/bootstrap/js/bootstrap.min.js"></script>
|
||||||
<script src="/assets/js/script.min.js"></script>
|
<script src="/assets/js/script.min.js"></script>
|
||||||
|
<script src="/assets/js/grayscale.min.js"></script>
|
||||||
<script src="/assets/js/404.min.js"></script>
|
<script src="/assets/js/404.min.js"></script>
|
||||||
</body>
|
</body>
|
||||||
|
|
||||||
|
|||||||
@@ -1,40 +1,42 @@
|
|||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html data-bs-theme="light" lang="en-au" style="background: url("/assets/img/intro-bg.webp") bottom / cover no-repeat, black;">
|
<html data-bs-theme="light" lang="en-au" style="background: url("/assets/img/bg/projects.webp") bottom / cover no-repeat, black;">
|
||||||
|
|
||||||
<head>
|
<head>
|
||||||
<meta charset="utf-8">
|
<meta charset="utf-8">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no">
|
||||||
<title>Nathan.Woodburn/</title>
|
<title>Nathan.Woodburn/</title>
|
||||||
<meta name="theme-color" content="#97009a">
|
<meta name="theme-color" content="#000000">
|
||||||
<link rel="canonical" href="https://nathan.woodburn.au/about">
|
<link rel="canonical" href="https://nathan.woodburn.au/about">
|
||||||
<meta property="og:url" content="https://nathan.woodburn.au/about">
|
<meta property="og:url" content="https://nathan.woodburn.au/about">
|
||||||
<meta http-equiv="onion-location" content="http://wdbrncwefot4hd7bdrz5rzb74mefay7zvrjn2vmkpdm44l7fwnih5ryd.onion">
|
<meta name="fediverse:creator" content="@nathanwoodburn@mastodon.woodburn.au">
|
||||||
<meta name="twitter:description" content="G'day, this is my personal website. You can find out about me or check out some of my projects.">
|
<meta name="twitter:description" content="G'day, this is my personal website. You can find out about me or check out some of my projects.">
|
||||||
<meta name="description" content="G'day, this is my personal website. You can find out about me or check out some of my projects.">
|
|
||||||
<meta property="og:title" content="Nathan.Woodburn/">
|
<meta property="og:title" content="Nathan.Woodburn/">
|
||||||
<meta name="twitter:card" content="summary">
|
<meta name="twitter:card" content="summary">
|
||||||
<meta name="twitter:image" content="https://nathan.woodburn.au/assets/img/profile.jpg">
|
<meta name="twitter:image" content="https://nathan.woodburn.au/assets/img/profile.jpg">
|
||||||
<meta property="og:image" content="https://nathan.woodburn.au/assets/img/profile.jpg">
|
|
||||||
<meta property="og:type" content="website">
|
<meta property="og:type" content="website">
|
||||||
<meta name="twitter:title" content="Nathan.Woodburn/">
|
<meta name="twitter:title" content="Nathan.Woodburn/">
|
||||||
<meta property="og:description" content="G'day, this is my personal website. You can find out about me or check out some of my projects.">
|
<meta property="og:description" content="G'day, this is my personal website. You can find out about me or check out some of my projects.">
|
||||||
<link rel="apple-touch-icon" type="image/png" sizes="180x180" href="/assets/img/apple-touch-icon.png">
|
<meta name="description" content="G'day, this is my personal website. You can find out about me or check out some of my projects.">
|
||||||
<link rel="icon" type="image/png" sizes="16x16" href="/assets/img/favicon-16x16.png">
|
<meta property="og:image" content="https://nathan.woodburn.au/assets/img/profile.jpg">
|
||||||
<link rel="icon" type="image/png" sizes="32x32" href="/assets/img/favicon-32x32.png">
|
<link rel="apple-touch-icon" type="image/png" sizes="180x180" href="/assets/img/favicon/apple-touch-icon.png">
|
||||||
<link rel="icon" type="image/png" sizes="180x180" href="/assets/img/apple-touch-icon.png">
|
<link rel="icon" type="image/png" sizes="16x16" href="/assets/img/favicon/favicon-16x16.png">
|
||||||
<link rel="icon" type="image/png" sizes="192x192" href="/assets/img/android-chrome-192x192.png">
|
<link rel="icon" type="image/png" sizes="32x32" href="/assets/img/favicon/favicon-32x32.png">
|
||||||
<link rel="icon" type="image/png" sizes="512x512" href="/assets/img/android-chrome-512x512.png">
|
<link rel="icon" type="image/png" sizes="180x180" href="/assets/img/favicon/apple-touch-icon.png">
|
||||||
|
<link rel="icon" type="image/png" sizes="192x192" href="/assets/img/favicon/android-chrome-192x192.png">
|
||||||
|
<link rel="icon" type="image/png" sizes="512x512" href="/assets/img/favicon/android-chrome-512x512.png">
|
||||||
<link rel="stylesheet" href="/assets/bootstrap/css/bootstrap.min.css">
|
<link rel="stylesheet" href="/assets/bootstrap/css/bootstrap.min.css">
|
||||||
<link rel="manifest" href="/manifest.json" crossorigin="use-credentials">
|
<link rel="manifest" href="/manifest.json" crossorigin="use-credentials">
|
||||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Lora:400,700,400italic,700italic&display=swap">
|
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Lora:400,700,400italic,700italic&display=swap">
|
||||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Cabin:700&display=swap">
|
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Cabin:700&display=swap">
|
||||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Anonymous+Pro&display=swap">
|
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Anonymous+Pro&display=swap">
|
||||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,400,500,700">
|
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,400,500,700&display=swap">
|
||||||
<link rel="stylesheet" href="/assets/fonts/fontawesome-all.min.css">
|
<link rel="stylesheet" href="/assets/fonts/fontawesome-all.min.css">
|
||||||
<link rel="stylesheet" href="/assets/fonts/ionicons.min.css">
|
<link rel="stylesheet" href="/assets/fonts/ionicons.min.css">
|
||||||
<link rel="stylesheet" href="/assets/css/styles.min.css">
|
<link rel="stylesheet" href="/assets/css/styles.min.css">
|
||||||
|
<link rel="stylesheet" href="/assets/css/brand-reveal.min.css">
|
||||||
<link rel="stylesheet" href="/assets/css/fixes.min.css">
|
<link rel="stylesheet" href="/assets/css/fixes.min.css">
|
||||||
<link rel="stylesheet" href="/assets/css/profile.min.css">
|
<link rel="stylesheet" href="/assets/css/profile.min.css">
|
||||||
|
<link rel="stylesheet" href="/assets/css/Social-Icons.min.css">
|
||||||
<link rel="me" href="https://mastodon.woodburn.au/@nathanwoodburn" />
|
<link rel="me" href="https://mastodon.woodburn.au/@nathanwoodburn" />
|
||||||
<script async src="https://umami.woodburn.au/script.js" data-website-id="6a55028e-aad3-481c-9a37-3e096ff75589"></script>
|
<script async src="https://umami.woodburn.au/script.js" data-website-id="6a55028e-aad3-481c-9a37-3e096ff75589"></script>
|
||||||
</head>
|
</head>
|
||||||
@@ -42,35 +44,74 @@
|
|||||||
<body class="about-body" style="text-align: center;color: rgb(255,255,255);background: transparent;">{{handshake_scripts | safe}}
|
<body class="about-body" style="text-align: center;color: rgb(255,255,255);background: transparent;">{{handshake_scripts | safe}}
|
||||||
<div class="profile-container" style="margin-bottom: 2em;margin-top: 5em;"><img class="profile background" src="/assets/img/profile.jpg" style="border-radius: 50%;"><img class="profile foreground" src="/assets/img/pfront.webp"></div>
|
<div class="profile-container" style="margin-bottom: 2em;margin-top: 5em;"><img class="profile background" src="/assets/img/profile.jpg" style="border-radius: 50%;"><img class="profile foreground" src="/assets/img/pfront.webp"></div>
|
||||||
<h1 class="nathanwoodburn" style="margin-bottom: 0.5em;">Nathan.Woodburn/</h1>
|
<h1 class="nathanwoodburn" style="margin-bottom: 0.5em;">Nathan.Woodburn/</h1>
|
||||||
<div class="container">
|
<section class="text-center content-section" id="contact" style="padding-top: 0px;padding-bottom: 3em;">
|
||||||
<div class="row">
|
<div class="container">
|
||||||
<div class="col-lg-8 mx-auto">
|
<div class="row">
|
||||||
<div class="social-div">
|
<div class="col-lg-8 d-none d-print-block d-sm-block d-md-block d-lg-block d-xl-block d-xxl-block mx-auto">
|
||||||
<ul class="list-unstyled social-list">
|
<div class="social-div">
|
||||||
<li class="social-link"><a href="https://twitter.com/woodburn_nathan" target="_blank"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" fill="currentColor" viewBox="0 0 16 16" class="bi bi-twitter-x icon">
|
<ul class="list-unstyled social-list">
|
||||||
<path d="M12.6.75h2.454l-5.36 6.142L16 15.25h-4.937l-3.867-5.07-4.425 5.07H.316l5.733-6.57L0 .75h5.063l3.495 4.633L12.601.75Zm-.86 13.028h1.36L4.323 2.145H2.865l8.875 11.633Z"></path>
|
<li class="social-link"><a href="https://twitter.com/woodburn_nathan" target="_blank"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" fill="currentColor" viewBox="0 0 16 16" class="bi bi-twitter-x icon">
|
||||||
</svg></a></li>
|
<path d="M12.6.75h2.454l-5.36 6.142L16 15.25h-4.937l-3.867-5.07-4.425 5.07H.316l5.733-6.57L0 .75h5.063l3.495 4.633L12.601.75Zm-.86 13.028h1.36L4.323 2.145H2.865l8.875 11.633Z"></path>
|
||||||
<li class="social-link"><a href="https://github.com/Nathanwoodburn" target="_blank"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" fill="currentColor" viewBox="0 0 16 16" class="bi bi-github icon">
|
</svg></a></li>
|
||||||
<path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.012 8.012 0 0 0 16 8c0-4.42-3.58-8-8-8"></path>
|
<li class="social-link"><a href="https://github.com/Nathanwoodburn" target="_blank"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" fill="currentColor" viewBox="0 0 16 16" class="bi bi-github icon">
|
||||||
</svg></a></li>
|
<path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.012 8.012 0 0 0 16 8c0-4.42-3.58-8-8-8"></path>
|
||||||
<li class="social-link"><a href="mailto:about@nathan.woodburn.au" target="_blank"><i class="icon ion-email icon"></i></a></li>
|
</svg></a></li>
|
||||||
<li class="social-link"><a href="https://l.woodburn.au/discord" target="_blank"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" fill="currentColor" viewBox="0 0 16 16" class="bi bi-discord icon">
|
<li class="social-link"><a href="mailto:about@nathan.woodburn.au" target="_blank"><i class="icon ion-email icon"></i></a></li>
|
||||||
<path d="M13.545 2.907a13.227 13.227 0 0 0-3.257-1.011.05.05 0 0 0-.052.025c-.141.25-.297.577-.406.833a12.19 12.19 0 0 0-3.658 0 8.258 8.258 0 0 0-.412-.833.051.051 0 0 0-.052-.025c-1.125.194-2.22.534-3.257 1.011a.041.041 0 0 0-.021.018C.356 6.024-.213 9.047.066 12.032c.001.014.01.028.021.037a13.276 13.276 0 0 0 3.995 2.02.05.05 0 0 0 .056-.019c.308-.42.582-.863.818-1.329a.05.05 0 0 0-.01-.059.051.051 0 0 0-.018-.011 8.875 8.875 0 0 1-1.248-.595.05.05 0 0 1-.02-.066.051.051 0 0 1 .015-.019c.084-.063.168-.129.248-.195a.05.05 0 0 1 .051-.007c2.619 1.196 5.454 1.196 8.041 0a.052.052 0 0 1 .053.007c.08.066.164.132.248.195a.051.051 0 0 1-.004.085 8.254 8.254 0 0 1-1.249.594.05.05 0 0 0-.03.03.052.052 0 0 0 .003.041c.24.465.515.909.817 1.329a.05.05 0 0 0 .056.019 13.235 13.235 0 0 0 4.001-2.02.049.049 0 0 0 .021-.037c.334-3.451-.559-6.449-2.366-9.106a.034.034 0 0 0-.02-.019Zm-8.198 7.307c-.789 0-1.438-.724-1.438-1.612 0-.889.637-1.613 1.438-1.613.807 0 1.45.73 1.438 1.613 0 .888-.637 1.612-1.438 1.612m5.316 0c-.788 0-1.438-.724-1.438-1.612 0-.889.637-1.613 1.438-1.613.807 0 1.451.73 1.438 1.613 0 .888-.631 1.612-1.438 1.612"></path>
|
<li class="social-link discord"><a href="https://l.woodburn.au/discord" target="_blank"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" fill="currentColor" viewBox="0 0 16 16" class="bi bi-discord icon">
|
||||||
</svg></a></li>
|
<path d="M13.545 2.907a13.227 13.227 0 0 0-3.257-1.011.05.05 0 0 0-.052.025c-.141.25-.297.577-.406.833a12.19 12.19 0 0 0-3.658 0 8.258 8.258 0 0 0-.412-.833.051.051 0 0 0-.052-.025c-1.125.194-2.22.534-3.257 1.011a.041.041 0 0 0-.021.018C.356 6.024-.213 9.047.066 12.032c.001.014.01.028.021.037a13.276 13.276 0 0 0 3.995 2.02.05.05 0 0 0 .056-.019c.308-.42.582-.863.818-1.329a.05.05 0 0 0-.01-.059.051.051 0 0 0-.018-.011 8.875 8.875 0 0 1-1.248-.595.05.05 0 0 1-.02-.066.051.051 0 0 1 .015-.019c.084-.063.168-.129.248-.195a.05.05 0 0 1 .051-.007c2.619 1.196 5.454 1.196 8.041 0a.052.052 0 0 1 .053.007c.08.066.164.132.248.195a.051.051 0 0 1-.004.085 8.254 8.254 0 0 1-1.249.594.05.05 0 0 0-.03.03.052.052 0 0 0 .003.041c.24.465.515.909.817 1.329a.05.05 0 0 0 .056.019 13.235 13.235 0 0 0 4.001-2.02.049.049 0 0 0 .021-.037c.334-3.451-.559-6.449-2.366-9.106a.034.034 0 0 0-.02-.019Zm-8.198 7.307c-.789 0-1.438-.724-1.438-1.612 0-.889.637-1.613 1.438-1.613.807 0 1.45.73 1.438 1.613 0 .888-.637 1.612-1.438 1.612m5.316 0c-.788 0-1.438-.724-1.438-1.612 0-.889.637-1.613 1.438-1.613.807 0 1.451.73 1.438 1.613 0 .888-.631 1.612-1.438 1.612"></path>
|
||||||
<li class="social-link"><a href="https://mastodon.woodburn.au/@nathanwoodburn" target="_blank"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" fill="currentColor" viewBox="0 0 16 16" class="bi bi-mastodon icon">
|
</svg></a></li>
|
||||||
<path d="M11.19 12.195c2.016-.24 3.77-1.475 3.99-2.603.348-1.778.32-4.339.32-4.339 0-3.47-2.286-4.488-2.286-4.488C12.062.238 10.083.017 8.027 0h-.05C5.92.017 3.942.238 2.79.765c0 0-2.285 1.017-2.285 4.488l-.002.662c-.004.64-.007 1.35.011 2.091.083 3.394.626 6.74 3.78 7.57 1.454.383 2.703.463 3.709.408 1.823-.1 2.847-.647 2.847-.647l-.06-1.317s-1.303.41-2.767.36c-1.45-.05-2.98-.156-3.215-1.928a3.614 3.614 0 0 1-.033-.496s1.424.346 3.228.428c1.103.05 2.137-.064 3.188-.189zm1.613-2.47H11.13v-4.08c0-.859-.364-1.295-1.091-1.295-.804 0-1.207.517-1.207 1.541v2.233H7.168V5.89c0-1.024-.403-1.541-1.207-1.541-.727 0-1.091.436-1.091 1.296v4.079H3.197V5.522c0-.859.22-1.541.66-2.046.456-.505 1.052-.764 1.793-.764.856 0 1.504.328 1.933.983L8 4.39l.417-.695c.429-.655 1.077-.983 1.934-.983.74 0 1.336.259 1.791.764.442.505.661 1.187.661 2.046v4.203z"></path>
|
</ul>
|
||||||
</svg></a></li>
|
</div>
|
||||||
<li class="social-link"><a href="https://www.youtube.com/@nathanjwoodburn" target="_blank"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" fill="currentColor" viewBox="0 0 16 16" class="bi bi-youtube icon">
|
<div class="social-div">
|
||||||
<path d="M8.051 1.999h.089c.822.003 4.987.033 6.11.335a2.01 2.01 0 0 1 1.415 1.42c.101.38.172.883.22 1.402l.01.104.022.26.008.104c.065.914.073 1.77.074 1.957v.075c-.001.194-.01 1.108-.082 2.06l-.008.105-.009.104c-.05.572-.124 1.14-.235 1.558a2.007 2.007 0 0 1-1.415 1.42c-1.16.312-5.569.334-6.18.335h-.142c-.309 0-1.587-.006-2.927-.052l-.17-.006-.087-.004-.171-.007-.171-.007c-1.11-.049-2.167-.128-2.654-.26a2.007 2.007 0 0 1-1.415-1.419c-.111-.417-.185-.986-.235-1.558L.09 9.82l-.008-.104A31.4 31.4 0 0 1 0 7.68v-.123c.002-.215.01-.958.064-1.778l.007-.103.003-.052.008-.104.022-.26.01-.104c.048-.519.119-1.023.22-1.402a2.007 2.007 0 0 1 1.415-1.42c.487-.13 1.544-.21 2.654-.26l.17-.007.172-.006.086-.003.171-.007A99.788 99.788 0 0 1 7.858 2h.193zM6.4 5.209v4.818l4.157-2.408z"></path>
|
<ul class="list-unstyled social-list">
|
||||||
</svg></a></li>
|
<li class="social-link mastodon"><a href="https://mastodon.woodburn.au/@nathanwoodburn" target="_blank"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" fill="currentColor" viewBox="0 0 16 16" class="bi bi-mastodon icon">
|
||||||
</ul>
|
<path d="M11.19 12.195c2.016-.24 3.77-1.475 3.99-2.603.348-1.778.32-4.339.32-4.339 0-3.47-2.286-4.488-2.286-4.488C12.062.238 10.083.017 8.027 0h-.05C5.92.017 3.942.238 2.79.765c0 0-2.285 1.017-2.285 4.488l-.002.662c-.004.64-.007 1.35.011 2.091.083 3.394.626 6.74 3.78 7.57 1.454.383 2.703.463 3.709.408 1.823-.1 2.847-.647 2.847-.647l-.06-1.317s-1.303.41-2.767.36c-1.45-.05-2.98-.156-3.215-1.928a3.614 3.614 0 0 1-.033-.496s1.424.346 3.228.428c1.103.05 2.137-.064 3.188-.189zm1.613-2.47H11.13v-4.08c0-.859-.364-1.295-1.091-1.295-.804 0-1.207.517-1.207 1.541v2.233H7.168V5.89c0-1.024-.403-1.541-1.207-1.541-.727 0-1.091.436-1.091 1.296v4.079H3.197V5.522c0-.859.22-1.541.66-2.046.456-.505 1.052-.764 1.793-.764.856 0 1.504.328 1.933.983L8 4.39l.417-.695c.429-.655 1.077-.983 1.934-.983.74 0 1.336.259 1.791.764.442.505.661 1.187.661 2.046v4.203z"></path>
|
||||||
|
</svg></a></li>
|
||||||
|
<li class="social-link youtube"><a href="https://www.youtube.com/@nathanjwoodburn" target="_blank"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" fill="currentColor" viewBox="0 0 16 16" class="bi bi-youtube icon">
|
||||||
|
<path d="M8.051 1.999h.089c.822.003 4.987.033 6.11.335a2.01 2.01 0 0 1 1.415 1.42c.101.38.172.883.22 1.402l.01.104.022.26.008.104c.065.914.073 1.77.074 1.957v.075c-.001.194-.01 1.108-.082 2.06l-.008.105-.009.104c-.05.572-.124 1.14-.235 1.558a2.007 2.007 0 0 1-1.415 1.42c-1.16.312-5.569.334-6.18.335h-.142c-.309 0-1.587-.006-2.927-.052l-.17-.006-.087-.004-.171-.007-.171-.007c-1.11-.049-2.167-.128-2.654-.26a2.007 2.007 0 0 1-1.415-1.419c-.111-.417-.185-.986-.235-1.558L.09 9.82l-.008-.104A31.4 31.4 0 0 1 0 7.68v-.123c.002-.215.01-.958.064-1.778l.007-.103.003-.052.008-.104.022-.26.01-.104c.048-.519.119-1.023.22-1.402a2.007 2.007 0 0 1 1.415-1.42c.487-.13 1.544-.21 2.654-.26l.17-.007.172-.006.086-.003.171-.007A99.788 99.788 0 0 1 7.858 2h.193zM6.4 5.209v4.818l4.157-2.408z"></path>
|
||||||
|
</svg></a></li>
|
||||||
|
<li class="social-link signal"><a href="/signalQR" target="_blank"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" fill="currentColor" viewBox="0 0 16 16" class="bi bi-signal icon">
|
||||||
|
<path d="m6.08.234.179.727a7.264 7.264 0 0 0-2.01.832l-.383-.643A7.9 7.9 0 0 1 6.079.234zm3.84 0L9.742.96a7.265 7.265 0 0 1 2.01.832l.388-.643A7.957 7.957 0 0 0 9.92.234zm-8.77 3.63a7.944 7.944 0 0 0-.916 2.215l.727.18a7.264 7.264 0 0 1 .832-2.01l-.643-.386zM.75 8a7.3 7.3 0 0 1 .081-1.086L.091 6.8a8 8 0 0 0 0 2.398l.74-.112A7.262 7.262 0 0 1 .75 8m11.384 6.848-.384-.64a7.23 7.23 0 0 1-2.007.831l.18.728a7.965 7.965 0 0 0 2.211-.919zM15.251 8c0 .364-.028.727-.082 1.086l.74.112a7.966 7.966 0 0 0 0-2.398l-.74.114c.054.36.082.722.082 1.086m.516 1.918-.728-.18a7.252 7.252 0 0 1-.832 2.012l.643.387a7.933 7.933 0 0 0 .917-2.219zm-6.68 5.25c-.72.11-1.453.11-2.173 0l-.112.742a7.99 7.99 0 0 0 2.396 0l-.112-.741zm4.75-2.868a7.229 7.229 0 0 1-1.537 1.534l.446.605a8.07 8.07 0 0 0 1.695-1.689l-.604-.45zM12.3 2.163c.587.432 1.105.95 1.537 1.537l.604-.45a8.06 8.06 0 0 0-1.69-1.691l-.45.604zM2.163 3.7A7.242 7.242 0 0 1 3.7 2.163l-.45-.604a8.06 8.06 0 0 0-1.691 1.69l.604.45zm12.688.163-.644.387c.377.623.658 1.3.832 2.007l.728-.18a7.931 7.931 0 0 0-.916-2.214M6.913.831a7.254 7.254 0 0 1 2.172 0l.112-.74a7.985 7.985 0 0 0-2.396 0l.112.74zM2.547 14.64 1 15l.36-1.549-.729-.17-.361 1.548a.75.75 0 0 0 .9.902l1.548-.357-.17-.734zM.786 12.612l.732.168.25-1.073A7.187 7.187 0 0 1 .96 9.74l-.727.18a8 8 0 0 0 .736 1.902l-.184.79zm3.5 1.623-1.073.25.17.731.79-.184c.6.327 1.239.574 1.902.737l.18-.728a7.197 7.197 0 0 1-1.962-.811l-.007.005zM8 1.5a6.502 6.502 0 0 0-6.498 6.502 6.516 6.516 0 0 0 .998 3.455l-.625 2.668L4.54 13.5a6.502 6.502 0 0 0 6.93-11A6.516 6.516 0 0 0 8 1.5"></path>
|
||||||
|
</svg></a></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-lg-8 d-block d-print-none d-sm-none d-md-none d-lg-none d-xl-none d-xxl-none mx-auto">
|
||||||
|
<div class="social-div">
|
||||||
|
<ul class="list-unstyled social-list-sml">
|
||||||
|
<li class="social-link-sml"><a href="https://twitter.com/woodburn_nathan" target="_blank"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" fill="currentColor" viewBox="0 0 16 16" class="bi bi-twitter-x icon-sml">
|
||||||
|
<path d="M12.6.75h2.454l-5.36 6.142L16 15.25h-4.937l-3.867-5.07-4.425 5.07H.316l5.733-6.57L0 .75h5.063l3.495 4.633L12.601.75Zm-.86 13.028h1.36L4.323 2.145H2.865l8.875 11.633Z"></path>
|
||||||
|
</svg></a></li>
|
||||||
|
<li class="social-link-sml"><a href="https://github.com/Nathanwoodburn" target="_blank"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" fill="currentColor" viewBox="0 0 16 16" class="bi bi-github icon-sml">
|
||||||
|
<path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.012 8.012 0 0 0 16 8c0-4.42-3.58-8-8-8"></path>
|
||||||
|
</svg></a></li>
|
||||||
|
<li class="social-link-sml"><a href="mailto:about@nathan.woodburn.au" target="_blank"><i class="icon ion-email icon-sml"></i></a></li>
|
||||||
|
<li class="discord social-link-sml"><a href="https://l.woodburn.au/discord" target="_blank"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" fill="currentColor" viewBox="0 0 16 16" class="bi bi-discord icon-sml">
|
||||||
|
<path d="M13.545 2.907a13.227 13.227 0 0 0-3.257-1.011.05.05 0 0 0-.052.025c-.141.25-.297.577-.406.833a12.19 12.19 0 0 0-3.658 0 8.258 8.258 0 0 0-.412-.833.051.051 0 0 0-.052-.025c-1.125.194-2.22.534-3.257 1.011a.041.041 0 0 0-.021.018C.356 6.024-.213 9.047.066 12.032c.001.014.01.028.021.037a13.276 13.276 0 0 0 3.995 2.02.05.05 0 0 0 .056-.019c.308-.42.582-.863.818-1.329a.05.05 0 0 0-.01-.059.051.051 0 0 0-.018-.011 8.875 8.875 0 0 1-1.248-.595.05.05 0 0 1-.02-.066.051.051 0 0 1 .015-.019c.084-.063.168-.129.248-.195a.05.05 0 0 1 .051-.007c2.619 1.196 5.454 1.196 8.041 0a.052.052 0 0 1 .053.007c.08.066.164.132.248.195a.051.051 0 0 1-.004.085 8.254 8.254 0 0 1-1.249.594.05.05 0 0 0-.03.03.052.052 0 0 0 .003.041c.24.465.515.909.817 1.329a.05.05 0 0 0 .056.019 13.235 13.235 0 0 0 4.001-2.02.049.049 0 0 0 .021-.037c.334-3.451-.559-6.449-2.366-9.106a.034.034 0 0 0-.02-.019Zm-8.198 7.307c-.789 0-1.438-.724-1.438-1.612 0-.889.637-1.613 1.438-1.613.807 0 1.45.73 1.438 1.613 0 .888-.637 1.612-1.438 1.612m5.316 0c-.788 0-1.438-.724-1.438-1.612 0-.889.637-1.613 1.438-1.613.807 0 1.451.73 1.438 1.613 0 .888-.631 1.612-1.438 1.612"></path>
|
||||||
|
</svg></a></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="social-div">
|
||||||
|
<ul class="list-unstyled social-list-sml">
|
||||||
|
<li class="mastodon social-link-sml"><a href="https://mastodon.woodburn.au/@nathanwoodburn" target="_blank"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" fill="currentColor" viewBox="0 0 16 16" class="bi bi-mastodon icon-sml">
|
||||||
|
<path d="M11.19 12.195c2.016-.24 3.77-1.475 3.99-2.603.348-1.778.32-4.339.32-4.339 0-3.47-2.286-4.488-2.286-4.488C12.062.238 10.083.017 8.027 0h-.05C5.92.017 3.942.238 2.79.765c0 0-2.285 1.017-2.285 4.488l-.002.662c-.004.64-.007 1.35.011 2.091.083 3.394.626 6.74 3.78 7.57 1.454.383 2.703.463 3.709.408 1.823-.1 2.847-.647 2.847-.647l-.06-1.317s-1.303.41-2.767.36c-1.45-.05-2.98-.156-3.215-1.928a3.614 3.614 0 0 1-.033-.496s1.424.346 3.228.428c1.103.05 2.137-.064 3.188-.189zm1.613-2.47H11.13v-4.08c0-.859-.364-1.295-1.091-1.295-.804 0-1.207.517-1.207 1.541v2.233H7.168V5.89c0-1.024-.403-1.541-1.207-1.541-.727 0-1.091.436-1.091 1.296v4.079H3.197V5.522c0-.859.22-1.541.66-2.046.456-.505 1.052-.764 1.793-.764.856 0 1.504.328 1.933.983L8 4.39l.417-.695c.429-.655 1.077-.983 1.934-.983.74 0 1.336.259 1.791.764.442.505.661 1.187.661 2.046v4.203z"></path>
|
||||||
|
</svg></a></li>
|
||||||
|
<li class="youtube social-link-sml"><a href="https://www.youtube.com/@nathanjwoodburn" target="_blank"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" fill="currentColor" viewBox="0 0 16 16" class="bi bi-youtube icon-sml">
|
||||||
|
<path d="M8.051 1.999h.089c.822.003 4.987.033 6.11.335a2.01 2.01 0 0 1 1.415 1.42c.101.38.172.883.22 1.402l.01.104.022.26.008.104c.065.914.073 1.77.074 1.957v.075c-.001.194-.01 1.108-.082 2.06l-.008.105-.009.104c-.05.572-.124 1.14-.235 1.558a2.007 2.007 0 0 1-1.415 1.42c-1.16.312-5.569.334-6.18.335h-.142c-.309 0-1.587-.006-2.927-.052l-.17-.006-.087-.004-.171-.007-.171-.007c-1.11-.049-2.167-.128-2.654-.26a2.007 2.007 0 0 1-1.415-1.419c-.111-.417-.185-.986-.235-1.558L.09 9.82l-.008-.104A31.4 31.4 0 0 1 0 7.68v-.123c.002-.215.01-.958.064-1.778l.007-.103.003-.052.008-.104.022-.26.01-.104c.048-.519.119-1.023.22-1.402a2.007 2.007 0 0 1 1.415-1.42c.487-.13 1.544-.21 2.654-.26l.17-.007.172-.006.086-.003.171-.007A99.788 99.788 0 0 1 7.858 2h.193zM6.4 5.209v4.818l4.157-2.408z"></path>
|
||||||
|
</svg></a></li>
|
||||||
|
<li class="signal social-link-sml"><a href="/signalQR" target="_blank"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" fill="currentColor" viewBox="0 0 16 16" class="bi bi-signal icon-sml">
|
||||||
|
<path d="m6.08.234.179.727a7.264 7.264 0 0 0-2.01.832l-.383-.643A7.9 7.9 0 0 1 6.079.234zm3.84 0L9.742.96a7.265 7.265 0 0 1 2.01.832l.388-.643A7.957 7.957 0 0 0 9.92.234zm-8.77 3.63a7.944 7.944 0 0 0-.916 2.215l.727.18a7.264 7.264 0 0 1 .832-2.01l-.643-.386zM.75 8a7.3 7.3 0 0 1 .081-1.086L.091 6.8a8 8 0 0 0 0 2.398l.74-.112A7.262 7.262 0 0 1 .75 8m11.384 6.848-.384-.64a7.23 7.23 0 0 1-2.007.831l.18.728a7.965 7.965 0 0 0 2.211-.919zM15.251 8c0 .364-.028.727-.082 1.086l.74.112a7.966 7.966 0 0 0 0-2.398l-.74.114c.054.36.082.722.082 1.086m.516 1.918-.728-.18a7.252 7.252 0 0 1-.832 2.012l.643.387a7.933 7.933 0 0 0 .917-2.219zm-6.68 5.25c-.72.11-1.453.11-2.173 0l-.112.742a7.99 7.99 0 0 0 2.396 0l-.112-.741zm4.75-2.868a7.229 7.229 0 0 1-1.537 1.534l.446.605a8.07 8.07 0 0 0 1.695-1.689l-.604-.45zM12.3 2.163c.587.432 1.105.95 1.537 1.537l.604-.45a8.06 8.06 0 0 0-1.69-1.691l-.45.604zM2.163 3.7A7.242 7.242 0 0 1 3.7 2.163l-.45-.604a8.06 8.06 0 0 0-1.691 1.69l.604.45zm12.688.163-.644.387c.377.623.658 1.3.832 2.007l.728-.18a7.931 7.931 0 0 0-.916-2.214M6.913.831a7.254 7.254 0 0 1 2.172 0l.112-.74a7.985 7.985 0 0 0-2.396 0l.112.74zM2.547 14.64 1 15l.36-1.549-.729-.17-.361 1.548a.75.75 0 0 0 .9.902l1.548-.357-.17-.734zM.786 12.612l.732.168.25-1.073A7.187 7.187 0 0 1 .96 9.74l-.727.18a8 8 0 0 0 .736 1.902l-.184.79zm3.5 1.623-1.073.25.17.731.79-.184c.6.327 1.239.574 1.902.737l.18-.728a7.197 7.197 0 0 1-1.962-.811l-.007.005zM8 1.5a6.502 6.502 0 0 0-6.498 6.502 6.516 6.516 0 0 0 .998 3.455l-.625 2.668L4.54 13.5a6.502 6.502 0 0 0 6.93-11A6.516 6.516 0 0 0 8 1.5"></path>
|
||||||
|
</svg></a></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</section>
|
||||||
<p style="margin-top: 1em;">Hi, I am Nathan Woodburn and I live in Canberra<br>I am currently studying at the Australian National University<br>I enjoy 3D printing and CAD<br>I code stuff with C#, Linux Bash<br>I can code in a ton of other languages with Google's help<br>I'm a co-founder of <a href="https://hns.au" target="_blank">Handshake Australia</a><br>I currently work for <a href="https://learn.namebase.io" target="_blank">Namebase</a><br><br></p><i class="fas fa-arrow-down" style="font-size: 50px;" onclick="slideout()"></i>
|
<p style="margin-top: 1em;">Hi, I am Nathan Woodburn and I live in Canberra<br>I am currently studying at the Australian National University<br>I enjoy 3D printing and CAD<br>I code stuff with C#, Linux Bash and tons of other languages<br>I'm a co-founder of <a href="https://hns.au" target="_blank">Handshake Australia</a><br>I currently work for <a href="https://learn.namebase.io" target="_blank">Namebase</a><br><br></p><i class="fas fa-arrow-down" style="font-size: 50px;" onclick="slideout()"></i>
|
||||||
<script src="/assets/bootstrap/js/bootstrap.min.js"></script>
|
<script src="/assets/bootstrap/js/bootstrap.min.js"></script>
|
||||||
<script src="/assets/js/script.min.js"></script>
|
<script src="/assets/js/script.min.js"></script>
|
||||||
|
<script src="/assets/js/grayscale.min.js"></script>
|
||||||
<script src="/assets/js/about.min.js"></script>
|
<script src="/assets/js/about.min.js"></script>
|
||||||
<script src="/assets/js/hacker.min.js"></script>
|
<script src="/assets/js/hacker.min.js"></script>
|
||||||
</body>
|
</body>
|
||||||
|
|||||||
1
templates/assets/css/Social-Icons.min.css
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
.social-icons{color:#313437;background-color:#fff;padding:70px 0}@media (max-width:767px){.social-icons{padding:50px 0}}@media (max-width:500px){img.profile{width:200px;margin-left:-100px}.profile-container{height:200px;margin-top:2em!important}}.social-div{display:flex;justify-content:center;align-items:center}.social-list-sml{display:flex;list-style:none;gap:1rem}.social-list{display:flex;list-style:none;gap:2.5rem}.social-icons i{color:#757980;margin:0 10px;width:60px;height:60px;border:1px solid #c8ced7;text-align:center;border-radius:50%;line-height:60px;display:inline-block}.social-link-sml a{text-decoration:none;width:3.5rem;height:3.5rem;background-color:#f0f9fe;border-radius:50%;display:flex;justify-content:center;align-items:center;position:relative;z-index:1;border:3px solid #f0f9fe;overflow:hidden}.social-link a{text-decoration:none;width:4.8rem;height:4.8rem;background-color:#f0f9fe;border-radius:50%;display:flex;justify-content:center;align-items:center;position:relative;z-index:1;border:3px solid #f0f9fe;overflow:hidden}.social-link a::before,.social-link-sml a::before{content:"";position:absolute;width:100%;height:100%;background:var(--bg-color);z-index:0;scale:1 0;transform-origin:bottom;transition:scale .5s}.social-link-sml:hover a::before,.social-link:hover a::before{scale:1 1}.icon-sml{font-size:1.5rem;color:#011827;transition:.5s;z-index:2}.icon{font-size:2rem;color:#011827;transition:.5s;z-index:2}.social-link a:hover .icon{color:#fff;transform:rotateY(360deg)}.social-link,.social-link-sml{--bg-color:#000}.social-link-sml.discord,.social-link.discord{--bg-color:#5865f2}.social-link-sml.mastodon,.social-link.mastodon{--bg-color:#6364ff}.social-link-sml.youtube,.social-link.youtube{--bg-color:#ff0000}.social-link-sml.signal,.social-link.signal{--bg-color:#365eb6}
|
||||||
1
templates/assets/css/blog.min.css
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
p{margin:auto!important}pre{line-height:125%}li{list-style:inside}.social-link{list-style:none!important}span.linenos,td.linenos .normal{color:inherit;background-color:transparent;padding-left:5px;padding-right:5px}span.linenos.special,td.linenos .special{color:#000;background-color:#ffffc0;padding-left:5px;padding-right:5px}.codehilite .hll{background-color:#ffc}.codehilite{background:#f8f8f8;color:#333;width:fit-content;margin:auto;padding:0 5px;border-radius:5px}.codehilite .c,.codehilite .c1,.codehilite .ch,.codehilite .cm,.codehilite .cpf,.codehilite .cs{color:#3d7b7b;font-style:italic}.codehilite .err{border:1px solid red}.codehilite .k,.codehilite .kc,.codehilite .kd,.codehilite .kn,.codehilite .kr,.codehilite .nt{color:green;font-weight:700}.codehilite .il,.codehilite .m,.codehilite .mb,.codehilite .mf,.codehilite .mh,.codehilite .mi,.codehilite .mo,.codehilite .o{color:#666}.codehilite .cp{color:#9c6500}.codehilite .gd{color:#a00000}.codehilite .ge{font-style:italic}.codehilite .ges{font-weight:700;font-style:italic}.codehilite .gr{color:#e40000}.codehilite .gh,.codehilite .gp{color:navy;font-weight:700}.codehilite .gi{color:#008400}.codehilite .go{color:#717171}.codehilite .gs{font-weight:700}.codehilite .gu{color:purple;font-weight:700}.codehilite .gt{color:#04d}.codehilite .bp,.codehilite .kp,.codehilite .nb,.codehilite .sx{color:green}.codehilite .kt{color:#b00040}.codehilite .dl,.codehilite .s,.codehilite .s1,.codehilite .s2,.codehilite .sa,.codehilite .sb,.codehilite .sc,.codehilite .sh{color:#ba2121}.codehilite .na{color:#687822}.codehilite .nc,.codehilite .nn{color:#00f;font-weight:700}.codehilite .no{color:#800}.codehilite .nd{color:#a2f}.codehilite .ni{color:#717171;font-weight:700}.codehilite .ne{color:#cb3f38;font-weight:700}.codehilite .fm,.codehilite .nf{color:#00f}.codehilite .nl{color:#767600}.codehilite .nv,.codehilite .ss,.codehilite .vc,.codehilite .vg,.codehilite .vi,.codehilite .vm{color:#19177c}.codehilite .ow{color:#a2f;font-weight:700}.codehilite .w{color:#bbb}.codehilite .sd{color:#ba2121;font-style:italic}.codehilite .se{color:#aa5d1f;font-weight:700}.codehilite .si{color:#a45a77;font-weight:700}.codehilite .sr{color:#a45a77}
|
||||||
1
templates/assets/css/brand-reveal.min.css
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
.name-container{display:inline-flex;align-items:center;overflow:hidden;position:absolute;width:fit-content;left:50%;transform:translateX(-50%)}.slider{position:relative;left:0;animation:1s linear 1s forwards slide}@keyframes slide{0%{left:0}100%{left:calc(100%)}}.brand{mask-image:linear-gradient(to right,black 50%,transparent 50%);-webkit-mask-image:linear-gradient(to right,black 50%,transparent 50%);mask-position:100% 0;-webkit-mask-position:100% 0;mask-size:200%;-webkit-mask-size:200%;animation:1s linear 1s forwards reveal}@keyframes reveal{0%{mask-position:100% 0;-webkit-mask-position:100% 0}100%{mask-position:0 0;-webkit-mask-position:0 0}}
|
||||||
2
templates/assets/css/index.min.css
vendored
@@ -1 +1 @@
|
|||||||
#sites{display:flex;flex-direction:column;justify-content:center;align-items:center;width:100%;padding:60px;font-family:Quicksand,sans-serif}.site-container{background:rgba(133,133,133,.2);box-shadow:0 4px 30px rgba(0,0,0,.1);backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);border:1px solid rgba(255,255,255,.2);border-radius:25px;padding:30px 0;width:min(1200px,100%)}.site-container>h1{font-size:2rem;font-weight:600;text-align:center;color:#dda3b6;margin:20px 0 40px}.swiper{width:80%;height:100%;margin-bottom:30px}.swiper-scrollbar{--swiper-scrollbar-bottom:0px;--swiper-scrollbar-drag-bg-color:#dda3b6;--swiper-scrollbar-size:5px}.site{position:relative;max-width:400px;padding:1rem;font-family:inherit;font-size:1rem;font-weight:500;color:var(--clr-text);background-color:transparent;border-radius:10px;isolation:isolate;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.site::before{content:"";position:absolute;top:0;left:0;right:0;bottom:15px;background:rgba(236,149,200,.2);box-shadow:0 4px 30px rgba(0,0,0,.1);border-radius:10px;z-index:-1}.site-img{width:100%;max-width:400px;object-fit:cover;overflow:hidden;aspect-ratio:1;border-radius:6px}.site-body{align-items:center;gap:8px;padding:15px 0;cursor:default}.site-name{font-size:.9rem;font-weight:600;margin-bottom:2px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.site-author{width:fit-content;font-size:.8rem;font-weight:600;opacity:.6;color:var(--clr-text)}.site-avatar{width:40px;aspect-ratio:1/1;object-fit:cover;border-radius:5px;cursor:pointer}.site-actions{position:relative}.site-actions-content{position:absolute;bottom:130%;right:0;padding:8px;border-radius:8px;background:rgba(172,172,172,.2);backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);box-shadow:2px 2px 10px 2px hsl(0,0%,0%,.25);transition:opacity .25s,scale .25s;transform-origin:bottom right}.site-actions-content[data-visible=false]{pointer-events:none;opacity:0;scale:0}.site-actions-content[data-visible=true]{pointer-events:unset;scale:1;opacity:1}.site-actions-content li{padding:.5rem .65rem;border-radius:.25rem;list-style:none}.site-actions-content li:is(:hover,:focus-within){background-color:rgba(248,132,169,.7)}.site-actions-link{width:max-content;display:grid;grid-template-columns:1rem 1fr;align-items:center;gap:.6rem;color:inherit;text-decoration:none;cursor:pointer}.site-like{text-decoration:none;color:var(--clr-text);margin-right:5px;font-size:1.1rem;opacity:.65;border-radius:50%;overflow:hidden;transition:.35s}.site-actions-controller{border:0;background:0 0;color:var(--clr-text);cursor:pointer;opacity:.65}.site-actions-controller:hover,.site-like:hover{opacity:1}.site-like:focus{outline:0}.site-like.active{color:red;opacity:1;transform:scale(1.2)}@media (max-width:1200px){.swiper{width:80%}}@media (max-width:900px){#sites{padding:60px 80px}.swiper{width:50%}}@media (max-width:765px){.swiper{width:70%}}@media (max-width:550px){#sites{padding:40px}.swiper{width:80%}}img.no-drag{pointer-events:none}img.fog{pointer-events:none;position:absolute;left:0;top:0;width:100%;height:100%}#downtime{z-index:2;position:fixed;right:0;bottom:0;width:20%;transition:opacity .5s;opacity:0;cursor:pointer}blockquote.speech{position:absolute;display:inline-block;right:14vw;bottom:23vh;width:17vw;background:url(/assets/img/speech-bubble.svg) center;color:#fff;padding-top:3%;padding-bottom:20%;background-repeat:no-repeat!important;margin:0 auto;text-align:center;box-sizing:content-box;line-height:1;font-family:SequentialistBB,cursive;font-size:1.2vw}
|
#sites{display:flex;flex-direction:column;justify-content:center;align-items:center;width:100%;padding:60px;font-family:Quicksand,sans-serif}.site-container{background:rgba(133,133,133,.2);box-shadow:0 4px 30px rgba(0,0,0,.1);backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);border:1px solid rgba(255,255,255,.2);border-radius:25px;padding:30px 0;width:min(1200px,100%)}.site-container>h1{font-size:2rem;font-weight:600;text-align:center;color:#dda3b6;margin:20px 0 40px}.swiper{width:80%;height:100%;margin-bottom:30px}.swiper-scrollbar{--swiper-scrollbar-bottom:0px;--swiper-scrollbar-drag-bg-color:#dda3b6;--swiper-scrollbar-size:5px}.site{position:relative;max-width:400px;padding:1rem;font-family:inherit;font-size:1rem;font-weight:500;color:var(--clr-text);background-color:transparent;border-radius:10px;isolation:isolate;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.site::before{content:"";position:absolute;top:0;left:0;right:0;bottom:15px;background:rgba(236,149,200,.2);box-shadow:0 4px 30px rgba(0,0,0,.1);border-radius:10px;z-index:-1}.site-img{width:100%;max-width:400px;object-fit:cover;overflow:hidden;aspect-ratio:1;border-radius:6px}.site-body{align-items:center;gap:8px;padding:15px 0;cursor:default}.site-name{font-size:.9rem;font-weight:600;margin-bottom:2px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.site-author{width:fit-content;font-size:.8rem;font-weight:600;opacity:.6;color:var(--clr-text)}.site-avatar{width:40px;aspect-ratio:1/1;object-fit:cover;border-radius:5px;cursor:pointer}.site-actions{position:relative}.site-actions-content{position:absolute;bottom:130%;right:0;padding:8px;border-radius:8px;background:rgba(172,172,172,.2);backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);box-shadow:2px 2px 10px 2px hsl(0,0%,0%,.25);transition:opacity .25s,scale .25s;transform-origin:bottom right}.site-actions-content[data-visible=false]{pointer-events:none;opacity:0;scale:0}.site-actions-content[data-visible=true]{pointer-events:unset;scale:1;opacity:1}.site-actions-content li{padding:.5rem .65rem;border-radius:.25rem;list-style:none}.site-actions-content li:is(:hover,:focus-within){background-color:rgba(248,132,169,.7)}.site-actions-link{width:max-content;display:grid;grid-template-columns:1rem 1fr;align-items:center;gap:.6rem;color:inherit;text-decoration:none;cursor:pointer}.site-like{text-decoration:none;color:var(--clr-text);margin-right:5px;font-size:1.1rem;opacity:.65;border-radius:50%;overflow:hidden;transition:.35s}.site-actions-controller{border:0;background:0 0;color:var(--clr-text);cursor:pointer;opacity:.65}.site-actions-controller:hover,.site-like:hover{opacity:1}.site-like:focus{outline:0}.site-like.active{color:red;opacity:1;transform:scale(1.2)}@media (max-width:1200px){.swiper{width:80%}}@media (max-width:900px){#sites{padding:60px 80px}.swiper{width:50%}}@media (max-width:765px){.swiper{width:70%}}@media (max-width:550px){#sites{padding:40px}.swiper{width:80%}}img.no-drag{pointer-events:none}img.fog{pointer-events:none;position:absolute;left:0;top:0;width:100%;height:100%}#downtime{z-index:2;position:fixed;right:0;bottom:0;width:20%;transition:opacity .5s;opacity:0;cursor:pointer}blockquote.speech{position:absolute;display:inline-block;right:14vw;bottom:23vh;width:17vw;background:url(/assets/img/speech-bubble.svg) center;color:#000;padding-top:3%;padding-bottom:20%;background-repeat:no-repeat!important;margin:0 auto;text-align:center;box-sizing:content-box;line-height:1;font-family:SequentialistBB,cursive;font-size:1.2vw}.clock{bottom:0;position:fixed}html{scroll-margin-top:4rem}
|
||||||
1
templates/assets/css/loading.min.css
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
#loading-screen{display:flex;flex-direction:column;align-items:flex-start;padding:20px;color:#0f0;font-family:Monospace,'Courier New',Courier,monospace}.loading-line{white-space:nowrap;overflow:hidden;display:inline}.cursor{display:inline-block;width:10px;height:1em;background-color:#0f0}.loading-pre{display:inline;line-height:.9}.blue{color:#00f}.white{color:#fff}
|
||||||
2
templates/assets/css/profile.min.css
vendored
@@ -1 +1 @@
|
|||||||
.profile-container{height:300px}img.profile{width:300px;position:absolute;left:50%;margin-left:-150px;aspect-ratio:1;padding-top:calc(var(--s)/5);transform:scale(1);transition:.5s}img.foreground{border-radius:50%;pointer-events:none}img.background:hover{filter:blur(5px)}
|
.profile-container{height:300px}img.profile{width:300px;position:absolute;left:50%;margin-left:-150px;aspect-ratio:1;padding-top:calc(var(--s)/5);transform:scale(1);transition:filter .3s ease-in-out}img.foreground{border-radius:50%;pointer-events:none}img.background:hover{filter:blur(5px)}.address{max-width:100%}
|
||||||
2
templates/assets/css/resume.min.css
vendored
@@ -1 +1 @@
|
|||||||
.profile-container{height:170px;width:170px;z-index:2;left:10%}.title{position:absolute;margin-left:calc(100px);width:calc(100% - 100px);padding:1em;margin-top:-225px;z-index:0}.title>*{width:100%;margin-bottom:0}img.profile{left:10px;width:150px;position:absolute;aspect-ratio:1;transform:scale(1);transition:.5s;z-index:2}img.background2{left:0;width:170px!important;margin-top:-10px;pointer-events:none;z-index:1}img.foreground{border-radius:50%;pointer-events:none;z-index:3}img.background:hover,img.backgroundsml:hover{filter:blur(5px)}.spacer{height:100px}img.profilesml{width:150px;position:absolute;left:50%;margin-left:-75px;aspect-ratio:1;padding-top:calc(var(--s)/5);transform:scale(1);transition:.5s}img.foregroundsml{border-radius:50%;pointer-events:none}img.background2sml{width:170px!important;left:calc(50% - 10px);margin-top:-10px;pointer-events:none;z-index:0}@media print{div{color:#000!important}.noprintbreak{page-break-inside:avoid}.edu-main{page-break-before:always}}
|
.profile-container{height:170px;width:170px;z-index:2;left:10%}.title{position:absolute;margin-left:calc(100px);width:calc(100% - 100px);padding:1em;margin-top:-225px;z-index:0}.title>*{width:100%;margin-bottom:0}img.profile{left:10px;width:150px;position:absolute;aspect-ratio:1;transform:scale(1);transition:.5s;z-index:2}img.background2{left:0;width:170px!important;margin-top:-10px;pointer-events:none;z-index:1}img.foreground{border-radius:50%;pointer-events:none;z-index:3}img.background:hover,img.backgroundsml:hover{filter:blur(5px)}.spacer{height:100px}img.profilesml{width:150px;position:absolute;left:50%;margin-left:-85px;aspect-ratio:1;padding-top:calc(var(--s)/5);transform:scale(1);transition:.5s}img.foregroundsml{border-radius:50%;pointer-events:none}img.background2sml{width:170px!important;left:calc(50% - 10px);margin-top:-10px;pointer-events:none;z-index:0}print_text{color:#000!important}@media print{.noprintbreak{page-break-inside:avoid}*{color:#000;background-color:#fff}body{background-color:#fff}.hideprint{display:none}.print_text{color:#000!important}.profile-container{margin-top:10px!important}.r-heading1{font-size:16pt!important;margin-bottom:10px!important}.r-heading2{font-size:14pt!important}.r-heading3{font-size:12pt!important}.r-body,.r-small{font-size:10pt!important}.spacer{height:25px!important}}.r-heading1{margin-bottom:20px}.r-heading2{margin-bottom:0}.r-heading3{margin-bottom:.5em}@media (max-width:500px){.print_text{font-size:10px}}
|
||||||
2
templates/assets/css/styles.min.css
vendored
@@ -1 +1 @@
|
|||||||
.social-icons{color:#313437;background-color:#fff;padding:70px 0}@media (max-width:767px){.social-icons{padding:50px 0}}@media (max-width:500px){img.profile{width:200px;margin-left:-100px}.profile-container{height:200px;margin-top:2em!important}}.social-div{display:flex;justify-content:center;align-items:center}.social-list{display:flex;list-style:none;gap:2.5rem}.social-icons i{color:#757980;margin:0 10px;width:60px;height:60px;border:1px solid #c8ced7;text-align:center;border-radius:50%;line-height:60px;display:inline-block}.social-link a{text-decoration:none;width:4.8rem;height:4.8rem;background-color:#f0f9fe;border-radius:50%;display:flex;justify-content:center;align-items:center;position:relative;z-index:1;border:3px solid #f0f9fe;overflow:hidden}.social-link a::before{content:"";position:absolute;width:100%;height:100%;background:var(--bg-color);z-index:0;scale:1 0;transform-origin:bottom;transition:scale .5s}.social-link:hover a::before{scale:1 1}.icon{font-size:2rem;color:#011827;transition:.5s;z-index:2}.social-link a:hover .icon{color:#fff;transform:rotateY(360deg)}.social-link{--bg-color:#000}.social-link.discord{--bg-color:#5865f2}.social-link.mastodon{--bg-color:#6364ff}.social-link.youtube{--bg-color:#ff0000}.social-link.signal{--bg-color:#365eb6}
|
:root,[data-bs-theme=light]{--bs-primary:#6E0E9C;--bs-primary-rgb:110,14,156;--bs-primary-text-emphasis:#2C063E;--bs-primary-bg-subtle:#E2CFEB;--bs-primary-border-subtle:#C59FD7;--bs-link-color:#6E0E9C;--bs-link-color-rgb:110,14,156;--bs-link-hover-color:#a41685;--bs-link-hover-color-rgb:164,22,133}.btn-primary{--bs-btn-color:#fff;--bs-btn-bg:#6E0E9C;--bs-btn-border-color:#6E0E9C;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#5E0C85;--bs-btn-hover-border-color:#580B7D;--bs-btn-focus-shadow-rgb:233,219,240;--bs-btn-active-color:#fff;--bs-btn-active-bg:#580B7D;--bs-btn-active-border-color:#530B75;--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#6E0E9C;--bs-btn-disabled-border-color:#6E0E9C}.btn-outline-primary{--bs-btn-color:#6E0E9C;--bs-btn-border-color:#6E0E9C;--bs-btn-focus-shadow-rgb:110,14,156;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#6E0E9C;--bs-btn-hover-border-color:#6E0E9C;--bs-btn-active-color:#fff;--bs-btn-active-bg:#6E0E9C;--bs-btn-active-border-color:#6E0E9C;--bs-btn-disabled-color:#6E0E9C;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#6E0E9C}.py-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}@media (min-width:992px){.py-lg-5{padding-top:3rem!important;padding-bottom:3rem!important}}
|
||||||
BIN
templates/assets/img/IMG_20240504_115047125.webp
Normal file
|
After Width: | Height: | Size: 532 KiB |
|
Before Width: | Height: | Size: 7.4 KiB |
BIN
templates/assets/img/bg/BlueMountains.jpg
Normal file
|
After Width: | Height: | Size: 250 KiB |
BIN
templates/assets/img/bg/bg_sunset.webp
Normal file
|
After Width: | Height: | Size: 112 KiB |
|
Before Width: | Height: | Size: 49 KiB After Width: | Height: | Size: 49 KiB |
|
Before Width: | Height: | Size: 163 KiB After Width: | Height: | Size: 163 KiB |
BIN
templates/assets/img/bg/main.webp
Normal file
|
After Width: | Height: | Size: 532 KiB |
|
Before Width: | Height: | Size: 21 KiB After Width: | Height: | Size: 21 KiB |
BIN
templates/assets/img/bg/sunset.webp
Normal file
|
After Width: | Height: | Size: 112 KiB |
|
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 22 KiB |
|
Before Width: | Height: | Size: 8.6 KiB After Width: | Height: | Size: 8.6 KiB |
|
Before Width: | Height: | Size: 8.3 KiB After Width: | Height: | Size: 8.3 KiB |
|
Before Width: | Height: | Size: 4.7 KiB After Width: | Height: | Size: 4.7 KiB |
|
Before Width: | Height: | Size: 5.0 KiB After Width: | Height: | Size: 5.0 KiB |
|
Before Width: | Height: | Size: 4.1 KiB After Width: | Height: | Size: 4.1 KiB |
|
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 22 KiB |
|
Before Width: | Height: | Size: 9.4 KiB After Width: | Height: | Size: 9.4 KiB |
|
Before Width: | Height: | Size: 9.0 KiB After Width: | Height: | Size: 9.0 KiB |
|
Before Width: | Height: | Size: 4.9 KiB After Width: | Height: | Size: 4.9 KiB |
|
Before Width: | Height: | Size: 5.3 KiB After Width: | Height: | Size: 5.3 KiB |
|
Before Width: | Height: | Size: 4.1 KiB After Width: | Height: | Size: 4.1 KiB |
|
Before Width: | Height: | Size: 29 KiB After Width: | Height: | Size: 29 KiB |
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 28 KiB |
|
Before Width: | Height: | Size: 8.6 KiB After Width: | Height: | Size: 8.6 KiB |
|
Before Width: | Height: | Size: 29 KiB After Width: | Height: | Size: 29 KiB |
|
Before Width: | Height: | Size: 323 B After Width: | Height: | Size: 323 B |
|
Before Width: | Height: | Size: 918 B After Width: | Height: | Size: 918 B |
|
Before Width: | Height: | Size: 2.6 KiB After Width: | Height: | Size: 2.6 KiB |
|
Before Width: | Height: | Size: 371 B After Width: | Height: | Size: 371 B |
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 101 KiB After Width: | Height: | Size: 101 KiB |
|
Before Width: | Height: | Size: 62 KiB After Width: | Height: | Size: 62 KiB |
|
Before Width: | Height: | Size: 7.0 KiB After Width: | Height: | Size: 7.0 KiB |
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 11 KiB |
BIN
templates/assets/img/external/stWDBRN.png
vendored
Normal file
|
After Width: | Height: | Size: 25 KiB |
|
Before Width: | Height: | Size: 4.2 KiB |
|
Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 25 KiB |
|
Before Width: | Height: | Size: 89 KiB After Width: | Height: | Size: 89 KiB |
|
Before Width: | Height: | Size: 23 KiB After Width: | Height: | Size: 23 KiB |
|
Before Width: | Height: | Size: 856 B After Width: | Height: | Size: 856 B |
|
Before Width: | Height: | Size: 2.2 KiB After Width: | Height: | Size: 2.2 KiB |
BIN
templates/assets/img/favicon/favicon.ico
Normal file
|
After Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 44 KiB After Width: | Height: | Size: 44 KiB |
|
Before Width: | Height: | Size: 61 KiB After Width: | Height: | Size: 61 KiB |
|
Before Width: | Height: | Size: 44 KiB After Width: | Height: | Size: 44 KiB |
|
Before Width: | Height: | Size: 61 KiB After Width: | Height: | Size: 61 KiB |