Git Product home page Git Product logo

sdk's Introduction

Get it on Google Play

About

Nevolution is an open platform for Android to evolve the notification experience of existing apps, in a creative developer-independent way via community-driven plug-ins, without the direct involvement of the original app developer.

Background

Android supports a highly rich notification experience, and the feature set has expanded in almost every major Android version. Unfortunately, most apps in the wild only use a small set of the capabilities in their notifications, rendering them less elegant, functionality lacking and even ugly on your modern Android devices.

If you use an Google Wear OS smart watch or Android Auto powered car, it's extremely disappointing that many of your favorite apps do not provide friendly integration with them.

The Nevolution community is proactively changing the philosophy behind notifications and aims to set an example of great user experience.

Developer Community

Nevolution is currently in beta stage and open to public. Since the end-user experience largely depends on the richness of 3rd-party plug-ins, we sincerely welcome developers to join our developer community, to build various generic or app-specific plug-ins and a more powerful Nevolution platform together.

Developing a simple plug-in for Nevolution with our developer-friendly SDK is even easier than writing a tiny app. With a creative idea in your mind, just one or two hours of coding is enough to build a working plug-in. The code of sample plug-ins already shows how easy writing a plug-in could be.

We are devoted to working with the developer community to build high quality plug-ins and improve Nevolution. So developers are the most important roles to build a healthy community.

Discussion goes to the Telegram Group (for developers), while issues and formal feature request should be posted on the GitHub for better tracking.

Developers are suggested to join the BETA CHANNEL for the fast iteration on new features and APIs.

How Does Nevolution Work

Nevolution consists of one platform app and many third party plug-in apps. A plug-in is not necessarily just a single-purpose app, it can bundle several plug-ins, or be part of a regular app.

Currently the only supported plug-in type is "decorator", which receives notification and makes necessary tweaks on the fly. All decorators enabled by user work together in a pipeline to decorate any incoming notification.

A decorator plug-in is essentially a regular exported Android service component declared with an intent-filter recognized by Nevolution platform.

Nevolution does not require root, but root-capable features are being considered.

Get Started

Clone any of the sample decorator repos to start developing new plug-in for Nevolution, or fork this repo to contribute to the SDK. And yes, the official plug-ins hosted in this organization are also open for contributions.

Build and install your plug-in app on the device, Nevolution will recognize it and let you activate it for the selected app right away.

Head to wiki page for more details: Decorator Plug-in Development

sdk's People

Contributors

liaohuqiu avatar oasisfeng avatar richard1122 avatar tom-sherman avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

sdk's Issues

微信新消息没有声音和震动

微信来新消息时没有声音和震动
小米6
Android 8.0
MIUI 10.0.1.0 | 稳定版
微信版本:play版7.0.0
Nevo 3.0.2
工作模式:insider
未开启高级模式(执行命令报错)
未安装Extension Pack

其它信息:
微信和Nevo,Nevo-Wechat的通知都打开了。
看酷安说很多人升级到微信7.0后都出现了没有声音的情况,具体情况未知(荣耀v10,华为Mate 20 Pro,三星Galaxy S9+,一加3T)
未使用此软件时微信只有震动没有声音,已知另一位小米6用户也有此问题。
微信更新到7.0后,声音与震动的设置发生了变化(如图)
另一部手机红米Note 4x,Android 7.0,miui10,微信play7.0,微信的声音和震动设置未发生变化,Nevo有声音和震动。
screenshot_2019-01-23-09-27-46-239_com tencent mm

Unable to bind decorator service

开坑写Nevo模块的时候,在Nevo设置该模块Logcat就会捕捉到这个错误。

Unable to bind decorator service: Intent { act=com.oasisfeng.nevo.Decorator cmp=com.retrox.aodmod/.StackDecorator }

之后applyonNotification Removed回调也会报出Decorator Not Ready的错误。自定义模块也无法生效。

这是我的测试代码

