GithubHelp home page GithubHelp logo

runelite-watchdog's Introduction

Guard_dog_resize

Watchdog

Plugin Hub Discord

ko-fi

Create custom alerts triggered by

  • Game Messages (supports glob pattern or regex)
  • Player Chat Messages (supports glob pattern or regex)
  • Stat Drain/Change
  • Notifications (supports glob pattern or regex. allows you to hook into existing notifications, even if you have the alerts off in Runelite. For example low prayer, idle, tempoross, etc)
  • Inventory Changes
  • Object/Item/NPC Spawned
  • XP Drop

with any amount of unique notification types like

  • Game Message
  • Screen Flash
  • Custom Sound
  • In-Game Sound Effect
  • Text to Speech (Now supports using Eleven Labs)
  • Tray Notification
  • Overhead Text
  • Overlay
  • Dismiss Overlay
  • Request Focus
  • RuneLite Notification (to trigger things like RL Tray Notifications)

You can set defaults for the notifications in the plugin config

For more information on trigger and notification types, see the wiki.

Recommended RuneLite Notification Settings

image

Request Focus should be set to Off otherwise you will get some wrong behaviors with your background notifications.

Examples

Attack Drained Example Harvest Example

Alert Hub

Add alerts other users have shared directly from the panel! You can check out the alert hub branch to learn how to upload your own.

image

Capture Groups

Capture groups can make your alerts dynamic by changing the output depending on what triggered the alert.

Any trigger with a text input can use {} to create a capture group around the text inside it. You can then use the captured text in your alert output by writing $1. Multiple brackets can be read sequentially with $2, $3 etc. This is useful when using glob glob, since the text that was globbed can now be captured with {*}.

Say you have a Notification Fired Alert with the Message set to Your {*} is ready to harvest in {*}. You could then have a TTS notification set to Go get your $1 in $2! which would make it say something like Go get your Ranarr in Ardougne!.

Another useful output is as the file name for a sound notification. With the above example, we could set the alert to play $1.wav, which would actually play other files in the same folder such as ranarr.wav and torstol.wav. To set this up, you have to include and select a dummy file $1.wav in the folder with the files you wish to use, even though the file itself will not be played.

With regex enabled, you instead use parenthesis () to surround the text you wish to capture.

runelite-watchdog's People

Contributors

adamk33n3r avatar bram91 avatar cheesycracks avatar creativetechguy avatar jleavell avatar pajlada avatar

Stargazers

 avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

runelite-watchdog's Issues

[Bug] Unable to open any alerts from previous version.

With the new release, I am unable to open any notifications created in the previous version. Creating new notifications works fine, but clicking on notifications previously created just does nothing. The console window for the shadowJar produces the following error:

21:13:05.250 [AWT-EventQueue-0] ERROR net.runelite.client.RuneLite - Uncaught exception:
com.google.inject.ProvisionException: Unable to provision, see the following errors:

1) Error injecting method, java.lang.IllegalArgumentException: invalid range properties
  at com.adamk33n3r.runelite.watchdog.ui.panels.NotificationsPanel.rebuild(Unknown Source)
  while locating com.adamk33n3r.runelite.watchdog.ui.panels.NotificationsPanel

1 error
        at com.google.inject.internal.Errors.throwProvisionExceptionIfErrorsExist(Errors.java:486)
        at com.google.inject.internal.MembersInjectorImpl.injectMembers(MembersInjectorImpl.java:67)
        at com.google.inject.internal.InjectorImpl.injectMembers(InjectorImpl.java:987)
        at com.adamk33n3r.runelite.watchdog.ui.panels.AlertPanel.build(AlertPanel.java:253)
        at com.adamk33n3r.runelite.watchdog.WatchdogPanel.createPluginPanel(WatchdogPanel.java:237)
        at com.adamk33n3r.runelite.watchdog.WatchdogPanel.openAlert(WatchdogPanel.java:198)
        at com.adamk33n3r.runelite.watchdog.ui.AlertListItem.lambda$new$1(AlertListItem.java:31)
        at java.desktop/javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1967)
        at java.desktop/javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2308)
        at java.desktop/javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:405)
        at java.desktop/javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:262)
        at java.desktop/javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:279)
        at org.pushingpixels.substance.internal.utils.RolloverButtonListener.mouseReleased(RolloverButtonListener.java:126)
        at java.desktop/java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:297)
        at java.desktop/java.awt.Component.processMouseEvent(Component.java:6635)
        at java.desktop/javax.swing.JComponent.processMouseEvent(JComponent.java:3342)
        at java.desktop/java.awt.Component.processEvent(Component.java:6400)
        at java.desktop/java.awt.Container.processEvent(Container.java:2263)
        at java.desktop/java.awt.Component.dispatchEventImpl(Component.java:5011)
        at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2321)
        at java.desktop/java.awt.Component.dispatchEvent(Component.java:4843)
        at java.desktop/java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4918)
        at java.desktop/java.awt.LightweightDispatcher.processMouseEvent(Container.java:4547)
        at java.desktop/java.awt.LightweightDispatcher.dispatchEvent(Container.java:4488)
        at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2307)
        at java.desktop/java.awt.Window.dispatchEventImpl(Window.java:2772)
        at java.desktop/java.awt.Component.dispatchEvent(Component.java:4843)
        at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:772)
        at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
        at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:715)
        at java.base/java.security.AccessController.doPrivileged(Native Method)
        at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
        at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:95)
        at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:745)
        at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:743)
        at java.base/java.security.AccessController.doPrivileged(Native Method)
        at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
        at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:742)
        at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
        at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
        at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
        at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
        at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
        at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
