Giter Club home page Giter Club logo

diamond's Introduction

Diamond

DONATE OS LOC Dub version License

Diamond is a powerful full-stack web-framework written in the D Programming Language.

Diamond can be used to write powerful websites, webapis or as stand-alone as a template parser.

Website: https://diamondmvc.org/

Key-Features

Key features of Diamond

Goals

  • To provide a powerful consistent API
    • The API of Diamond should be rich of features, but still with powerful performance and the style should be consistent all over.
  • High performance without complexity
    • The performance of Diamond should be high without making the API complex to use.
  • Compile-time template parsing
    • Templates are parsed at compile-time and thus produce very little run-time overhead.
  • Easy-to-use and feature-rich template syntax
    • The syntax of templates should be feature-rich, with an easy-to-use syntax.
    • It should be easy to create advanced templates without complex looking code.
  • Secure & less error-prone API
    • The API of Diamond should provide security to battle error-prone code, enabling code to be written "bug-free".
  • Enterprise development
  • Diamond should be stable enough and have enough features to be used in enterprise and commercial work.
  • Always free & open-source
    • Diamond should always remain free and open-source, no matter the framework's size or popularity.
  • As little dependencies as possible
    • The less dependencies Diamond has, the better.
    • library dependencies for database drivers etc. are okay
  • Cross-platform
    • Should always be able to support all platforms that vibe.d/DMD supports.
  • Natural development feeling
    • Using Diamond should feel natural without annoyance, so you can focus more on developing your application, rather than setting up Diamond.

Dependencies

Package Version Description
vibe.d 0.8.3 Used as the backend for Diamond's web applications. From 3.0.0 vibe.d will be an optional dependency.
DMD/Phobos 2.072.2 - 2.077.0 The standard library of D and thus a required dependency.
Mysql-native 2.2.1 A native wrapper for Mysql. It's a dependency, because of the MySql ORM.
ddbc X.X.X A database wrapper in D to a lot of database systems. Diamond will be using it for PostgreSQL, Sqlite and MSSQL.

Example (2.X.X)

View

Layout:

@<doctype>
<html>
<head>
  <title>Website - @<title></title>
</head>
<body>
  @<view>
</body>
</html>

View:

@[
  layout:
    layout
---
  route:
    home
---
  model:
    Home
---
  controller:
    HomeController
---
  placeholders:
    [
      "title": "Home"
    ]
]

<p>Hello @=model.name;!</p>

Controller

module controllers.homecontroller;

import diamond.controllers;

final class HomeController(TView) : Controller!TView
{
  this(TView view)
  {
    super(view);
  }
  
  /// / || /home
  @HttpDefault Status defaultAction()
  {
    view.model = new Home("World!");
    
    return Status.success;
  }
  
  /// /home/setname/{name}
  @HttpAction(HttpPost) Status setName()
  {
    auto name = this.getByIndex!string(0);
    view.model = new Home(name);
    
    return Status.success;
  }
}

Model

module models.home;

final class Home
{
  private:
  string _name;
  
  public:
  final:
  this(string name)
  {
    _name = name;
  }
  
  @property
  {
    string name() { return _name; }
  }
}

Example (3.X.X)

View

Layout:

@(doctype)
<html>
<head>
  <title>Website - @(title)</title>
</head>
<body>
  @(view)
</body>
</html>

View:

@[
  layout:
    layout
---
  route:
    home
---
  model:
    Home
---
  controller:
    HomeController
---
  placeholders:
    [
      "title": "Home"
    ]
]

<p>Hello @=model.name;!</p>

Controller (View)

module controllers.homecontroller;

import diamond.controllers;

final class HomeController(TView) : WebController!TView
{
  this(TView view)
  {
    super(view);
  }
  
  /// / || /home
  @HttpDefault Status defaultAction()
  {
    view.model = new Home("World!");
    
    return Status.success;
  }
  
  /// /home/setname/{name}
  @HttpAction(HttpPost) Status setName(string name)
  {
    view.model = new Home(name);
    
    return Status.success;
  }
}

Controller (Api)

module controllers.usercontroller;