package com.retrox.aodmod.nevo

import android.app.Notification
import android.util.Log
import com.oasisfeng.nevo.sdk.MutableStatusBarNotification
import com.oasisfeng.nevo.sdk.NevoDecoratorService

class EnhancedBigTextDeco : NevoDecoratorService() {
    val TAG2 = "EnhancedBigTextDeco"

    override fun apply(evolving: MutableStatusBarNotification) {
        Log.d(TAG2, "apply key -> ${evolving.key}")
    }

    override fun onNotificationRemoved(key: String?, reason: Int) {
        super.onNotificationRemoved(key, reason)
        Log.d(TAG2, "removed -> ${key}")


    }
}
        <service
                android:name=".nevo.EnhancedBigTextDeco"
                android:description="@string/app_name"
                android:label="@string/app_name"
                android:permission="com.oasisfeng.nevo.permission.BIND_DECORATOR_SERVICE"
                android:directBootAware="true"
                android:process="com.oasisfeng.nevo.decorators">
            <intent-filter android:priority="6">
                <action android:name="com.oasisfeng.nevo.Decorator" />
            </intent-filter>

        </service>

miui下通知统计不对

使用女娲石后,微信通知从女娲石发出,但在miui 11通知统计中,微信和女娲石的通知数量统计都不对,外源模式

setSmallIcon()没有生效

试图做个Decorator来搞定MIUI中难看的彩色小图标,不过setSmallIcon()似乎不生效(改color、title和largeIcon都生效了……)。

    @Override
    protected void apply(MutableStatusBarNotification evolving) {
        final MutableNotification n = evolving.getNotification();
        Log.d(TAG, "begin modifying");
        Icon icon = Icon.createWithResource(this, R.drawable.ic_stat_name);
        n.extras.putParcelable("nevo.icon", icon);
        n.extras.putParcelable("android.icon", icon);
        n.setSmallIcon(icon);
        n.setLargeIcon(icon);
        n.color = Color.RED;
        n.extras.putCharSequence(Notification.EXTRA_TITLE, "title replaced");
        Log.d(TAG, "end modifying");
    }

这是为啥呢

Whatsapp notification sounds and notifications on status bar

  1. When whatsapp tweaks are enabled, the notification sound does not ring;
  2. One needs to actually tap on notifications on status bar/pull down in order for notifications to "disappear", meaning, when you go directly to the app to view your new reply or update, the notifications stay persistent on the status bar.

安卓11上内源模式没有正常启用

一加氢os11,微信7.0.21,内源无法正常启用。设置页面是正常启用了。但是实际上通知栏还是会有女娲石的前缀。
希望可以得到冯大的修复

系统界面已停止运行

任何时候只要打开过 Nevolution,之后每次试图进入最近任务界面时都会提示“系统界面已停止运行”,然后系统回到锁屏界面,此时系统其他功能正常,Nevolution 也正常运行。重启后一切正常,且 Nevolution 进程也正常运行,但点击 Nevolution icon 打开设置后会再次出现上面的情况,除非重启,否则无法恢复正常。

使用 Nevolution 3.0.2,LOS 15.1(8.1),Mi 5。

部分错误日志:

--------- beginning of crash
01-13 15:11:59.334  1631  1631 E AndroidRuntime: FATAL EXCEPTION: main
01-13 15:11:59.334  1631  1631 E AndroidRuntime: Process: com.android.systemui, PID: 1631
01-13 15:11:59.334  1631  1631 E AndroidRuntime: java.lang.NullPointerException: Attempt to invoke virtual method 'void com.android.server.wm.TaskWindowContainerController.getBounds(android.graphics.Rect)' on a null object reference
01-13 15:11:59.334  1631  1631 E AndroidRuntime: 	at android.os.Parcel.readException(Parcel.java:2019)
01-13 15:11:59.334  1631  1631 E AndroidRuntime: 	at android.os.Parcel.readException(Parcel.java:1959)
01-13 15:11:59.334  1631  1631 E AndroidRuntime: 	at android.app.IActivityManager$Stub$Proxy.getAllStackInfos(IActivityManager.java:7773)
01-13 15:11:59.334  1631  1631 E AndroidRuntime: 	at com.android.systemui.recents.misc.SystemServicesProxy.isRecentsActivityVisible(SystemServicesProxy.java:520)
01-13 15:11:59.334  1631  1631 E AndroidRuntime: 	at com.android.systemui.recents.RecentsImpl.lambda$-com_android_systemui_recents_RecentsImpl_22230(RecentsImpl.java:477)
01-13 15:11:59.334  1631  1631 E AndroidRuntime: 	at com.android.systemui.recents.-$Lambda$pgmD0Bxm8kFYR7cdcGYk6DUhgds.$m$0(Unknown Source:8)
01-13 15:11:59.334  1631  1631 E AndroidRuntime: 	at com.android.systemui.recents.-$Lambda$pgmD0Bxm8kFYR7cdcGYk6DUhgds.run(Unknown Source:0)
01-13 15:11:59.334  1631  1631 E AndroidRuntime: 	at android.os.Handler.handleCallback(Handler.java:790)
01-13 15:11:59.334  1631  1631 E AndroidRuntime: 	at android.os.Handler.dispatchMessage(Handler.java:99)
01-13 15:11:59.334  1631  1631 E AndroidRuntime: 	at android.os.Looper.loop(Looper.java:164)
01-13 15:11:59.334  1631  1631 E AndroidRuntime: 	at android.app.ActivityThread.main(ActivityThread.java:6494)
01-13 15:11:59.334  1631  1631 E AndroidRuntime: 	at java.lang.reflect.Method.invoke(Native Method)
01-13 15:11:59.334  1631  1631 E AndroidRuntime: 	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:440)
01-13 15:11:59.334  1631  1631 E AndroidRuntime: 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
...
01-13 15:12:44.746  2730  2958 E CrashlyticsCore: Error occurred sending report bq@87ba7c1
01-13 15:12:44.746  2730  2958 E CrashlyticsCore: aie$c: java.io.FileNotFoundException: /data/user/0/com.oasisfeng.nevo/files/.Fabric/com.crashlytics.sdk.android.crashlytics-core/invalidClsFiles/5C3AE3AF00CA-0001-09A6-D32A1AF1313CSessionEvent0000000000.cls_temp (No such file or directory)
01-13 15:12:44.746  2730  2958 E CrashlyticsCore: 	at aie.a(SourceFile:2619)
01-13 15:12:44.746  2730  2958 E CrashlyticsCore: 	at bm.a(SourceFile:102)
01-13 15:12:44.746  2730  2958 E CrashlyticsCore: 	at bm.a(SourceFile:61)
01-13 15:12:44.746  2730  2958 E CrashlyticsCore: 	at ay.a(SourceFile:18)
01-13 15:12:44.746  2730  2958 E CrashlyticsCore: 	at cg.a(SourceFile:104)
01-13 15:12:44.746  2730  2958 E CrashlyticsCore: 	at cg$e.b(SourceFile:242)
01-13 15:12:44.746  2730  2958 E CrashlyticsCore: 	at cg$e.a(SourceFile:185)
01-13 15:12:44.746  2730  2958 E CrashlyticsCore: 	at agm.run(SourceFile:30)
01-13 15:12:44.746  2730  2958 E CrashlyticsCore: 	at java.lang.Thread.run(Thread.java:764)
01-13 15:12:44.746  2730  2958 E CrashlyticsCore: Caused by: java.io.FileNotFoundException: /data/user/0/com.oasisfeng.nevo/files/.Fabric/com.crashlytics.sdk.android.crashlytics-core/invalidClsFiles/5C3AE3AF00CA-0001-09A6-D32A1AF1313CSessionEvent0000000000.cls_temp (No such file or directory)
01-13 15:12:44.746  2730  2958 E CrashlyticsCore: 	at java.io.FileInputStream.open0(Native Method)
01-13 15:12:44.746  2730  2958 E CrashlyticsCore: 	at java.io.FileInputStream.open(FileInputStream.java:200)
01-13 15:12:44.746  2730  2958 E CrashlyticsCore: 	at java.io.FileInputStream.<init>(FileInputStream.java:150)
01-13 15:12:44.746  2730  2958 E CrashlyticsCore: 	at aie.a(SourceFile:2616)
01-13 15:12:44.746  2730  2958 E CrashlyticsCore: 	... 8 more