Caused by: java.lang.IllegalArgumentException: invalid range properties
        at java.desktop/javax.swing.DefaultBoundedRangeModel.<init>(DefaultBoundedRangeModel.java:109)
        at java.desktop/javax.swing.JSlider.<init>(JSlider.java:278)
        at java.desktop/javax.swing.JSlider.<init>(JSlider.java:245)
        at com.adamk33n3r.runelite.watchdog.ui.notifications.VolumeSlider.<init>(VolumeSlider.java:10)
        at com.adamk33n3r.runelite.watchdog.ui.notifications.panels.SoundNotificationPanel.<init>(SoundNotificationPanel.java:28)
        at com.adamk33n3r.runelite.watchdog.ui.panels.NotificationsPanel.addPanel(NotificationsPanel.java:116)
        at com.adamk33n3r.runelite.watchdog.ui.panels.NotificationsPanel.rebuild(NotificationsPanel.java:94)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:566)
        at com.google.inject.internal.SingleMethodInjector$1.invoke(SingleMethodInjector.java:70)
        at com.google.inject.internal.SingleMethodInjector.inject(SingleMethodInjector.java:89)
        at com.google.inject.internal.MembersInjectorImpl.injectMembers(MembersInjectorImpl.java:132)
        at com.google.inject.internal.MembersInjectorImpl$1.call(MembersInjectorImpl.java:93)
        at com.google.inject.internal.MembersInjectorImpl$1.call(MembersInjectorImpl.java:80)
        at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1085)
        at com.google.inject.internal.MembersInjectorImpl.injectAndNotify(MembersInjectorImpl.java:80)
        at com.google.inject.internal.MembersInjectorImpl.injectMembers(MembersInjectorImpl.java:62)
        ... 42 common frames omitted

In-game loot drop chat message not recognized for chat alert.

Hello, I love your plugin and have found so much utility from it that it's become a must have for me.

I seem to be having an issue and hopefully it's not something that I just overlooked.
I'm trying to setup different sounds for different ranges of loot drop values (once I figure out how to use the glob patterns). But the chat alert doesn't seem to recognize the loot drop notification chat message that is sent when you have the loot threshold setup in the in-game Chat options.

Here is the message I'm talking about:
image

and here is how I have the chat alert setup:
image

Thank you again for your plugin!

[Community] Location to share/collaborate on alerts

Possibly enabling the Discussion tab of the repo could be a good place for users to share what they've made. I'm sure a lot of power users have made dozens of really fancy alerts which others may want to import or use as a reference or ideas. There are a lot of advanced use-cases for this plugin and it only is becoming more powerful with every update, so a place for the community to discuss with each other and share things would be awesome!

Improve Panel UI

The UI is a little busy and hard to distinguish different sections sometimes.

Currently, sections are separated by titled etched borders. This gives some distinction but with some monitors or low light, it's hard to see the lines. Screenshot here:

Screenshot_20221116_014927

We should explore options to make the UI less cluttered and easier to understand.

[2.5.0/2.7.0] Alerts not firing and history panel freezing the plugin.

Hello, trying out 2.7.0 (and previously 2.5.0) it seems I can't get any alerts to fire. The console window comes up with this (tried to see if it repeated at any point, but it doesn't seem to):

Had to paste it into a PasteBin, since it exceeded the character limit for GitHub.
https://pastebin.com/4b41TCxe

Trying to open up the History Panel after that error freezes the plugin. In an attempt to prevent what happened previously with it being something I screwed up, I cleared all previous alerts and started from a fresh set of alerts. Using the test alert button properly fires the alert. But actually triggering it with the idle notifier plugin throws the error.