import diamond.controllers;

final class UserController : ApiController
{
  this(HttpClient client)
  {
    super(client);
  }
  
  /// /user/update
  @HttpAction(HttpPost) Status update(UserModel user)
  {
    // Do stuff ...
    
    return Status.success;
  }
}

Model

module models.home;

final class Home
{
  private:
  string _name;
  
  public:
  final:
  this(string name)
  {
    _name = name;
  }
  
  @property
  {
    string name() { return _name; }
  }
}

...

module models.user;

final class User
{
  public:
  string name;
  int age;
}

FAQ

See: https://diamondmvc.org/faq

Are there any syntax guide-lines?

See: https://diamondmvc.org/docs/views/#syntax

Installing (Web)

See: https://diamondmvc.org/download

Installing (Standalone)

Not supported since 3.0.0

Contributing

See: https://diamondmvc.org/contribute

Version & Branch Support

Diamond only supports up to the 3 latest minor versions of itself, including pre-release versions.

If a version is not supported its working branch is deleted.

Anything below 2.10.0 is no longer supported, because earlier versions are not adviced to use unless necessary.

2.10.0+ is generally backward compatible, but 3.0.0 is not.

Currently supported versions: 2.10.0 - 3.0.0

No longer supported (Only available in release.): < 2.10.0

Note: 3.0.0 is not yet supported, but the master branch is 3.0.0

diamond's People

Contributors

bausshf avatar paralax 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

diamond's Issues

Update MySql Usage

The code used for the MySql engine is from mysql-native-0.1.6 and has since been deprecated. Currently we're using mysql-native-1.1.2 and the code should reflect such.

This causes a major amount of deprecation warnings printed by the compiler.

Allow session roles to be set across domains

Is your feature request related to a problem? Please describe.
Session roles are currently tied to a whole hosted application, but it should take multi-hosted environment into account.

This currently blocks the ability to have multiple authentications across domains in the same Diamond hosting environment. Ex. each domain will need a separate Diamond application hosted and that's not desirable. You should be able to have multiple websites running the same Diamond instance.

Describe the solution you'd like
When a session role is set during login then it should associate the domain name (and perhaps sub domain) to make sure it's only set for a single environment.

Describe alternatives you've considered
Currently there are no alternatives to this and work arounds are not user-friendly, because they require great knowledge of how Diamond's authentication work in-depth.

Additional context
N/A

Heya, any plans to continue work on Diamond?

After trying to get Diamond to work for a few hours now with a few friendly folks in the Discord, we've failed to do so.

Trying to run the examples on 3.0.0 results in errors such as


authentication-custom ~master: building configuration "application"...
..\..\..\..\..\AppData\Local\dub\packages\diamond-3.0.0\diamond\core\webinitialization.d-mixin-115(118,35): Error: `"login|login.dd"` is  not a valid filename on this platform
..\..\..\..\..\AppData\Local\dub\packages\diamond-3.0.0\diamond\core\webinitialization.d-mixin-115(118,35):        Character `'|'` is reserved and cannot be used
..\..\..\..\..\AppData\Local\dub\packages\diamond-3.0.0\diamond\views\viewgenerator.d(40,7): Error: mixin `diamond.app.web.GenerateViews!().generateViews.LoadViewData!false` error instantiating
..\..\..\..\..\AppData\Local\dub\packages\diamond-3.0.0\diamond\app\web.d(190,5): Error: mixin `diamond.app.web.GenerateViews!()` error instantiating
C:\D\dmd2\windows\bin\dmd.exe failed with exit code 1.

I had thought perhaps downgrading a version at a time would work. No dice. Errors produced are then


