This commit is contained in:
Empire Phoenix 2025-01-29 02:03:00 +01:00
parent 3f63b3ed98
commit 1741bb0b53
42 changed files with 278 additions and 194 deletions

BIN
logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

BIN
website/assets/logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

View File

@ -1,69 +1,38 @@
# -- Site Configuration -- theme = "blowfish"
# Refer to the theme docs for more details about each of these parameters.
# https://blowfish.page/docs/getting-started/
theme = "blowfish" # UNCOMMENT THIS LINE
# baseURL = "https://your_domain.com/"
defaultContentLanguage = "en" defaultContentLanguage = "en"
# pluralizeListTitles = "true" # hugo function useful for non-english languages, find out more in https://gohugo.io/getting-started/configuration/#pluralizelisttitles
enableRobotsTXT = true enableRobotsTXT = true
summaryLength = 0 summaryLength = 0
buildDrafts = false buildDrafts = false
buildFuture = false buildFuture = false
enableEmoji = true enableEmoji = true
baseURL = "https://plantctrl.org/"
# googleAnalytics = "G-XXXXXXXXX"
[pagination] [pagination]
pagerSize = 100 pagerSize = 100
[imaging] [imaging]
anchor = 'Center' anchor = "Center"
[taxonomies] [taxonomies]
tag = "tags" tag = "tags"
category = "categories" category = "categories"
author = "authors" author = "authors"
series = "series" series = "series"
[sitemap] [sitemap]
changefreq = 'daily' changefreq = "daily"
filename = 'sitemap.xml' filename = "sitemap.xml"
priority = 0.5 priority = 0.5
[outputs] [outputs]
home = ["HTML", "RSS", "JSON"] home = [ "HTML" ]
[related] [related]
threshold = 0 threshold = 100
toLower = false toLower = false
indices = [ { name = "tags", weight = 100 }, { name = "categories", weight = 100 }, { name = "series", weight = 50 }, { name = "authors", weight = 20 }, { name = "date", weight = 10 }, { applyFilter = false, name = "fragmentrefs", type = "fragments", weight = 10 } ]
[[related.indices]] [params]
name = "tags" recentArticles = 2
weight = 100 mainSections = ["hardware","software"]
[[related.indices]]
name = "categories"
weight = 100
[[related.indices]]
name = "series"
weight = 50
[[related.indices]]
name = "authors"
weight = 20
[[related.indices]]
name = "date"
weight = 10
[[related.indices]]
applyFilter = false
name = 'fragmentrefs'
type = 'fragments'
weight = 10

View File

@ -9,9 +9,7 @@ displayName = "EN"
isoCode = "en" isoCode = "en"
rtl = false rtl = false
dateFormat = "2 January 2006" dateFormat = "2 January 2006"
logo = "example.png" logo = "logo.png"
description = "OpenSource DIY Watering and Monitoring for Plants" description = "OpenSource DIY Watering and Monitoring for Plants"
author = { name = "Empire-Phoenix", image = "author_logo.jpg" } author = { name = "Empire-Phoenix", image = "author_logo.jpg" }
secondaryLogo = "logo.png"
[author]
image = "author_logo.jpg"

View File

@ -1,12 +1,6 @@
[[main]] [[main]]
none = "none" none = "none"
[[main]]
name = "About"
pageRef = "About"
identifier = "u4ojocQKbq"
weight = 3
[[main]] [[main]]
name = "Hardware" name = "Hardware"
pageRef = "Hardware" pageRef = "Hardware"

View File

