| docs/images | ||
| notifiers | ||
| static | ||
| templates | ||
| .air.toml | ||
| .drone.yaml | ||
| .gitignore | ||
| forms.go | ||
| go.mod | ||
| go.sum | ||
| LICENSE | ||
| main.go | ||
| models.go | ||
| README.md | ||
| scraping.go | ||
| scraping_test.go | ||
| todo.md | ||
| util.go | ||
Go Watch
A change detection server that can notify through various services written in Go
Intro
GoWatch works through filters, a filter performs operations on the input it recieves.
Here is an example of a 'Watch' that calculates the lowest and average price of 4090s on NewEgg and notifies the user if the lowest price changed:

Note that everything, including scheduling/storing/notifying, is a filter.
Schedule is a cron filter with a '@every 15m' value, so this will run every 15 minutes.
NewEgg Fetch is a Get URL filter with a 'https://www.newegg.com/p/pl?N=100007709&d=4090&isdeptsrh=1&PageSize=96' value, it's output will be the HTTP response.
Select Price is a CSS filter with the value '.item-container .item-action strong[class!="item-buying-choices-price"]' value, it's output will be the html elements containing the prices.
An XPath filter could also have been used.
Sanitize is a Replace filter, using a regular expression ('[^0-9]') it removes anything that's not a number.
Avg is an Average filter, it calculates the average value of its inputs.
Min is a Minimum filter, it calculates the minimum value of its inputs.
Store Avg and Store Min are Store filters, they store its input values in the database.
Diff is a Different Then Last filter, only passing on the inputs that are different then the last value stored in the database.
Notify is a Notify filter, if there are any inputs to this filter, it will execute a template and send the result to a user defined 'notifier' (Telegram/Discord/Matrix/etc).
Filters
Cron
Get URL
CSS
XPath
Replace
Store
Notify
Math
Average
Minimum
Condition
Different Then Last
type script compilation
tsc static/*.ts --lib es2020,dom --watch --downlevelIteration
Dependencies
The following libaries are used in Go-Watch:
- Gin for HTTP server
- multitemplate for template inheritance
- Cascadia for CSS selectors
- htmlquery for XPath selectors
- validator for user user input validation
- tgbotapi for Telegram
- cron for job scheduling
- viper for config management
- gjson for JSON selectors
- gopher-lua for Lua scripting
- gopher-lua-libs for expanding the Lua scripting functionality
- net for http fetching
- gorm for database abstraction
- bootstrap