authentication-custom ~master: building configuration "application"...
controllers\authcontroller.d(22,8): Error: undefined identifier `HttpClient`
controllers\authcontroller.d(36,8): Error: undefined identifier `HttpClient`
controllers\authcontroller.d(43,7): Error: undefined identifier `IControllerAuth`
controllers\authcontroller.d(46,14): Error: undefined identifier `AuthStatus`
controllers\authcontroller.d(46,14): Error: undefined identifier `HttpClient`
controllers\authcontroller.d(55,8): Error: undefined identifier `AuthStatus`
controllers\authcontroller.d(67,2): Error: undefined identifier `HttpAuthentication`
controllers\authcontroller.d(67,51): Error: undefined identifier `ApiController`
controllers\authcontroller.d(71,3): Error: undefined identifier `HttpClient`
controllers\authcontroller.d(76,4): Error: undefined identifier `HttpDisableAuth`
controllers\authcontroller.d(76,21): Error: undefined identifier `HttpAction`
controllers\authcontroller.d(76,49): Error: undefined identifier `Status`
controllers\authcontroller.d(93,4): Error: undefined identifier `HttpDisableAuth`
controllers\authcontroller.d(93,21): Error: undefined identifier `HttpAction`
controllers\authcontroller.d(93,49): Error: undefined identifier `Status`
core\websettings.d(5,9): Error: undefined identifier `WebSettings`
..\..\..\..\..\AppData\Local\dub\packages\diamond-2.9.3\diamond\http\remote.d(20,6): Error: undefined identifier `HttpMethod`
core\websettings.d(17,17): Error: function `websettings.Settings.onApplicationStart` does not override any function
core\websettings.d(21,17): Error: undefined identifier `HttpClient`
core\websettings.d(26,17): Error: undefined identifier `HttpClient`

It's a real shame as Diamond looks to be exactly what we need. The documentation seems a bit sparse and the site's also not online.

Any update? Thanks!

PostgreSQL wrapper + ORM

There has to be made a wrapper to PostgreSQL, as well an ORM for it with similar style to the MySql ORM.

unhandledError: std.file.FileException@std/file.d(4642): public: No such file or directory

unhandledError: std.file.FileException@std/file.d(4642): public: No such file or directory