@ -19,30 +19,29 @@ layout = "basic"
showMenu = true showMenu = true
showCopyright = true showCopyright = true
showThemeAttribution = true showThemeAttribution = true
showAppearanceSwitcher = true showAppearanceSwitcher = false
showScrollToTop = true showScrollToTop = true
[homepage] [homepage]
layout = "background" layout = "background"
showRecent = true showRecent = true
showRecentItems = 5 showRecentItems = "90"
showMoreLink = false
showMoreLinkDest = "/posts/"
cardView = true cardView = true
cardViewScreenWidth = false cardViewScreenWidth = ""
layoutBackgroundBlur = false layoutBackgroundBlur = false
homepageImage = "IMG_20240907_135042.jpg" homepageImage = "IMG_20240907_135042.jpg"
[article] [article]
showDate = true showDate = false
showViews = false showViews = false
showLikes = false showLikes = false
showDateOnlyInArticle = false showDateOnlyInArticle = false
showDateUpdated = false showDateUpdated = false
showAuthor = true showAuthor = true
showHero = false showHero = true
layoutBackgroundBlur = true layoutBackgroundBlur = true
layoutBackgroundHeaderSpace = true layoutBackgroundHeaderSpace = false
showBreadcrumbs = false showBreadcrumbs = false
showDraftLabel = true showDraftLabel = true
showEdit = false showEdit = false
@ -51,15 +50,17 @@ seriesOpened = false
showHeadingAnchors = true showHeadingAnchors = true
showPagination = true showPagination = true
invertPagination = false invertPagination = false
showReadingTime = true showReadingTime = false
showTableOfContents = false showTableOfContents = true
showTaxonomies = false showTaxonomies = false
showAuthorsBadges = false showAuthorsBadges = false
showWordCount = true showWordCount = true
showZenMode = false showZenMode = false
heroStyle = "background"
relatedContentLimit = "99"
[list] [list]
showHero = false showHero = true
layoutBackgroundBlur = true layoutBackgroundBlur = true
layoutBackgroundHeaderSpace = true layoutBackgroundHeaderSpace = true
showBreadcrumbs = false showBreadcrumbs = false
@ -73,18 +74,20 @@ groupByYear = true
cardView = false cardView = false
cardViewScreenWidth = false cardViewScreenWidth = false
constrainItemsWidth = false constrainItemsWidth = false
heroStyle = "background"
[sitemap] [sitemap]
excludedKinds = [ "taxonomy", "term" ] excludedKinds = [ "taxonomy", "term" ]
[taxonomy] [taxonomy]
showTermCount = true showTermCount = false
showHero = "" showHero = ""
showBreadcrumbs = false showBreadcrumbs = false
showViews = false showViews = false
showLikes = false showLikes = false
showTableOfContents = false showTableOfContents = false
cardView = "" cardView = false
heroStyle = "background"
[term] [term]
showHero = false showHero = false

View File

@ -1,19 +0,0 @@
---
title: "About"
date: 2025-01-24
draft: false
description: "a description"
tags: ["example", "tag"]
---
# Target group:
* DIY
* OpenSource
* Small scale (as in balcony/garden not agriculture)
* Automatic Watering for a limited amount of time via a water tank (I do not recommend pipe connection due to flooding risks)
* Use as is, or improve as you see fit
Initial creation story here

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 98 KiB

View File