The alert used in replicating this error is the following:
[{"type":"NotificationFiredAlert","message":"You have low hitpoints!","regexEnabled":false,"enabled":true,"name":"Low Hitpoints","debounceTime":0,"notifications":[{"type":"Overlay","color":"#46FF0000","sticky":false,"timeToLive":5,"message":"You have low hitpoints!","fireWhenFocused":true}]}]

Tried with different types of alerts (overhead, custom sounds, etc) and they all seem to throw the same error.

It might be worth noting that I merged all the other code from 2.5.0 except the history panel into a clone of 2.4.0 and everything else works properly. I'll be doing so for the added features of 2.7.0 some time tomorrow and will report back.

[Feature/Bug] Support profiles

The startUp method isn't called when you switch profiles (unless the plugin is off in the first profile), which causes the panel to not update with the new alerts which can then cause the alerts from the first profile to overwrite the alerts from the second profile.

[Feature] Add delay to alerts

Please increase the debounce time limit from 60 seconds to 120 seconds!

I'm doing GOTR and using an AFK method where I need a notification to ping me 10 seconds prior to the first altar opening. due to the only consistent chat message being 120 seconds prior to its opening, there is no way to set a notification 10 seconds prior to it opening. chat notification doesn't support delaying notifications, even with the runelite delay. my intent is to set the notification to ping on the game starting and delay that by 110 seconds so that I know 10 seconds before it opens.

I hope there aren't any downsides to this, thank you very much.

[Bug] Import (Append) erases all alerts and doesn't add alert being imported.

Hello, loving the new update! I've been having a blast customizing my alerts using regex. I really appreciate your work!

I've run into a problem while trying to import alerts. Clicking the Import (Append) button erases the entire notification list and doesn't actually add the notification it was supposed to.

I thought it might just be a visual bug, but restarting the Runelite client, the notification list is indeed empty.
I also thought that it might be just a certain notification types being imported that could be causing it, but it's consistent across all notification types

Steps to reproduce:

  1. Click Import on main panel
  2. Paste any exported notification ex: [{"type":"NotificationFiredAlert","message":"Crystal impling is in the area","regexEnabled":false,"enabled":true,"name":"Crystal Impling","debounceTime":0,"notifications":[{"type":"ScreenFlash","color":"#46FF0000","flashNotification":"SOLID_TWO_SECONDS","fireWhenFocused":false}]}]
  3. Click Import (Append)

It may be worth mentioning that Import (Overwrite) is working properly.

[Feature] item quantity options

Would love to have a > (greater than), < (less than), = (equal to), != (not equal to) <= (greater than or equal to), >= (less than or equal to) options for item quantity in inventory events rather than what we currently have which is just a specific amount maybe also

[Feature] Additional settings for Overlay notification

Hello, I've been playing around with the new release some using the shadow jar and I love the implementation of the Overlay notification type. It will pretty much replace the Notification Panel plugin for me in due time. I did have some requests for additional settings in the plugin settings for the notification type.

  • Default alignment: currently it is left-aligned which makes it look funky when the notifications aren't the same size. Could you allow this to be set to centered? Or maybe centered as default to make it look cleaner under default settings.
  • Font style: (Currently set as bold) Can we adjust this to Small or Regular?
  • Default color setting: (Currently set to red) Allowing a custom default color would be neat.
  • Time: Could there be an option to hide the time since the notification fired? It would make things a bit cleaner.

Thank you! I really appreciate your work!

[Feature] Duplicate

Would love to have a way to duplicate notifications so that it is quicker and easier to set up new notifications with similar notification modules. Maybe add a duplicate button like this?

Untitled-1fdsdfsdfds

Notification when focused

It appears notifications will not trigger if the client is focused, or at least TTS. This appears to be true regardless of enabling "send notifications when focused" enabled in #runelite. it also seems to only be affecting this notification plugin, not others like chat notifications, idle notifications, etc...

Current settings are
image
image

[Feature] Duration of sound settings

Similar to the Screen Flash duration (where you can set it to 0 to flash until cancelled, or a number of seconds to flash), it'd be great if the sound could have those same options. So either keep repeating the sound file until cancelled (same as the flash cancellation) or repeat the sound until a certain time has elapsed. (Not sure if it should cut off the sound immediately at time or let the sound complete and just stop repeating. I guess whichever is easier since the sounds should be super short anyway.)

User defined time for Screen Flash

A text/number input to allow the user to specify how long for the effect to last.
Maybe a second input to specify how fast the flash intervals are.

