0?u:["plain"],e=c):(u=Z(u,c.type),c.alias&&(u=Z(u,c.alias)),e=c.content),"string"!=typeof e){i++,t.push(u),n.push(e),r.push(0),o.push(e.length);continue}const d=e.split(K),p=d.length;l.push({types:u,content:d[0]});for(let t=1;t{const a=t.toLowerCase(),i=((e,t)=>{const[n,r]=(0,c.useState)(Q(t,e)),o=(0,c.useRef)(),a=(0,c.useRef)();return(0,c.useEffect)((()=>{t===o.current&&e===a.current||(o.current=t,a.current=e,r(Q(t,e)))}),[e,t]),n})(a,r),l=(e=>(0,c.useCallback)((t=>{var n=t,{className:r,style:o,line:a}=n,i=C(n,["className","style","line"]);const l=E(S({},i),{className:(0,d.A)("token-line",r)});return"object"==typeof e&&"plain"in e&&(l.style=e.plain),"object"==typeof o&&(l.style=S(S({},l.style||{}),o)),l}),[e]))(i),s=(e=>{const t=(0,c.useCallback)((({types:t,empty:n})=>{if(null!=e)return 1===t.length&&"plain"===t[0]?null!=n?{display:"inline-block"}:void 0:1===t.length&&null!=n?e[t[0]]:Object.assign(null!=n?{display:"inline-block"}:{},...t.map((t=>e[t])))}),[e]);return(0,c.useCallback)((e=>{var n=e,{token:r,className:o,style:a}=n,i=C(n,["token","className","style"]);const l=E(S({},i),{className:(0,d.A)("token",...r.types,o),children:r.content,style:t(r)});return null!=a&&(l.style=S(S({},l.style||{}),a)),l}),[t])})(i),u=(({prism:e,code:t,grammar:n,language:r})=>{const o=(0,c.useRef)(e);return(0,c.useMemo)((()=>{if(null==n)return X([t]);const e={code:t,grammar:n,language:r,tokens:[]};return o.current.hooks.run("before-tokenize",e),e.tokens=o.current.tokenize(t,n),o.current.hooks.run("after-tokenize",e),X(e.tokens)}),[t,n,r])})({prism:o,language:a,code:n,grammar:o.languages[a]});return e({tokens:u,className:`prism-code language-${a}`,style:null!=i?i.root:{},getLineProps:l,getTokenProps:s})},ee=e=>(0,c.createElement)(J,E(S({},e),{prism:e.prism||_,theme:e.theme||U,code:e.code,language:e.language}))},1561:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});var r=!0,o="Invariant failed";function a(e,t){if(!e){if(r)throw new Error(o);var n="function"==typeof t?t():t,a=n?"".concat(o,": ").concat(n):o;throw new Error(a)}}},2654:e=>{"use strict";e.exports={}},4054:e=>{"use strict";e.exports=JSON.parse('{"/markdown-page-3d7":{"__comp":"1f391b9e","__context":{"plugin":"a7456010"},"content":"393be207"},"/docs-a8a":{"__comp":"5e95c892","__context":{"plugin":"aba21aa0"}},"/docs-bb0":{"__comp":"a7bd4aaa","__props":"0058b4c6"},"/docs-c72":{"__comp":"a94703ab"},"/docs/-28c":{"__comp":"17896441","content":"c377a04b"},"/docs/-790":{"__comp":"17896441","content":"8a73a7e9"},"/docs/detectors/divideBeforeMultiply-b2e":{"__comp":"17896441","content":"2d30e363"},"/docs/detectors/neverAccessedVariables-275":{"__comp":"17896441","content":"99fe0faa"},"/docs/detectors/readOnlyVariables-47f":{"__comp":"17896441","content":"1c4404c4"},"/docs/detectors/unboundLoops-f3f":{"__comp":"17896441","content":"75494403"},"/docs/detectors/zeroAddress-ff8":{"__comp":"17896441","content":"d140f32c"},"/docs/misti/docs/detectors/divideBeforeMultiply-10d":{"__comp":"17896441","content":"ba87884a"},"/docs/misti/docs/detectors/neverAccessedVariables-2a1":{"__comp":"17896441","content":"c800e8dc"},"/docs/misti/docs/detectors/readOnlyVariables-bab":{"__comp":"17896441","content":"2bf12ee5"},"/docs/misti/docs/detectors/unboundLoops-b3b":{"__comp":"17896441","content":"5a7ca3c4"},"/docs/misti/docs/detectors/zeroAddress-186":{"__comp":"17896441","content":"1b0e53fa"},"/-e5f":{"__comp":"1df93b7f","__context":{"plugin":"a7456010"},"config":"5e9f5e1a"}}')}},e=>{e.O(0,[869],(()=>{return t=8536,e(e.s=t);var t}));e.O()}]);
\ No newline at end of file
diff --git a/assets/js/main.1dc14537.js.LICENSE.txt b/assets/js/main.1dc14537.js.LICENSE.txt
new file mode 100644
index 000000000..91dc89499
--- /dev/null
+++ b/assets/js/main.1dc14537.js.LICENSE.txt
@@ -0,0 +1,64 @@
+/* NProgress, (c) 2013, 2014 Rico Sta. Cruz - http://ricostacruz.com/nprogress
+ * @license MIT */
+
+/*! Bundled license information:
+
+prismjs/prism.js:
+ (**
+ * Prism: Lightweight, robust, elegant syntax highlighting
+ *
+ * @license MIT
+ * @author Lea Verou
+ * @namespace
+ * @public
+ *)
+*/
+
+/**
+ * @license React
+ * react-dom.production.min.js
+ *
+ * Copyright (c) Facebook, Inc. and its affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+/**
+ * @license React
+ * react-jsx-runtime.production.min.js
+ *
+ * Copyright (c) Facebook, Inc. and its affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+/**
+ * @license React
+ * react.production.min.js
+ *
+ * Copyright (c) Facebook, Inc. and its affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+/**
+ * @license React
+ * scheduler.production.min.js
+ *
+ * Copyright (c) Facebook, Inc. and its affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+/** @license React v16.13.1
+ * react-is.production.min.js
+ *
+ * Copyright (c) Facebook, Inc. and its affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
diff --git a/assets/js/runtime~main.c80f0f15.js b/assets/js/runtime~main.c80f0f15.js
new file mode 100644
index 000000000..c452ea29a
--- /dev/null
+++ b/assets/js/runtime~main.c80f0f15.js
@@ -0,0 +1 @@
+(()=>{"use strict";var e,t,a,r,o,n={},i={};function f(e){var t=i[e];if(void 0!==t)return t.exports;var a=i[e]={id:e,loaded:!1,exports:{}};return n[e].call(a.exports,a,a.exports,f),a.loaded=!0,a.exports}f.m=n,f.c=i,e=[],f.O=(t,a,r,o)=>{if(!a){var n=1/0;for(b=0;b=o)&&Object.keys(f.O).every((e=>f.O[e](a[c])))?a.splice(c--,1):(i=!1,o0&&e[b-1][2]>o;b--)e[b]=e[b-1];e[b]=[a,r,o]},f.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return f.d(t,{a:t}),t},a=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,f.t=function(e,r){if(1&r&&(e=this(e)),8&r)return e;if("object"==typeof e&&e){if(4&r&&e.__esModule)return e;if(16&r&&"function"==typeof e.then)return e}var o=Object.create(null);f.r(o);var n={};t=t||[null,a({}),a([]),a(a)];for(var i=2&r&&e;"object"==typeof i&&!~t.indexOf(i);i=a(i))Object.getOwnPropertyNames(i).forEach((t=>n[t]=()=>e[t]));return n.default=()=>e,f.d(o,n),o},f.d=(e,t)=>{for(var a in t)f.o(t,a)&&!f.o(e,a)&&Object.defineProperty(e,a,{enumerable:!0,get:t[a]})},f.f={},f.e=e=>Promise.all(Object.keys(f.f).reduce(((t,a)=>(f.f[a](e,t),t)),[])),f.u=e=>"assets/js/"+({48:"a94703ab",61:"1f391b9e",98:"a7bd4aaa",109:"75494403",134:"393be207",226:"99fe0faa",232:"1b0e53fa",235:"a7456010",310:"ba87884a",361:"c377a04b",401:"17896441",414:"d140f32c",433:"c800e8dc",510:"8a73a7e9",583:"1df93b7f",647:"5e95c892",693:"2d30e363",742:"aba21aa0",814:"5a7ca3c4",849:"0058b4c6",873:"2bf12ee5",978:"1c4404c4"}[e]||e)+"."+{48:"c39a457c",61:"626d064b",98:"84bfc07d",109:"c989144e",134:"0f7fdec3",226:"7ef1e624",232:"169173ee",235:"99ddad29",237:"b39130ae",310:"6ec3c504",361:"5ed52ee5",401:"a3c0cff3",414:"62bcf9db",433:"6d3429f8",510:"0dc0785d",583:"f4e77d60",647:"c6c359fc",658:"bb3587c3",693:"6b0c426f",742:"742298cb",814:"282b9650",849:"ae22c067",873:"8a0f60f2",978:"ce527f8c"}[e]+".js",f.miniCssF=e=>{},f.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),f.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r={},o="nowarp-github-io:",f.l=(e,t,a,n)=>{if(r[e])r[e].push(t);else{var i,c;if(void 0!==a)for(var d=document.getElementsByTagName("script"),b=0;b{i.onerror=i.onload=null,clearTimeout(s);var o=r[e];if(delete r[e],i.parentNode&&i.parentNode.removeChild(i),o&&o.forEach((e=>e(a))),t)return t(a)},s=setTimeout(l.bind(null,void 0,{type:"timeout",target:i}),12e4);i.onerror=l.bind(null,i.onerror),i.onload=l.bind(null,i.onload),c&&document.head.appendChild(i)}},f.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},f.p="/",f.gca=function(e){return e={17896441:"401",75494403:"109",a94703ab:"48","1f391b9e":"61",a7bd4aaa:"98","393be207":"134","99fe0faa":"226","1b0e53fa":"232",a7456010:"235",ba87884a:"310",c377a04b:"361",d140f32c:"414",c800e8dc:"433","8a73a7e9":"510","1df93b7f":"583","5e95c892":"647","2d30e363":"693",aba21aa0:"742","5a7ca3c4":"814","0058b4c6":"849","2bf12ee5":"873","1c4404c4":"978"}[e]||e,f.p+f.u(e)},(()=>{var e={354:0,869:0};f.f.j=(t,a)=>{var r=f.o(e,t)?e[t]:void 0;if(0!==r)if(r)a.push(r[2]);else if(/^(354|869)$/.test(t))e[t]=0;else{var o=new Promise(((a,o)=>r=e[t]=[a,o]));a.push(r[2]=o);var n=f.p+f.u(t),i=new Error;f.l(n,(a=>{if(f.o(e,t)&&(0!==(r=e[t])&&(e[t]=void 0),r)){var o=a&&("load"===a.type?"missing":a.type),n=a&&a.target&&a.target.src;i.message="Loading chunk "+t+" failed.\n("+o+": "+n+")",i.name="ChunkLoadError",i.type=o,i.request=n,r[1](i)}}),"chunk-"+t,t)}},f.O.j=t=>0===e[t];var t=(t,a)=>{var r,o,n=a[0],i=a[1],c=a[2],d=0;if(n.some((t=>0!==e[t]))){for(r in i)f.o(i,r)&&(f.m[r]=i[r]);if(c)var b=c(f)}for(t&&t(a);d
+
+
+
+
+Divide before Multiply | Misti
+
+
+
+
+Detectors Divide before Multiply On this page
Divide before Multiply
+
A detector that identifies and corrects instances of division before multiplication to
+ensure accurate mathematical operations.
+
Why is it bad?
+
Performing division before multiplication can lead to unexpected results due to precision loss and rounding errors:
+
+Precision Loss: Dividing first can result in significant precision loss, especially when dealing with integers or fixed-point numbers.
+Rounding Errors: Early division might cause rounding errors that propagate through subsequent calculations.
+Unexpected Behavior: Misordered operations can lead to incorrect outcomes, making debugging and maintenance more challenging.
+
+
Example
+
let a: Int = 10; let b: Int = 3; let c: Int = 2; // Bad: Division before multiplication let result: Int = a / b * c;
+
Use instead:
+
let a: Int = 10; let b: Int = 3; let c: Int = 2; // Correct: Multiplication before division let result: Int = a * c / b;
+
+
\ No newline at end of file
diff --git a/docs/detectors/neverAccessedVariables/index.html b/docs/detectors/neverAccessedVariables/index.html
new file mode 100644
index 000000000..cc70334ae
--- /dev/null
+++ b/docs/detectors/neverAccessedVariables/index.html
@@ -0,0 +1,22 @@
+
+
+
+
+
+Never-accessed Variables | Misti
+
+
+
+
+Detectors Never-accessed Variables On this page
Never-accessed Variables
+
A detector that identifies write-only or unused variables, fields and constants.
+
Why is it bad?
+
These variables are either assigned but never used in any meaningful computation,
+or they are declared and never used at all, which may indicate redundant code
+or an incomplete implementation of the intended logic.
+
Example
+
// Error: the developer forgot to use the constant const MAX_SUPPLY: Int = 1000; fun mint(to: Address, amount: Int) { balances.set(to, balances.get(to)!! + amount); totalSupply += amount; }
+
Use instead:
+
const MAX_SUPPLY: Int = 1000; fun mint(to: Address, amount: Int) { // OK: Fixed after the linter highlighted this warning require(totalSupply + amount <= MAX_SUPPLY, "Exceeds max supply"); balances.set(to, balances.get(to)!! + amount); totalSupply += amount; }
+
+
\ No newline at end of file
diff --git a/docs/detectors/readOnlyVariables/index.html b/docs/detectors/readOnlyVariables/index.html
new file mode 100644
index 000000000..54ea35c41
--- /dev/null
+++ b/docs/detectors/readOnlyVariables/index.html
@@ -0,0 +1,21 @@
+
+
+
+
+
+Read-only Variables | Misti
+
+
+
+
+Detectors Read-only Variables On this page
Read-only Variables
+
A detector that identifies read-only variables and fields.
+
Why is it bad?
+
These variables could typically be replaced with constants to optimize performance.
+Alternatively, identifying read-only variables may reveal issues where unused values are being replaced unintentionally.
+
Example
+
fun calculateFinalPrice(price: Int): Int { // Warning: the developer uses a read-only variable that could be a constant let DISCOUNT_AMOUNT: Int = 10; return price - DISCOUNT_AMOUNT; }
+
Use instead:
+
const DISCOUNT_AMOUNT: Int = 10; fun calculateFinalPrice(price: Int): Int { // OK: Fixed after the linter highlighted this warning return price - DISCOUNT_AMOUNT; }
+
+
\ No newline at end of file
diff --git a/docs/detectors/unboundLoops/index.html b/docs/detectors/unboundLoops/index.html
new file mode 100644
index 000000000..6d7bc616d
--- /dev/null
+++ b/docs/detectors/unboundLoops/index.html
@@ -0,0 +1,25 @@
+
+
+
+
+
+Unbound Loops | Misti
+
+
+
+
+On this page
Unbound Loops
+
A detector that analyzes loop conditions and control flow to ensure loops have proper termination criteria.
+
Why is it bad?
+
An unbounded loop can be problematic for several reasons:
+
+Unexpected Behavior: Without a defined termination, loops can lead to unpredictable contract behavior and make debugging difficult.
+Out-of-gas Attacks: Continuous looping without termination can lead to out-of-gas attacks.
+DoS Attacks: Malicious actors can exploit unbounded loops to create denial-of-service attacks, impacting contract's availability.
+
+
Example
+
let x: Int = 10; while (x > 0) { // Bad: x is not changed due looping send(SendParameters{ to: sender(), ... }); }
+
Use instead:
+
let x: Int = 10; while (x > 0) { send(SendParameters{ to: sender(), ... }); x = x - 1; }
+
+
\ No newline at end of file
diff --git a/docs/detectors/zeroAddress/index.html b/docs/detectors/zeroAddress/index.html
new file mode 100644
index 000000000..83da36a1e
--- /dev/null
+++ b/docs/detectors/zeroAddress/index.html
@@ -0,0 +1,23 @@
+
+
+
+
+
+Zero Address | Misti
+
+
+
+
+On this page
Zero Address
+
A detector that identifies uses of the zero address.
+
Why is it bad?
+
Using the zero address in smart contracts is typically problematic because it can be
+exploited as a default or uninitialized address, leading to unintended transfers and
+security vulnerabilities. Additionally, operations involving the zero address can
+result in loss of funds or tokens, as there is no private key to access this address.
+
Example
+
contract Proxy { to: Address; init() { // Warning: Insecure usage of zero address as default value self.to = newAddress(0, 0); } fun setAddress(to: Address) { self.to = to } }
+
Use instead:
+
contract Proxy { to: Address; init(to: Address) { // Fixed: Using the input value on initializaiton. self.to = to; } fun setAddress(to: Address) { self.to = to } }
+
+
\ No newline at end of file
diff --git a/docs/index.html b/docs/index.html
new file mode 100644
index 000000000..2ac12d02c
--- /dev/null
+++ b/docs/index.html
@@ -0,0 +1,19 @@
+
+
+
+
+
+Misti | Misti
+
+
+
+
+On this page
Misti is a static analysis tool for Tact smart contracts.
+
Installation
+
Clone the repository and install dependencies:
+
git clone https://github.com/nowarp/misti cd misti yarn install && yarn build
+
Quick Start
+
Run Misti by specifying a Tact project configuration:
+
./bin/misti test/projects/simple/tactConfig.json
+
+
\ No newline at end of file
diff --git a/docs/misti/docs/detectors/divideBeforeMultiply/index.html b/docs/misti/docs/detectors/divideBeforeMultiply/index.html
new file mode 100644
index 000000000..c853df31d
--- /dev/null
+++ b/docs/misti/docs/detectors/divideBeforeMultiply/index.html
@@ -0,0 +1,26 @@
+
+
+
+
+
+Divide before Multiply | Misti
+
+
+
+
+On this page
Divide before Multiply
+
A detector that identifies and corrects instances of division before multiplication to
+ensure accurate mathematical operations.
+
Why is it bad?
+
Performing division before multiplication can lead to unexpected results due to precision loss and rounding errors:
+
+Precision Loss: Dividing first can result in significant precision loss, especially when dealing with integers or fixed-point numbers.
+Rounding Errors: Early division might cause rounding errors that propagate through subsequent calculations.
+Unexpected Behavior: Misordered operations can lead to incorrect outcomes, making debugging and maintenance more challenging.
+
+
Example
+
let a: Int = 10; let b: Int = 3; let c: Int = 2; // Bad: Division before multiplication let result: Int = a / b * c;
+
Use instead:
+
let a: Int = 10; let b: Int = 3; let c: Int = 2; // Correct: Multiplication before division let result: Int = a * c / b;
+
+
\ No newline at end of file
diff --git a/docs/misti/docs/detectors/neverAccessedVariables/index.html b/docs/misti/docs/detectors/neverAccessedVariables/index.html
new file mode 100644
index 000000000..b77364a6a
--- /dev/null
+++ b/docs/misti/docs/detectors/neverAccessedVariables/index.html
@@ -0,0 +1,22 @@
+
+
+
+
+
+Never-accessed Variables | Misti
+
+
+
+
+On this page
Never-accessed Variables
+
A detector that identifies write-only or unused variables, fields and constants.
+
Why is it bad?
+
These variables are either assigned but never used in any meaningful computation,
+or they are declared and never used at all, which may indicate redundant code
+or an incomplete implementation of the intended logic.
+
Example
+
// Error: the developer forgot to use the constant const MAX_SUPPLY: Int = 1000; fun mint(to: Address, amount: Int) { balances.set(to, balances.get(to)!! + amount); totalSupply += amount; }
+
Use instead:
+
const MAX_SUPPLY: Int = 1000; fun mint(to: Address, amount: Int) { // OK: Fixed after the linter highlighted this warning require(totalSupply + amount <= MAX_SUPPLY, "Exceeds max supply"); balances.set(to, balances.get(to)!! + amount); totalSupply += amount; }
+
+
\ No newline at end of file
diff --git a/docs/misti/docs/detectors/readOnlyVariables/index.html b/docs/misti/docs/detectors/readOnlyVariables/index.html
new file mode 100644
index 000000000..8724e872b
--- /dev/null
+++ b/docs/misti/docs/detectors/readOnlyVariables/index.html
@@ -0,0 +1,21 @@
+
+
+
+
+
+Read-only Variables | Misti
+
+
+
+
+On this page
Read-only Variables
+
A detector that identifies read-only variables and fields.
+
Why is it bad?
+
These variables could typically be replaced with constants to optimize performance.
+Alternatively, identifying read-only variables may reveal issues where unused values are being replaced unintentionally.
+
Example
+
fun calculateFinalPrice(price: Int): Int { // Warning: the developer uses a read-only variable that could be a constant let DISCOUNT_AMOUNT: Int = 10; return price - DISCOUNT_AMOUNT; }
+
Use instead:
+
const DISCOUNT_AMOUNT: Int = 10; fun calculateFinalPrice(price: Int): Int { // OK: Fixed after the linter highlighted this warning return price - DISCOUNT_AMOUNT; }
+
+
\ No newline at end of file
diff --git a/docs/misti/docs/detectors/unboundLoops/index.html b/docs/misti/docs/detectors/unboundLoops/index.html
new file mode 100644
index 000000000..b3b3bfe25
--- /dev/null
+++ b/docs/misti/docs/detectors/unboundLoops/index.html
@@ -0,0 +1,25 @@
+
+
+
+
+
+Unbound Loops | Misti
+
+
+
+
+On this page
Unbound Loops
+
A detector that analyzes loop conditions and control flow to ensure loops have proper termination criteria.
+
Why is it bad?
+
An unbounded loop can be problematic for several reasons:
+
+Unexpected Behavior: Without a defined termination, loops can lead to unpredictable contract behavior and make debugging difficult.
+Out-of-gas Attacks: Continuous looping without termination can lead to out-of-gas attacks.
+DoS Attacks: Malicious actors can exploit unbounded loops to create denial-of-service attacks, impacting contract's availability.
+
+
Example
+
let x: Int = 10; while (x > 0) { // Bad: x is not changed due looping send(SendParameters{ to: sender(), ... }); }
+
Use instead:
+
let x: Int = 10; while (x > 0) { send(SendParameters{ to: sender(), ... }); x = x - 1; }
+
+
\ No newline at end of file
diff --git a/docs/misti/docs/detectors/zeroAddress/index.html b/docs/misti/docs/detectors/zeroAddress/index.html
new file mode 100644
index 000000000..28fe0b8ea
--- /dev/null
+++ b/docs/misti/docs/detectors/zeroAddress/index.html
@@ -0,0 +1,23 @@
+
+
+
+
+
+Zero Address | Misti
+
+
+
+
+On this page
Zero Address
+
A detector that identifies uses of the zero address.
+
Why is it bad?
+
Using the zero address in smart contracts is typically problematic because it can be
+exploited as a default or uninitialized address, leading to unintended transfers and
+security vulnerabilities. Additionally, operations involving the zero address can
+result in loss of funds or tokens, as there is no private key to access this address.
+
Example
+
contract Proxy { to: Address; init() { // Warning: Insecure usage of zero address as default value self.to = newAddress(0, 0); } fun setAddress(to: Address) { self.to = to } }
+
Use instead:
+
contract Proxy { to: Address; init(to: Address) { // Fixed: Using the input value on initializaiton. self.to = to; } fun setAddress(to: Address) { self.to = to } }
+
+
\ No newline at end of file
diff --git a/img/docusaurus-social-card.jpg b/img/docusaurus-social-card.jpg
new file mode 100644
index 000000000..ffcb44821
Binary files /dev/null and b/img/docusaurus-social-card.jpg differ
diff --git a/img/docusaurus.png b/img/docusaurus.png
new file mode 100644
index 000000000..f458149e3
Binary files /dev/null and b/img/docusaurus.png differ
diff --git a/img/favicon.ico b/img/favicon.ico
new file mode 100644
index 000000000..c01d54bcd
Binary files /dev/null and b/img/favicon.ico differ
diff --git a/img/logo.svg b/img/logo.svg
new file mode 100644
index 000000000..9db6d0d06
--- /dev/null
+++ b/img/logo.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/img/undraw_docusaurus_mountain.svg b/img/undraw_docusaurus_mountain.svg
new file mode 100644
index 000000000..af961c49a
--- /dev/null
+++ b/img/undraw_docusaurus_mountain.svg
@@ -0,0 +1,171 @@
+
+ Easy to Use
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/undraw_docusaurus_react.svg b/img/undraw_docusaurus_react.svg
new file mode 100644
index 000000000..94b5cf08f
--- /dev/null
+++ b/img/undraw_docusaurus_react.svg
@@ -0,0 +1,170 @@
+
+ Powered by React
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/undraw_docusaurus_tree.svg b/img/undraw_docusaurus_tree.svg
new file mode 100644
index 000000000..d9161d339
--- /dev/null
+++ b/img/undraw_docusaurus_tree.svg
@@ -0,0 +1,40 @@
+
+ Focus on What Matters
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/index.html b/index.html
new file mode 100644
index 000000000..af77d63ba
--- /dev/null
+++ b/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+
+Misti
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/markdown-page/index.html b/markdown-page/index.html
new file mode 100644
index 000000000..647a6b20a
--- /dev/null
+++ b/markdown-page/index.html
@@ -0,0 +1,14 @@
+
+
+
+
+
+Markdown page example | Misti
+
+
+
+
+Markdown page example
+You don't need React to write simple standalone pages.
+
+
\ No newline at end of file
diff --git a/sitemap.xml b/sitemap.xml
new file mode 100644
index 000000000..765d680fc
--- /dev/null
+++ b/sitemap.xml
@@ -0,0 +1 @@
+https://nowarp.github.io/markdown-page weekly 0.5 https://nowarp.github.io/docs/ weekly 0.5 https://nowarp.github.io/docs/ weekly 0.5 https://nowarp.github.io/docs/detectors/divideBeforeMultiply weekly 0.5 https://nowarp.github.io/docs/detectors/neverAccessedVariables weekly 0.5 https://nowarp.github.io/docs/detectors/readOnlyVariables weekly 0.5 https://nowarp.github.io/docs/detectors/unboundLoops weekly 0.5 https://nowarp.github.io/docs/detectors/zeroAddress weekly 0.5 https://nowarp.github.io/docs/misti/docs/detectors/divideBeforeMultiply weekly 0.5 https://nowarp.github.io/docs/misti/docs/detectors/neverAccessedVariables weekly 0.5 https://nowarp.github.io/docs/misti/docs/detectors/readOnlyVariables weekly 0.5 https://nowarp.github.io/docs/misti/docs/detectors/unboundLoops weekly 0.5 https://nowarp.github.io/docs/misti/docs/detectors/zeroAddress weekly 0.5 https://nowarp.github.io/ weekly 0.5
\ No newline at end of file