日志较长,不确定是否找到了关键日志,见谅

No whatsapp notifications on Samsung Gear S2

Though the gear s2 is connected to my Galaxy Note 4, whatsapp notifications don't get sent through to the watch. Uninstalling Nevolution will make then work again.

Smses and phonecalls still manage to send their notifications through to the Gear S2.

If I putCharSequence to change a notification which has the heads up effect, the notification will lost its heads up effect.

@Override public void apply(final StatusBarNotificationEvo evolving)
        throws RemoteException {
    final INotification notification = evolving.notification();
    final IBundle extras = notification.extras();
    extras.putCharSequence(NotificationCompat.EXTRA_TITLE, "new title");
}

Even if I add the following code, it still does not take effect.

notification.setPriority(NotificationCompat.PRIORITY_HIGH);
extras.putInt(EXTRA_AS_HEADS_UP, HEADS_UP_ALWAYS /* = 2 */);
if (Build.VERSION.SDK_INT >= 21) notification.setVibrate(new long[0]);

onNotificationRemoved() not fired when bubble visible

On the latest dev version, when a bubble is showing, onNotificationRemoved() will not fire until the bubble is removed. Not sure whether this is a bug or not. I tested this with the wechat decorator specifically.

Sound Modification Possible?

I found Nevolution as I was searching for an app to override notification sounds per app. The few that I tested were doing some funky "dialing home" though I couldn't tell what the data was exactly. I'd rather not run a firewall to block net access just for those apps, so they got the boot.

On to Nevolution - it seems like a wonderful platform for doing exactly what I was after. And I'm curious if this platform would allow for that. I'm willing to do the development to bring the feature to the app via a plugin, but is it even possible?

reset setprop

hi how i can reset setprop that needed to activate synchronous removal?

关于更新

我有个问题想请教下oasisfeng大大,女娲石和绿色守护还会短期内是否还会进行更新?
如果不进行更新了,是否考虑过开源让其他人继续进行维护?

WhatsApp plugin?

When DND is enabled the WhatsApp notifications still come through. Is it possible to add something that makes WhatsApp respect DND ?

Nevo6.5.1 空白微信通知

Nevo6.5.1 Android13 Pixel7Pro 五月更新
微信8.0.30(应该是gplay版本)
会出现空白的一条通知 未知触发原因 未知复现方式 出现频率较高

Notification sound/vibration loss and no automatic removal.

Nexus 6P, Android 6.0.1
WeChat 6.3.15, Nevolution 1.0 beta 3 with Extension Pack

Turn on WeChat Tweaks, with all other tweaks turned off for WeChat.
Then I met two issues:

  1. No sound / vibration for new messages though I have not turned them off. The notification for new messages (message content, instead of conversation prompt) hits me correctly.
  2. When I receive messages from contact A, I launch WeChat, enter the conversation with A, then the notification for A doesn't disappear - I need to manually swipe to clear.

NevoDecoratorService. getArchivedNotifications(final String key, final int limit)的实现不够完善

在改进微信撤回通知的过程中,我发现消息撤回后getArchivedNotifications的结果与预期不一致。


1. 发送1
2. 发送2
3. 发送3
4. 发送4
5. 发送5
6. 发送6
7. 撤回2
8. 撤回5