[Bug/Feature] Bad RegEx doesn't tell the user the error

I noticed when working on my own RuneLite plugin and running RuneLite with debug mode on that one of my regex patterns for this plugin was causing a parsing error. I had improperly escaped something so had an unclosed capture group. It was super easy to fix since I saw the error message, but that was only in the debug console of RuneLite which most players would never see.

Can these errors be surfaced to the player somehow so they know what the problem is? Maybe a chat notification or an alert box?

[Feature] Capture groups for Overlay notification

I've been playing with the latest update and it's looking amazing! I wanted to ask if you could add the capture groups feature to the Overlay notification. Thanks to your tests on the capture groups commit, I figured out how to get it working with regex enabled. (might I suggest adding that to the plugin description: {*} when regex is disabled, (.*) when regex is enabled, or similar.)

I did have another question, not regarding the plugin. But it's preferred to make separate issues for each feature request, right? Rather than make a single issue with multiple requests? Just feeling like I might be making too many and wanted to make sure.

Plugin Not Working?

Hey,

I wanted to make two simple alerts; low HP & low prayer with TTS. From the plugin settings (gear icon) I did tick the "Enable TTS" and allowed the 3rd party to use my IP in the pop-up.

I can't make this plugin work at all, I get no notifications/alarms at all. Should I toggle idle notifier off or smth?

What determines how low is low HP/prayer? There's no way to type in the values?

What does "Notification Fired Alert" mean? The only hint is "The message to trigger on. Supports glob (*)" <- and the hint message cuts off. what's glob?

If I want to make new low prayer alert, I:

  1. Press the + sign (Create New Alert)
  2. Select Stat Drain?

I mean... there is no way to get the same kind of alert as the pre-existing 'Low HP' example (there is option for the "Resource" in new ones), which isn't even working for me.

Custom sound glitch?

not sure if its a glitch but trying to set up a custom sound and it just plays the native alert sound it maybe just me not sure

sound

Sound Fired events without sound volume

Is there a way to have events on sound effects without playing any sound effects?

I know that when the sounds are muted, no events are fired. Would it be possible to have this plugin have an option to listen to, and then .consume() every sound played so it doesn't actually make a sound but can still be used to trigger alerts?

Notification queueing QOL

Currently any event that occur back to back (eg 2 drops over a threshold) and whilst using the capture groups, it will notify of both over top of each other. Debounce will make it so that only one will play (the first one), whereas the ideal behavior would be for them to be one following the other. Possible to add a toggle to make all events of a given notification enter a queue where they play out in order

[Feature Request] Support for Notification Panel plugin

In both the stable release and current 2.0 RC I can't seem to get tray notifications (the ones you can add from the plugin) to appear. I thought maybe it was because I had tray notifications disabled in the RuneLite settings, but even with that option enabled, they don't seem to appear.

I thought that it another possibility could be because I use the Notification Panel plugin, but I've tried disabling that as well. Can't think of anything else that might be interfering with them appearing.

Animation ID trigger

Currently the plugin let you set a notification based on sound IDs, could it be possible to set them too based on animation IDs? or even model IDs too.

Feature Request: Audio triggers

Hi! Thanks so much for making this plugin, it's extremely versatile and useful in so many scenarios.

Just one suggestion for improvement: Audio triggers

I would love to be able to create custom alerts based on sound effects/area sounds being played. There are often times I need to play with very low volume or even muted, which can be a bit frustrating during tasks where sound cues are quite important.

I believe the Runelite events relating to sounds are SoundEffectPlayed and AreaSoundEffectPlayed. If this is a feature you're interested in adding but don't have the time, I'm also happy to work on the feature myself and submit a PR here.

Watchdog doesn't seem to work for partial game messages

Hey there, I may be doing something wrong here, but it seems like Watchdog will not fire a TTS notification when a partial chat message is received.

I have the plugin enabled to send a game message when a Random Event spawns for example, and Chat Notifications is set to "Random event spawned", but the plugin will only fire a TTS notification if the entire message is entered like "Random event spawned: Bee keeper".

Being able to enter partial messages and get them to fire is a big part of the value of notifications for me, so that I can get complex notifications like "Ready to harvest" (any) or "Random event spawn (any)" or "XP Left to Level (Some Number)" to all trigger an individual notification.

Can this plugin be updated to support partial messages, maybe as a checkbox option? Thank you!

Feature Request: Delay between Notifications

Thanks again for this amazing plugin, being able to set individual notification behavior is something I've wanted in RuneLite for years. I actually scrolled right past this one several times not understanding from the Plugin Hub description that this was providing that functionality!