@ -2,14 +2,23 @@
title: "RTC" title: "RTC"
date: 2025-01-27 date: 2025-01-27
draft: false draft: false
description: "a description" description: "external rtc"
tags: ["example", "tag"] tags: ["rtc", "eeprom"]
--- ---
an example to get you started # RTC
# This is a heading The board can be connected to a external DS3231 RTC.
## This is a subheading
### This is a subsubheading This allows the board to run fully of grid, without any kind of external connection after the initial setup.
#### This is a subsubsubheading
This is a paragraph with **bold** and *italic* text. *During initial setup, the time can be synchronized to the RTC via the configmode website.
Check more at [Blowfish documentation](https://blowfish.page/) * The used RTC module is supplied with 3.3v from the low power supply if the main battery is connected
undefined * It can also supply the battery via a small lithium cell on the board for several years, in case main power is missing, e.G. during longer dark winter days when running of solar.
# Backup
* The RTC module also usually contains a small eeprom, that can be utilized to store a backup of the configuration. Either to simply be able to revert to a prior setup, or as an additional precaution.
* Backups will be stored with a crc16, so should be protected against random bitflips.
* The backup is stored agnostic to the platform, as in it just stores bytes and has no understand of it for usual backup recovery procedure. The logic is done in the webclient. This also allows to manually patch older version of the config file if required, eg. due to a failed migration with missing fields.
## Planned
* In case the main config file is damaged, the firmeware should attempt to use the backup file (without replacing the damaged file), and check if this allows a startup
* Backup Battery health estimation/ fail indicator

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 98 KiB

After

Width:  |  Height:  |  Size: 1.7 MiB

View File

@ -3,13 +3,37 @@ title: "BatteryManagement"
date: 2025-01-27 date: 2025-01-27
draft: false draft: false
description: "a description" description: "a description"
tags: ["example", "tag"] tags: ["battery", "bq34z100"]
--- ---
an example to get you started # BatteryManagment
# This is a heading The project contains an additional companion board, with a bq34z100 battery management ic.
## This is a subheading
### This is a subsubheading It allows to track the health and charge for an external battery and is supposed to be soldered directly to the battery.
#### This is a subsubsubheading The main board contains a xt30 connector for power, and additionally a two pin I2C bus next/combined with it, to communicate with the BatteryManagement.
This is a paragraph with **bold** and *italic* text.
Check more at [Blowfish documentation](https://blowfish.page/) # Setup
undefined {{< alert >}}
A protected Battery is required. There is only a very simplistic output voltage adjustment for the MPPT system and no charge termination. It is expected that the battery itself protects against overcharging and deep discharges!
{{< /alert >}}
* BatteryManagement is purely optional, but recommended for solar power.
* If available it will be used for an extended low power deep sleep in case of critical charge.
* If available it will also be used, to reduce the nightlight, if the charge drops to a predefined level, so the nightlight cannot drain to much battery
* If available, all relevant battery metrics will be published via mqtt
Currently the setup requires a custom Ev2400 flasher and the properitary windows software from texas instruments.
{{< alert >}}
Before soldering to the battery
{{< /alert >}}
1. The voltage devider high side must be bridged, while being connected to the computer and being supplied with around 4.2 V from the battery solder leads.
2. Then the data/register for low voltage flash write protection should be set to 0V, as else with the voltage divider and no further configuration, the IC will refuse all write requests.
3. After this the supplied golden image can be used, it will setup the battery for 6Ah and a 4S lifepo. Different values can be adjusted after this to the users liking.
{{< alert >}}
The main board, does not care or process any of the charge discharge limits that can be set. Ensure that the battery can supply enough current as well as accept a 2A charging current from the MPPT system.
{{< /alert >}}
The golden image sets the statups led up, to be in blinky mode. one very long interval means, that the battery is pretty much full. A few very short flashes mean that the battery is nearly empty. No light means, that the battery is in discharge protection and shut down.
If the red error led lights, something is wrong with the battery. This can be abnormal voltages or a very low health state.
# Todo?
If the battery reports that no discharging should occure, report this and then shutdown without using pumps

Binary file not shown.

After

Width:  |  Height:  |  Size: 818 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 98 KiB

View File

@ -3,13 +3,24 @@ title: "MPPT"
date: 2025-01-27 date: 2025-01-27
draft: false draft: false
description: "a description" description: "a description"
tags: ["example", "tag"] tags: ["MPPT", "solar"]
--- ---
an example to get you started # MPPT
# This is a heading If the board is powered by solar, a on board MPPT converter tries to track the best current and voltage, so that the battery gets maximized charging current.
## This is a subheading
### This is a subsubheading The currently used MPPT limits max current to 2A.
#### This is a subsubsubheading
This is a paragraph with **bold** and *italic* text. There are two adjustable values for the MPPT, Input Power Point and Output Voltage.
Check more at [Blowfish documentation](https://blowfish.page/)
undefined #Setup
{{< alert >}}
Note: Only protected Batteries are supported!
{{< /alert >}}
1. Supply the Ext Charge connector with 20V and a limited current (suggested 100mA).
2. If the board does not startup, adjust the MPPT untill it supplies a output voltage. Note: The ESP should be able to startup at any settable output voltage, as it uses a converter to 3.3v anyways.
3. Adjust the Output Voltage to the correct charging voltage for your Chosen Battery.
4. Connect a sink (or the a non fully charged battery) to the Output, now adjust the MPPT so, that the Input Voltage drops to the optimal working Voltage of your Solar panel. The Converter will try to always keep the Panel at this Voltage by adjusting the Output Current accordingly.
Setting the MPPT slightly lower than the suggested Voltage will ensure more reliable operation, as the optimal voltage might drop a bit due to ageing and dust on the panel. Normally during summer there is more than enough power, so a slight inefficentcy won't be noticable.
However during winter in low light and bad weather conditions, that might be the difference between charging at all or no power. (If the panel does not reach the MPPT voltage, there is no charging current)

Binary file not shown.

After

Width:  |  Height:  |  Size: 404 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 98 KiB

View File

@ -3,13 +3,13 @@ title: "NightLight"
date: 2025-01-27 date: 2025-01-27
draft: false draft: false
description: "a description" description: "a description"
tags: ["example", "tag"] tags: ["nightlight"]
--- ---
an example to get you started # Nightlight
# This is a heading The board has a adjustable light output, which can be used to power a small led strip.
## This is a subheading In the configuration, the working hours can be set, as well as if the light is allowed to be turned on, even if the solar panel still supplies power.
### This is a subsubheading The supply should theoretically be able to supply up to 2A with a voltage lower than the battery.
#### This is a subsubsubheading
This is a paragraph with **bold** and *italic* text. {{< alert >}}
Check more at [Blowfish documentation](https://blowfish.page/) Ensure the voltage is correctly set, before connecting a load the first time!
undefined {{< /alert >}}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 98 KiB

View File

@ -3,13 +3,58 @@ title: "Sensors&Pumps"
date: 2025-01-27 date: 2025-01-27
draft: false draft: false
description: "a description" description: "a description"
tags: ["example", "tag"] tags: ["sensor"]
--- ---
an example to get you started # Sensors
# This is a heading The board can address up to 16 sensors, with an A und B sensor per plant.
## This is a subheading The A sensor is always used, the B sensor is optional and use is suggested for larger planters.
### This is a subsubheading
#### This is a subsubsubheading The sensor itself are just two spikes with a defined distance. They can be bought readymade or simply be done DIY with two long nails (use galvanized or non rusting ones)
This is a paragraph with **bold** and *italic* text.
Check more at [Blowfish documentation](https://blowfish.page/) The Sensor is switched via multiplexer chips to a 555 oscilator circuit that uses he the earths resistance for charging and discharging a small capacitor. The ESP simply counts how often the charge pulse was seen.
undefined While this sensor can be easily influenced since it runs in lower uA - mA range, due to the frequencys of several khz for normal moist plants, it is still very resistant, eg a 50hz failure signal from a nearbly power circuit would barely be registered.
Since the Sensor is changing polarity between charging and discharging, corrosion due to organic battery effects is minimized, also it prevents errors due having build a battery (You can easily charge a planter to several V if you do not change polarity).
# Pumps
The board contains 8 low side switched pump outputs. The pumps are running directly from the battery without further voltage conversion, so ensure that the can survive the full voltage range of the battery.
Each output can supply up to 3A continously.
The board will never switch more than one output concurrently, so there is no need to size the battery for higher maximum load.
An additinal extra out exists, that is switched, when any of the pump outputs is supposed to run.
This allows for multiple possible setups
## Layout Central Pump
One central pump is connected to the extra output, and multiple magnetic valves are used for the different plants
## Multi Gravity Feed Valves
Per plant a Valve that can close against pressure is used, no pump exists
## Multi Pump Setup
Multiple smaller cheaper pumps with no shared hoses, so that failures will only affect a single planter.
In any case I suggest to use a Water Filter on the Intake, as else you will get severe algae problems.
In my personal opinion small membrane pumps are a really good fit
* can be housed outside the tank
* require less maintance/cleaning
* are able to pump smaller impurities without issues.
* Can pull water 1-2meters
* Have higher output pressure -> Will blow out blockages in hoses
However
* are louder
* pump less volume per time and energy
{{< alert >}}
DO NOT DIRECTLY CONNECT TO WATER MAINS, YOU HAVE BEEN WARNED!
Software and Hardware may fail: It is your responsibility to ensure that a stuck valve or short circuit mosfet will not cause flooding and property destruction, for example by limiting the water tank to size that can drain.
{{< /alert >}}
# Todo
## Flow Sensor
There is a input for a flow sensor, currently it is not used as the software is missing.
* Allow monitoring if pumps are actually moving water
* Allow to set limits for how much ml are allowed additinally to the current time limit per watering run
Currently it cannot be set how two sensor should be interpreted and they are only averaged. More complex functions would be nice here, eg. allowing a user settable interpolation (0.8*a+0.2*b)/2 and Min(a,b) as well as max(a,b)

View File

@ -24,8 +24,7 @@ tags: ["esp32", "hardware"]
* Embedded Solar MPPT Charger * Embedded Solar MPPT Charger
* Can also be used with a power supply * Can also be used with a power supply
kicad links ## Made with:
<a href="https://www.kicad.org/">
link to current stl for case here <img class="lazy" src="kicad_logo_small.png" alt="Image">
</a>
image carrousel of diffferent builds here?

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.0 KiB

View File

@ -3,13 +3,26 @@ title: "Firmware Upload"
date: 2025-01-27 date: 2025-01-27
draft: false draft: false
description: "a description" description: "a description"
tags: ["example", "tag"] tags: ["firmeware", "upload"]
--- ---
an example to get you started # Prebuild
# This is a heading 1. Download image from
## This is a subheading 2. todo something espflash tool here
### This is a subsubheading
#### This is a subsubsubheading # From source
This is a paragraph with **bold** and *italic* text. ## Preconditions
Check more at [Blowfish documentation](https://blowfish.page/) * rustup with current version
undefined * espup with current version
* npm /npx
* Connect the board via usb to the computer
* Ensure the esp is running (eg not in deepsleep if prior version was installed)
# Compiling and uploading
1. Clone the gitea
2. go to the rust/src_webroot
3. npm -i
4. cd ..
5. cargo run
Depending on the setup of the cargo runner, either a OTA image is build or the firmware is directly flashed to the esp.
Note: If the bootloader is currently booting from ota_2, flashing ota_1 via usb will not make it switch. You might need to manually erase it in this case prior.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 98 KiB

After

Width:  |  Height:  |  Size: 247 KiB

View File

@ -3,13 +3,27 @@ title: "ConfigMode"
date: 2025-01-27 date: 2025-01-27
draft: false draft: false
description: "a description" description: "a description"
tags: ["example", "tag"] tags: ["config", "wifi"]
--- ---
an example to get you started # Initial
# This is a heading If the config file is missing, or invalid the Emergency Rescue mode is started
## This is a subheading In this case multiple Fault LEDS will be flashing and the esp will open an AccessPoint.
### This is a subsubheading Connect to the AccessPoint and browse to http://192.168.71.1 to set it up
#### This is a subsubsubheading
This is a paragraph with **bold** and *italic* text. # During normal operation
Check more at [Blowfish documentation](https://blowfish.page/) 1. Press the boot button untill the ESP shows that it is active.
undefined 2. The General fault LED will flash, keep pressing the button untill it stops
3. The ESP will now try to connect to a WIFI station if configured and start the webserver, if the connection to the station cannot be made, it will open an AccessPoint instead.
# MQTT
It is possible to use the topic /stay/alive to enter the config mode.
If this topic contains a retained message with the value true, the ESP will enter ConfigMode during it's next cycle and stay there.
Note: You must set /stay/alive to retained false again after this, otherwise it will always enter configmode, even if you exist it via the webui.
# USB reboot
By connecting to the USB Terminal via a Serial Monitor, the ESP is reset and will enter configmode as if the button for normal operation was pressed
# Reboot
When pressing reboot in configmode website, the esp will restart into the configmode newly saved settings. To exit configmode the exit button must be used.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 98 KiB

After

Width:  |  Height:  |  Size: 165 KiB

View File

@ -3,13 +3,25 @@ title: "MQTT"
date: 2025-01-27 date: 2025-01-27
draft: false draft: false
description: "a description" description: "a description"
tags: ["example", "tag"] tags: ["mqtt", "esp"]
--- ---
an example to get you started # MQTT
# This is a heading An Mqtt server can be configured and will be used to dump all kinds of statistical data.
## This is a subheading
### This is a subsubheading |Topic|Example|Description|
#### This is a subsubsubheading |/firmware/address|
This is a paragraph with **bold** and *italic* text.
Check more at [Blowfish documentation](https://blowfish.page/) | Topic | Example | Description |
undefined |----------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------------------------------------------|
| firmware/address | 192.168.1.2 | The Ip address in station mode |
| firmware/githash | feature/esp32c6@1ce4d74a | The branch and hash during build time |
| firmware/buildtime | 2025-01-21T20:56:18.168163570Z | Compile time |
| firmware/last_online | 2025-01-22T08:56:46.664+01:00 | Last time this board was online |
| firmware/ota_state | Partition state is ESP_OTA_IMG_VALID | The OTA state, relevant for rollback |
| firmware/partition_address | 0x10000 | The OTA partition used, 0x10000 is ota_1 |
| state | online | Current State, expected are online or sleep |
| battery | {<br/>"voltage_milli_volt":"12860",<br/>"current_milli_ampere":"-16",<br/>"cycle_count":"12",<br/>"design_milli_ampere":"6000",<br/>"remaining_milli_ampere":"806",<br/>"state_of_charge":"15",<br/>"state_of_health":"93",<br/>"temperature":"2957"<br/>} | Dump of battery data |
| water | {<br/>"enough_water":true,<br/>"warn_level":false,<br/>"left_ml":1337,<br/>"sensor_error":false,<br/>"raw":0,"water_frozen":<br/>"tank sensor error"<br/>} | Water Status dump |
| plant1 | {<br/>"a":"disabled",<br/>"a_raw":"0",<br/>"b":"disabled",<br/>"b_raw":"0",<br/>"mode":"OFF",<br/>"consecutive_pump_count":0,<br/>"dry":false,<br/>"active":false,<br/>"pump_error":false,<br/>"not_effective":false,<br/>"cooldown":false,<br/>"out_of_work_hour":false,<br/>"last_pump":"N/A",<br/>"next_pump":"N/A"<br/>} | Plant status dump |
| light | {<br/>"active":false,<br/>"out_of_work_hour":true,<br/>"battery_low":true,<br/>"is_day":false<br/>} | Light status dump |
| deepsleep | night 1h | Why and how long the ESP will sleep |

View File

@ -2,14 +2,13 @@
title: "Software" title: "Software"
date: 2025-01-24 date: 2025-01-24
draft: false draft: false
description: "a description" description: "Information about the Firmware"
tags: ["example", "tag"] tags: ["software"]
--- ---
an example to get you started * esp-idf-hal based rust project
# This is a heading * can be run standalon or with wifi
## This is a subheading * MQTT
### This is a subsubheading * SNTP to sync the RTC/Clock
#### This is a subsubsubheading * Abitrary file upload and download into SPIFS volume
This is a paragraph with **bold** and *italic* text. * Flash Battery Controller from file in Flash
Check more at [Blowfish documentation](https://blowfish.page/) * Flash Firmware via OTA directly from website
undefined

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.5 MiB

27
website/content/_index.md Normal file
View File

@ -0,0 +1,27 @@
---
title: "Software"
date: 2025-01-24
draft: false
description: "Information about the Firmware"
tags: ["software"]
---
Initial creation story here
<div align="left">
## Target group:
* DIY
* OpenSource
* Small scale (as in balcony/garden not agriculture)
* Automatic Watering for a limited amount of time via a water tank (I do not recommend pipe connection due to flooding risks)
* Use as is, or improve as you see fit
</div>
[Hardware]({{< relref "/hardware" >}})
[Software]({{< relref "/software" >}})
{{< article link="/hardware/" >}}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 98 KiB

View File

@ -1,15 +0,0 @@
---
title: "initial"
date: 2025-01-24
draft: false
description: "a description"
tags: ["example", "tag"]
---
an example to get you started
# This is a heading
## This is a subheading
### This is a subsubheading
#### This is a subsubsubheading
This is a paragraph with **bold** and *italic* text.
Check more at [Blowfish documentation](https://blowfish.page/)
undefined

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 157 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 733 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

BIN
website/static/favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

View File

@ -0,0 +1 @@
{"name":"","short_name":"","icons":[{"src":"/android-chrome-192x192.png","sizes":"192x192","type":"image/png"},{"src":"/android-chrome-512x512.png","sizes":"512x512","type":"image/png"}],"theme_color":"#ffffff","background_color":"#ffffff","display":"standalone"}