那么getArchivedNotifications的结果应该是操作日志式(1、2、3、4、5、6、撤回2、撤回5)的或者操作结果式的(1、3、4、6)。
但是现在的情况是返回值更接近于操作日志式的,但是存在两个问题:

  1. 撤回的消息中没有与之前消息的对应关系,也就是最终只知道发送了123456然后撤回了两条,但是哪两条不知道;
  2. 有的时候返回结果会不包括在一些没有被撤回的消息,这是通过与android auto消息对比得出的结果;

以下附上日志

06-06 00:24:50.272 24145 24164 D Nevo.Decorator[WeChat]: archive 11
06-06 00:24:50.272 24145 24164 D Nevo.Decorator[WeChat]: [X]: 0, [X]: 0, 1559751734358
06-06 00:24:50.272 24145 24164 D Nevo.Decorator[WeChat]: [X]: 1, [2条][X]: 1, 1559751745028
06-06 00:24:50.272 24145 24164 D Nevo.Decorator[WeChat]: [X]: 2, [3条][X]: 2, 1559751746614
06-06 00:24:50.272 24145 24164 D Nevo.Decorator[WeChat]: [X]: 3, [4条][X]: 3, 1559751748067
06-06 00:24:50.272 24145 24164 D Nevo.Decorator[WeChat]: [X]: 4, [5条][X]: 4, 1559751749290
06-06 00:24:50.272 24145 24164 D Nevo.Decorator[WeChat]: [X]: 5, [6条][X]: 5, 1559751750722
06-06 00:24:50.272 24145 24164 D Nevo.Decorator[WeChat]: [X]: 6, [7条][X]: 6, 1559751751851
06-06 00:24:50.272 24145 24164 D Nevo.Decorator[WeChat]: null, [6条]"❌" 撤回了一条消息, 1559751756958
06-06 00:24:50.272 24145 24164 D Nevo.Decorator[WeChat]: null, [5条]"❌" 撤回了一条消息, 1559751806277
06-06 00:24:50.272 24145 24164 D Nevo.Decorator[WeChat]: [X]: 8, [7条][X]: 8, 1559751875553
06-06 00:24:50.272 24145 24164 D Nevo.Decorator[WeChat]: [X]: 9, [8条][X]: 9, 1559751890243
06-06 00:24:50.273 24145 24164 D Nevo.Decorator[WeChat]: messages 8
06-06 00:24:50.273 24145 24164 D Nevo.Decorator[WeChat]: message.text 0
06-06 00:24:50.273 24145 24164 D Nevo.Decorator[WeChat]: message.text 1
06-06 00:24:50.273 24145 24164 D Nevo.Decorator[WeChat]: message.text 2
06-06 00:24:50.273 24145 24164 D Nevo.Decorator[WeChat]: message.text 4
06-06 00:24:50.273 24145 24164 D Nevo.Decorator[WeChat]: message.text 6
06-06 00:24:50.273 24145 24164 D Nevo.Decorator[WeChat]: message.text 7
06-06 00:24:50.273 24145 24164 D Nevo.Decorator[WeChat]: message.text 8
06-06 00:24:50.274 24145 24164 D Nevo.Decorator[WeChat]: message.text 9

其中7就是神秘失踪的消息

AndroidManifest.xml中的service::meta-data[name=package]应该怎么用

我试着抄了一下decorator-wechat的
<meta-data android:name="packages" android:value="com.xiaomi.xmsf" />
这样在女娲石新增配方的时候很方便,直接可以给小米服务框架加修饰器。
但是这样的效果是只有小米服务框架可以用这个修饰器,其他包用不了了。
有没有办法可以既方便新增,又可以让别的包用这个修饰器呢

NewApi: Calling new methods on older versions