Right now, certain types of useful context-sensitive alerts my fight rapidly in succession if the same message appears repeatedly. For instance, if you set an Alert for "You need to empty your coin pouches" while spam clicking a guard, you'll hear a lot of alerts fire back-to-back. It might be nice to be able to set a global minimum delay between duplicate alerts being fired. I'd envision a "Minimum Delay for Repeat Alerts" field where I could set how many seconds I'd like to suppress further alerts from the same source until they are allowed to fire again for that source.

Thank you again for the great plugin!

[Feature] Alert Hub

Similar to the resource packs plugin, add a hub to add alerts from a panel.

Discussion needed on submission process.

[Feature] New trigger for various inventory states

Have a trigger for states in your inventory to help with afk skilling. Examples include:

-Empty inventory (POH altar runs)
-Full inventory (fishing/mining runs)
-a certain amount of a specific item (having 14 maple longbows for fletch stringing)
-a stack reaching a certain amount (max stack coin pouch for AFK knight of ard. thieving training)

Possible to create a version without the TTS part?

Hey! I'd like to use this plugin but I have no intention of using the TTS part and would not like my IP being sent to a 3rd party server. Is it possible to create a fork / another plugin on the plugin hub that doesn't involve the 3rd party server warning?

Inconsistent and unpredictable - Hard to debug

Love the plugin, but it feels inconsistent. Sometimes it'll trigger the notification and for a different message that is seemingly configured the same it won't. Sometimes it'll be delayed or certain variations of the messages won't work at all.

I suspect this has some part to do with #9 but more generally, it'd be really helpful if there was some way to test our message filters. Even something like a debug mode toggle which would highlight the messages in chat that it matched and the name of the rule that matched it. This way we could play around with different patterns and scroll through the chat/notification history and see if it is working as expected. This will be especially valuable if the outcome of #9 is to implement full regex support.

Although this is all really a bandaid for the real problem of the inconsistency and unpredictability. A few of the cases where it seems to behave differently (possibly - hard to test):

  • I cannot seem to setup Watchdog notifications for Guardians of the Rift "A portal to the huge guardian fragment mine *" but I can setup a notification for the message "A portal has spawned *" from the Guardians of the Rift Helper plugin.
  • The Guardians of the Rift message "The rift will become active in 5 seconds." isn't matched with a pattern of that exact string. Nor is it matched if I add a * after it. Similarly with The rift becomes active!.
  • Cannot match the vanilla notification of Valuable drop: with "*drop*"
  • Possibly deduped notifications (From RuneLite's Chat Filter plugin's Collapse Chat setting)

[Bug] Notification Fired Alert doesn't seem to be autosaving last edits.

I noticed this earlier today when I restarted my client. I had an Ancient shard drop and my custom notification sound didn't go off. The changes I made to my Notification Fired Alert didn't seem to save when I restarted my RuneLite. I am able to reproduce the bug doing the following:

  1. Launch RuneLite
  2. Import (Append) [{"type":"NotificationFiredAlert","message":".*Untradeable drop:.*(\\bCrystal shard|\\bAncient shard|\\bLong bone|\\bCurved bone|\\b)","regexEnabled":true,"enabled":true,"name":"Untradeable Drop","debounceTime":0,"notifications":[{"type":"ScreenFlash","color":"#4687FF00","flashNotification":"FLASH_TWO_SECONDS","fireWhenFocused":true}]}]
  3. Edit the trigger message (ex. remove the last |\b)
  4. Return the plugin main panel (attempting to force changes to be saved)
  5. Exit RuneLite

Upon restarting RuneLite the trigger message will still have the |\b that was removed.
In my case, I also had a custom sound play and the volume wasn't being saved either.
This is reproduce-able on both my clients.

Forgot to note that it does not seem to be affecting other notification types from my brief testing.

Trigger sound ID alerts without sound being turned on

Fantastic way to produce notifications with a sound ID, however I would still like the notifications to be produced whilst the audio settings are muted. I could just keep the sound effects at 1% so they continue working but I like to complain

Allow alert grouping

Include group options like group alert debounce, grouped infobox alert, and group import/export as examples. Grouping would be convenient not only for toggling contextual alerts off and on, but also for certain situations where alerts could frequently overlap.
Examples could include having a set of combat related alerts sharing an infobox, or multiple triggers for a single alert type. (eg sound of a trap springing or notification of trap item on ground sharing a debounce timer)
This would add another layer of flexibility to the plugin and already adds a lot more "logic" the user can utilize to craft more explicit and powerful alerts.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.