diamond-empty-project ~master: target for configuration "application" is up to date.
To force a rebuild of up-to-date targets, run again with --force.
Running ./diamond-empty-project
unhandledError: std.file.FileException@std/file.d(4642): public: No such file or directory
??:? @safe core.sys.posix.dirent.DIR* std.file.cenforce!(core.sys.posix.dirent.DIR*).cenforce(core.sys.posix.dirent.DIR*, scope lazy const(char)[], immutable(char)[], ulong) [0x149f70fb]
??:? @safe bool std.file.DirIteratorImpl.stepIn(immutable(char)[]) [0x149f5da5]
??:? ref @safe std.file.DirIteratorImpl std.file.DirIteratorImpl.__ctor!(immutable(char)[]).__ctor(immutable(char)[], std.file.SpanMode, bool) [0x14a3b2b8]
??:? ref @safe std.conv.emplaceRef!(std.file.DirIteratorImpl, std.file.DirIteratorImpl, immutable(char)[], std.file.SpanMode, bool).emplaceRef(ref std.file.DirIteratorImpl, ref immutable(char)[], ref std.file.SpanMode, ref bool).S std.conv.emplaceRef!(std.file.DirIteratorImpl, std.file.DirIteratorImpl, immutable(char)[], std.file.SpanMode, bool).emplaceRef(ref std.file.DirIteratorImpl, ref immutable(char)[], ref std.file.SpanMode, ref bool).S.__ctor(ref immutable(char)[], ref std.file.SpanMode, ref bool) [0x14a37096]
??:? @safe void std.conv.emplaceRef!(std.file.DirIteratorImpl, std.file.DirIteratorImpl, immutable(char)[], std.file.SpanMode, bool).emplaceRef(ref std.file.DirIteratorImpl, ref immutable(char)[], ref std.file.SpanMode, ref bool) [0x14a3703e]
??:? @safe std.file.DirIteratorImpl* std.conv.emplace!(std.file.DirIteratorImpl, immutable(char)[], std.file.SpanMode, bool).emplace(std.file.DirIteratorImpl*, ref immutable(char)[], ref std.file.SpanMode, ref bool) [0x14a36ff0]
??:? void std.typecons.RefCounted!(std.file.DirIteratorImpl, 0).RefCounted.RefCountedStore.initialize!(immutable(char)[], std.file.SpanMode, bool).initialize(ref immutable(char)[], ref std.file.SpanMode, ref bool) [0x14a03717]
??:? ref std.typecons.RefCounted!(std.file.DirIteratorImpl, 0).RefCounted std.typecons.RefCounted!(std.file.DirIteratorImpl, 0).RefCounted.__ctor!(immutable(char)[], std.file.SpanMode, bool).__ctor(ref immutable(char)[], ref std.file.SpanMode, ref bool) [0x14a036ac]
??:? ref @trusted std.file.DirIterator std.file.DirIterator.__ctor(immutable(char)[], std.file.SpanMode, bool) [0x149f6531]
??:? std.file.DirIterator std.file.dirEntries(immutable(char)[], std.file.SpanMode, bool) [0x149f6724]
../../../.dub/packages/diamond-2.10.1/diamond/init/web.d:202 void diamond.init.web.loadStaticFiles() [0x147786b6]
../../../.dub/packages/diamond-2.10.1/diamond/init/web.d:79 void diamond.init.web.runDiamond() [0x14776f2c]
../../../.dub/packages/diamond-2.10.1/diamond/init/web.d:35 _Dmain [0x14776e8c]
std.file.FileException@std/file.d(4642): public: No such file or directory
??:? @safe core.sys.posix.dirent.DIR* std.file.cenforce!(core.sys.posix.dirent.DIR*).cenforce(core.sys.posix.dirent.DIR*, scope lazy const(char)[], immutable(char)[], ulong) [0x149f70fb]
??:? @safe bool std.file.DirIteratorImpl.stepIn(immutable(char)[]) [0x149f5da5]
??:? ref @safe std.file.DirIteratorImpl std.file.DirIteratorImpl.__ctor!(immutable(char)[]).__ctor(immutable(char)[], std.file.SpanMode, bool) [0x14a3b2b8]
??:? ref @safe std.conv.emplaceRef!(std.file.DirIteratorImpl, std.file.DirIteratorImpl, immutable(char)[], std.file.SpanMode, bool).emplaceRef(ref std.file.DirIteratorImpl, ref immutable(char)[], ref std.file.SpanMode, ref bool).S std.conv.emplaceRef!(std.file.DirIteratorImpl, std.file.DirIteratorImpl, immutable(char)[], std.file.SpanMode, bool).emplaceRef(ref std.file.DirIteratorImpl, ref immutable(char)[], ref std.file.SpanMode, ref bool).S.__ctor(ref immutable(char)[], ref std.file.SpanMode, ref bool) [0x14a37096]
??:? @safe void std.conv.emplaceRef!(std.file.DirIteratorImpl, std.file.DirIteratorImpl, immutable(char)[], std.file.SpanMode, bool).emplaceRef(ref std.file.DirIteratorImpl, ref immutable(char)[], ref std.file.SpanMode, ref bool) [0x14a3703e]
??:? @safe std.file.DirIteratorImpl* std.conv.emplace!(std.file.DirIteratorImpl, immutable(char)[], std.file.SpanMode, bool).emplace(std.file.DirIteratorImpl*, ref immutable(char)[], ref std.file.SpanMode, ref bool) [0x14a36ff0]
??:? void std.typecons.RefCounted!(std.file.DirIteratorImpl, 0).RefCounted.RefCountedStore.initialize!(immutable(char)[], std.file.SpanMode, bool).initialize(ref immutable(char)[], ref std.file.SpanMode, ref bool) [0x14a03717]
??:? ref std.typecons.RefCounted!(std.file.DirIteratorImpl, 0).RefCounted std.typecons.RefCounted!(std.file.DirIteratorImpl, 0).RefCounted.__ctor!(immutable(char)[], std.file.SpanMode, bool).__ctor(ref immutable(char)[], ref std.file.SpanMode, ref bool) [0x14a036ac]
??:? ref @trusted std.file.DirIterator std.file.DirIterator.__ctor(immutable(char)[], std.file.SpanMode, bool) [0x149f6531]
??:? std.file.DirIterator std.file.dirEntries(immutable(char)[], std.file.SpanMode, bool) [0x149f6724]
../../../.dub/packages/diamond-2.10.1/diamond/init/web.d:202 void diamond.init.web.loadStaticFiles() [0x147786b6]
../../../.dub/packages/diamond-2.10.1/diamond/init/web.d:79 void diamond.init.web.runDiamond() [0x14776f2c]
../../../.dub/packages/diamond-2.10.1/diamond/init/web.d:35 _Dmain [0x14776e8c]
Program exited with code 1

  • Environment: Self-hosting
  • OS: Linux
  • Arch:x64
  • Diamond Version : 2.10.1
    -dmd 2.083