NewApi: Calling new methods on older versions
../../src/main/java/com/oasisfeng/nevo/decorators/bundle/BundleDecorator.java:80: Call requires API level 20 (current min is 18): android.service.notification.StatusBarNotification#getKey
  77            final String bundle = existent.getTag().substring(TAG_PREFIX.length());
  78            final List<String> keys = existent.notification().extras().getStringArrayList(EXTRA_KEYS);
  79            if (keys == null) {
  80                Log.w(TAG, "Bundle notification without bundled keys: " + existent.getKey());
  81                continue;
  82            }
../../src/main/java/com/oasisfeng/nevo/decorators/bundle/BundleDecorator.java:102: Call requires API level 20 (current min is 18): android.service.notification.StatusBarNotification#getKey
  99    }
 100 
 101    private void bundle(final StatusBarNotificationEvo evolving, final String bundle) {
 102        Log.i(TAG, "Bundle " + evolving.getKey() + " into " + bundle);
 103        try {
 104            mBundles.setNotificationBundle(evolving.getKey(), bundle);
../../src/main/java/com/oasisfeng/nevo/decorators/bundle/BundleDecorator.java:104: Call requires API level 20 (current min is 18): android.service.notification.StatusBarNotification#getKey
 101    private void bundle(final StatusBarNotificationEvo evolving, final String bundle) {
 102        Log.i(TAG, "Bundle " + evolving.getKey() + " into " + bundle);
 103        try {
 104            mBundles.setNotificationBundle(evolving.getKey(), bundle);
 105            if (! showBundleNotificationIfNeeded(bundle)) return;
 106 
../../src/main/java/com/oasisfeng/nevo/decorators/bundle/BundleDecorator.java:129: Call requires API level 20 (current min is 18): android.service.notification.StatusBarNotification#getKey
 126        mNotificationManager.notify(TAG_PREFIX + bundle, 0, notification);
 127 
 128        for (final StatusBarNotificationEvo sbn : sbns)
 129            cancelNotification(sbn.getKey());
 130        return true;
 131    }
../../src/main/java/com/oasisfeng/nevo/decorators/bundle/BundleDecorator.java:141: Call requires API level 20 (current min is 18): android.service.notification.StatusBarNotification#getKey
 138            final long when = sbn.notification().getWhen();
 139            if (when > latest_when) latest_when = when;
 140            bundled_pkgs.add(sbn.getPackageName());
 141            bundled_keys.add(sbn.getKey());
 142        }
 143 

What is this permission request?

Hi,

With the latest Nevolution release in the Beta channel, there is this new permission request that does not make sense.

"Permission required to read notification channels (Click to pick any device to grant permission)"

However, once the said notification was tapped, what it displays are WiFi hotspots the phone can detect, not devices.

Secondly, the WiFi setting is off so I don't understand how the new Nevolution can detect the WiFi around me.

Third, if the app is opening the WiFi setting, it is not getting reflected anywhere nor were there permission requests to turn-on the WiFi.

Lastly, what "devices" was it supposed to display? Was it supposed to detect bluetooth devices?

Thank you for the clarifications.

Great update.

Updated release

Hi there,

Is there any chance to release some up-to-date apk for the non-native android devs?

At least Android Oreo compatible, maybe?

Best

最新的6.5版本闪退

Play Store最新的6.5版本经过ABD授权以后,应用就闪退诶。原来6.2版本使用正常。
微信版本是8.0.35,Android 13,三星**ROM,SM-S9180

MIUI每次重启都没法启动nevo,必须卸载重装

最近特意抓了一遍logcat,似乎是这里

01-18 17:05:04.732  2535  2799 E adTracker: Value Nevo.NUI of type java.lang.String cannot be converted to JSONObject
01-18 17:05:04.733  2535  2799 E adTracker: Value Nevo.NUI|AppBgSettings of type java.lang.String cannot be converted to JSONObject

Make multiple plug-ins visible

By adding some sort of info or arrows that encourages the user to scroll left/right on the card to switch between them.

I, for one, thought there was only 1 plug-in (whatever random one I got when opening the app).

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.