Issue with SSL Not Linking

Hey,

I am running Antergos Linux. I have cloned the empty template from here (https://github.com/DiamondMVC/Diamond-Template-WebServer), installed dub, and I have a working D compiler. When I run dub build, I get the following error:

Linking...
../../../.dub/packages/vibe-d-0.8.1/vibe-d/tls/.dub/build/openssl-debug-linux.posix-x86_64-dmd_2075-F5F99D71793CC778445BE6A734E64015/libvibe-d_tls.a(openssl_a5_569.o): In function `_D4vibe6stream7openssl14OpenSSLContext6__ctorMFNfE4vibe6stream3tls14TLSContextKindE4vibe6stream3tls10TLSVersionZ9__lambda3MFNbNeZv':
/home/levi/Desktop/Diamond-Template-WebServer/src/../../../.dub/packages/vibe-d-0.8.1/vibe-d/tls/vibe/stream/openssl.d:480: undefined reference to `SSLv23_client_method'
/home/levi/Desktop/Diamond-Template-WebServer/src/../../../.dub/packages/vibe-d-0.8.1/vibe-d/tls/vibe/stream/openssl.d:481: undefined reference to `SSLv23_client_method'
/home/levi/Desktop/Diamond-Template-WebServer/src/../../../.dub/packages/vibe-d-0.8.1/vibe-d/tls/vibe/stream/openssl.d:485: undefined reference to `SSLv23_client_method'
/home/levi/Desktop/Diamond-Template-WebServer/src/../../../.dub/packages/vibe-d-0.8.1/vibe-d/tls/vibe/stream/openssl.d:486: undefined reference to `SSLv23_client_method'
/home/levi/Desktop/Diamond-Template-WebServer/src/../../../.dub/packages/vibe-d-0.8.1/vibe-d/tls/vibe/stream/openssl.d:493: undefined reference to `SSLv23_server_method'
/home/levi/Desktop/Diamond-Template-WebServer/src/../../../.dub/packages/vibe-d-0.8.1/vibe-d/tls/vibe/stream/openssl.d:494: undefined reference to `SSLv23_server_method'
/home/levi/Desktop/Diamond-Template-WebServer/src/../../../.dub/packages/vibe-d-0.8.1/vibe-d/tls/vibe/stream/openssl.d:496: undefined reference to `SSLv23_server_method'
/home/levi/Desktop/Diamond-Template-WebServer/src/../../../.dub/packages/vibe-d-0.8.1/vibe-d/tls/vibe/stream/openssl.d:497: undefined reference to `SSLv23_server_method'
../../../.dub/packages/vibe-d-0.8.1/vibe-d/tls/.dub/build/openssl-debug-linux.posix-x86_64-dmd_2075-F5F99D71793CC778445BE6A734E64015/libvibe-d_tls.a(openssl_a5_569.o): In function `_D4vibe6stream7openssl14OpenSSLContext11setDHParamsMFNeAyaZv':
/home/levi/Desktop/Diamond-Template-WebServer/src/../../../.dub/packages/vibe-d-0.8.1/vibe-d/tls/vibe/stream/openssl.d:735: undefined reference to `get_rfc3526_prime_2048'
../../../.dub/packages/vibe-d-0.8.1/vibe-d/tls/.dub/build/openssl-debug-linux.posix-x86_64-dmd_2075-F5F99D71793CC778445BE6A734E64015/libvibe-d_tls.a(safestack_476_449.o): In function `_D6deimos7openssl9safestack57__T10SKM_sk_numTS6deimos7openssl6x509v315GENERAL_NAME_stZ16__T10SKM_sk_numZ10SKM_sk_numFNbPS6deimos7openssl9safestack54__T8STACK_OFTS6deimos7openssl6x509v315GENERAL_NAME_stZ8STACK_OFZi':
/home/levi/Desktop/Diamond-Template-WebServer/src/../../../.dub/packages/openssl-1.1.6_1.0.1g/openssl/deimos/openssl/safestack.d:140: undefined reference to `sk_num'
../../../.dub/packages/vibe-d-0.8.1/vibe-d/tls/.dub/build/openssl-debug-linux.posix-x86_64-dmd_2075-F5F99D71793CC778445BE6A734E64015/libvibe-d_tls.a(safestack_478_516.o): In function `_D6deimos7openssl9safestack59__T12SKM_sk_valueTS6deimos7openssl6x509v315GENERAL_NAME_stZ18__T12SKM_sk_valueZ12SKM_sk_valueFNbPS6deimos7openssl9safestack54__T8STACK_OFTS6deimos7openssl6x509v315GENERAL_NAME_stZ8STACK_OFiZPS6deimos7openssl6x509v315GENERAL_NAME_st':
/home/levi/Desktop/Diamond-Template-WebServer/src/../../../.dub/packages/openssl-1.1.6_1.0.1g/openssl/deimos/openssl/safestack.d:142: undefined reference to `sk_value'
../../../.dub/packages/vibe-d-0.8.1/vibe-d/tls/.dub/build/openssl-debug-linux.posix-x86_64-dmd_2075-F5F99D71793CC778445BE6A734E64015/libvibe-d_tls.a(openssl.o): In function `_D4vibe6stream7openssl18_sharedStaticCtor1FZv':
/home/levi/Desktop/Diamond-Template-WebServer/src/../../../.dub/packages/vibe-d-0.8.1/vibe-d/tls/vibe/stream/openssl.d:924: undefined reference to `SSL_load_error_strings'
/home/levi/Desktop/Diamond-Template-WebServer/src/../../../.dub/packages/vibe-d-0.8.1/vibe-d/tls/vibe/stream/openssl.d:925: undefined reference to `SSL_library_init'
/home/levi/Desktop/Diamond-Template-WebServer/src/../../../.dub/packages/vibe-d-0.8.1/vibe-d/tls/vibe/stream/openssl.d:927: undefined reference to `CRYPTO_num_locks'
/home/levi/Desktop/Diamond-Template-WebServer/src/../../../.dub/packages/vibe-d-0.8.1/vibe-d/tls/vibe/stream/openssl.d:935: undefined reference to `CRYPTO_set_id_callback'
/home/levi/Desktop/Diamond-Template-WebServer/src/../../../.dub/packages/vibe-d-0.8.1/vibe-d/tls/vibe/stream/openssl.d:936: undefined reference to `CRYPTO_set_locking_callback'
/home/levi/Desktop/Diamond-Template-WebServer/src/../../../.dub/packages/vibe-d-0.8.1/vibe-d/tls/vibe/stream/openssl.d:941: undefined reference to `SSL_get_ex_new_index'
collect2: error: ld returned 1 exit status
Error: linker exited with status 1
dmd failed with exit code 1.

It looks like there is some dependency vibe-d has on SSL, but I am unsure of how to troubleshoot further. Any help in troubleshooting would be appreciated.

Update code to support vibe.d v0.8.2

vibe.d v0.8.2 introduced some breaking changes that currently won't allow Diamond to build with 0.8.2 or above.

This means currently you have to manually set the version Diamond uses from:

"vibe-d": "~>0.8.1"

to:

"vibe-d": "0.8.1"

until I have updated all corresponding code that breaks.

use with apache and hosting support

is there doc to use diamond mvc with apache

and to be used on shared hosting envieonment on linux, in other words the setting options of resource limitation (io, memory, thread, cpu, process). that kind of stuff. thanks.

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.