GithubHelp home page GithubHelp logo

blogifierdotnet / blogifier Goto Github PK

View Code? Open in Web Editor NEW
1.2K 83.0 518.0 77.11 MB

Blogifier is an open-source publishing platform Written in ASP.NET and Blazor WebAssembly. With Blogifier make a personal blog or a website.

Home Page: https://blogifier.net

License: MIT License

HTML 27.98% C# 51.64% JavaScript 6.24% SCSS 13.92% Dockerfile 0.12% Batchfile 0.04% Shell 0.06%
dotnet dotnet-core dotnet5 mvc asp microsoft blogifier cms blogging

blogifier's Introduction


Blogifier

Blogifier is a self-hosted open source publishing platform written in ASP.NET and Blazor WebAssembly. It can be used to quickly and easily set up a lightweight, but fully functional personal or group blog.


English | 简体中文

Installation

Currently built from source [Not Released]

Can build in windows linux not tested on macOS, I prefer to deploy tests in docker.

native build

  1. Download .NET 7.0 SDK Choose to install the system version on your host. Download Nodejs 14 and above and install it on your host. For linux you can use the package management tool
  2. Navigate to the project root directory, run ./publish.cmd on the command line in widnows, run sh ./publish.sh on the command line in linux.
  3. When the command execution is complete and there are no errors, you will see the dist folder in the project root directory, which is the application after publishing. You can copy it to run anywhere. In windows, you can directly click to run the dist folder Blogifier.exe , in linux, please authorize the executable permission of the Blogifier binary file first and then click or run it on the command line. [note] Because the app_data directory does not exist in the release, an error may occur when the program starts. Just start it again.
  4. Then you can open localhost:5000 with your browser
  5. Done, enjoy.

docker build

First of all, please make sure that docker, docker-compose has been installed in your host.

  1. Navigate to the project root directory Run the docker-compose up -d command, wait a while ...
  2. Then you can open localhost:8080 with your browser
  3. Done, enjoy.

Versions before 3.0

Steps to install compiled application on the server for a self-hosting:

  1. .NET Core Runtime (currently 7.0) must be installed on your host server.
  2. Download the latest release.
  3. Unzip and copy to your host server.
  4. Restart your website.
  5. Open your website and only the first time you'll be redirected to the register page.
    example.com/admin/register/
  6. Register, and then log in.
    example.com/admin/login/
  7. Done, enjoy.

Development

If you want to customize the Blogifier, or contribute:

  1. Download and Install .NET SDK.
  2. Download and Install NodeJs.
  3. Download, fork, or clone the repository.
  4. Open the project with your favorite IDE (VS Code, Visual Studio, Atom, etc).
  5. Run the app with your IDE or these commands:
$ cd /your-local-path/Blogifier/src/Blogifier/
$ dotnet run

Then you can open localhost:5000 with your browser

Contributing

The current Blogifier is not perfect enough, blog software pursues perfect functions and easy to use, maybe wordpress is more suitable, relatively speaking, this project still lacks many functions. The latest version has not been released yet, and the current project is more suitable for developers to build and use by themselves. We can work together Improvement, implement a blog system completely implemented by dotnet technology. Faster, simpler, and smaller.

You can first propose functions in issues and develop them in pull requests, so that you can track the development progress. Everyone is welcome to participate in the development together. Let's learn and explore the latest technology of dotnet together.

Team

@dorthl   @farzindev   @rxtur

Copyright and License

Code released under the MIT License. Docs released under Creative Commons.
Copyright 2017–2023 Blogifier

blogifier's People

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  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

blogifier's Issues

Social buttons

Add ability for blogger to customize social buttons in the theme without modifying HTML code.

There should be "Custom fields" tab in settings allowing to enter social links. Theme can check if anything entered there and if yes display social button with href from custom field.

On application level, this should come from application settings.

Theme Settings

I thought it'd be useful to be able to configure a theme from the appsettings.json file (so that if someone downloaded a blog theme, they wouldn't have to go into the html/javascript for some basic settings).

I created a couple properties (Dictionary<string, string>) called BlogThemeSettings and AdminThemeSettings in ApplicationSettings, and populate it from appsettings.json.

In appsettings.json, I now have the following:

"BlogThemeSettings": { "FeaturedPosts": 2, ... }

The changes were relatively minor and I'm certainly open to doing this in other ways (I could, for example, create a JS file in my theme where all of the settings are if you guys don't want this in the appsettings.json file). The changes I've made are available in a commit: murst@a146424

RSS Feed Output invalid format

I needed to make changes to Feed.cs to pass RSS output validation tests. The feed would not load in a reader like Microsoft Outlook without changes. I also needed to hard-code the feed link URL as it was defaulting to https://MyWebsiteName/rss, not https://MyWebsiteName/blog/RSS.

The atom:link element was a recommended change and was not mandatory.

 //declare atom namespace
  public XNamespace atom = "http://www.w3.org/2005/Atom";

    public string Serialize()
    {
        var doc = new XDocument(new XElement("rss"));
        doc.Root.Add(new XAttribute("version", "2.0"));

       //add new XAttribute
       doc.Root.Add(new XAttribute(XNamespace.Xmlns + "atom", "http://www.w3.org/2005/Atom"));

        var channel = new XElement("channel");
        channel.Add(new XElement("title", this.Title));

       //hard-coded link
       channel.Add(new XElement("link", "https://portraitsbysimonbland.com/blog/RSS"));

        channel.Add(new XElement("description", this.Description));
        channel.Add(new XElement("copyright", this.Copyright));

       //new element in channel section
       var atomLink = new XElement(atom + "link", new XAttribute("href", 
           "https://portraitsbysimonbland.com/blog/RSS"),
           new XAttribute("rel", "self"), new XAttribute("type", "application/rss+xml"));

Custom HEAD suggestion

It might be more useful if the @Html.Raw(customHead) code was at the bottom of the _Head.cshtml file since it would facilitate overriding styles defined in the stylesheets provided by Blogifier.

Conflicting category slugs

When different authors create category with same name they conflict with each other. Make category slug unique by adding counter or use author/category combination.

Improve the description of Blogifier

I tried to get some feedback of what people thought of this project and I was mainly met with responses like "I don't even understand what it is/does". Maybe it would be a good idea to explain a bit more in depth about what Blogifier is and why people should use it. Simply saying that it "blogifies" ASP.NET sites doesn't really explain much about it.

I really think this project looks interesting and I look forward to seeing it grow. :)

Using themes from Blogifier.Core is broken on Ubuntu

When I set the AdminTheme or BlogTheme to 'Standard' (which is defined in the Blogifier.Core project), I get the following error on ubuntu:

InvalidOperationException: Cannot find compilation library location for package 'Microsoft.Win32.Registry'

this may be related to the following issue:

https://github.com/dotnet/core-setup/issues/2117

I can use themes defined in the WebApp project just fine, I just can't use any of the Views that are in Blogifier.Core

PartialViews or API

I've been really impressed with what you guys have done w/ Blogifier. I spent some time creating my own theme using angular material, and so far so good.

The biggest limitation I'm running into is that angular really shines in single-page apps. However, there's really not a good way to asynchronously request posts for the home page, single page, categories, authors, and search. This could be easily solved by adding PartialView results to controllers in Blogifier.Core. Even if your "standard" and "custom" themes don't support these views, it would allow others to create their own themes to take advantage of them. Another option would be to add api access. There is an API right now, but only for authenticated users - adding an anonymous api (something that preferably returns json or xml) would be an alternative solution.

If you guys are busy, I'd be happy to add either partial views or an API and create a pull request. I'd just like to know if that's something that you'd be interested in adding, and if so, which method you would prefer.

BTW, I only spent a few hours on this, but here's a version of your blog that runs on "stock" angular with angular material. I'd be much better with transitions, but I need a way of loading things async for that. I didn't need to modify anything in Blogifier.Core to make it work.

http://bloodforge.azurewebsites.net/blog

conditional statement of Disqus not working

In the "single.schtml" Conditional statement of Disqus is not working.
There are some CSS styles applied to the HTML wrapper of the Disqus that we don't want to be there when Disqus is not there.

Possible high database usage

I decided to take full advantage of my free trial of Azure and switched over to Azure SQL.

Azure SQL has a neat feature called "Query Performance Insight", which lists how many times queries have been ran, CPU usage, etc.

What really stood out to me was how many times some queries have been ran. I'm probably the only person accessing my site, and the following query:
(@__pc_CategoryId_0 int)SELECT TOP(1) [c].[Id], [c].[Description], [c].[ImgSrc], [c].[LastUpdated], [c].[ParentId], [c].[ProfileId], [c].[Rank], [c].[Slug], [c].[Title] FROM [Categories] AS [c] WHERE [c].[Id] = @__pc_CategoryId_0
has been executed about 50,000 times in the span of a few hours.

I'm not sure what exactly is causing this. My public APIs don't even contain the looping through categories that happens in BlogController.SinglePublication. The categories should really only be loaded once per user session (I do some jQuery queries to get the appropriate category name in a post view instead of relying on DB queries).

My best guess as to what is happening is the deep loading of the models. For example, a BlogPost contains a List<PostCategory> and Profile. Each PostCategory contains a BlogPost and Category, while a Profile contains a List<BlogPost>. I don't know if all of these get populated for each request, but I don't know how else to explain how I got 50k query executions by myself (in what was probably around 100 actual requests). My site has 6 categories, and 63 posts.

Obviously, 50k queries isn't very bad - but its pretty bad for my site. I'm guessing if I had more categories, more posts, and lots of users, the workload might become too much very quickly.

Feature Request -> manual post priority

It would be really nice if we had a way of forcing certain posts to appear first on the blog. Certain articles on my blog are much more popular than others, and I'd like them to appear on the home page, even though they are older posts.

A priority field could be added to posts (with a default priority of 0). All posts could be sorted by descending priority, followed by descending date.

Post cover on imported blogs mixed up

  1. Import posts from a BlogEngine blog using Import RSS function, including images (I used http://www.control-f5.com/syndication.axd in my import):
    image

  2. Set the cover on the first imported post using imported image1.

  3. Set the cover on the second imported post using imported image2.

Then after you go to the first post to view it again it's cover is changed from the one you first set. Tried it on
http://blogifier.azurewebsites.net/blog/alex0808
With user & pass:
[email protected]

Attaching files

There is currently an issue when attaching files which are non-images to blog posts. Testing with an excel document, the console throws the following error: Uncaught ReferenceError: humanFileSize is not defined
As a result the file is not attached to the post.

Editor improvement

I think it would be much better if we open a new tab and show the post when we click on the publish button.

Customizing Views

Awesome project, RTur - it worked right out of the box for me. As a BlogEngine.NET user for 6 years, I came to appreciate the quality of that app and I'm delighted that you've started this new project.

My question is about customization of the views. Once the Nuget package is installed and the settings changed to "CUSTOM", do I need to do anything more to set up custom views. I copied the Blogifier/Blog and Blogifier/Admin views over from the WebApp sample to my own app, but it still seems to be running the views in the core module. What am I missing?

Please let me know if I can help with this project to pay back for your efforts over the years. I don't think anyone would want to run any code that I've written, but I'd be glad to help with documentation, if needed.

Many thanks!
Simon

Adding Category

It would be better if we add a new category to the top of the list, not the end of the list. so we don't have to scroll to the bottom and then select it.

Also, the new category that we just added is good to be checked by default. so they don't need to do another action to select it.

blog route

1, There should be a way to set Constants.BlogRoute from the web application. Perhaps move it to AppSettings.json?

  1. Admin view: The "View" button in the post editor has a hard-coded 'blog/' path (inside 'editorController.js', line 179). This should be the same path as Constants.BlogRoute.

  2. Admin view: Clicking on the user profile (which opens the options to "View Blog" and "Log Out") and then clicking on "View Blog" navigates to ~/{author slug} . Instead, this should navigate to ~/{Constants.BlogRoute}

Razor pages

Problem with routing in case of integrating Blogifier.Core to an ASP.NET Core project with Razor pages.

The error we get is:
RouteCreationException: The following errors occurred with attribute routing information
For action: 'Blogifier.Core.Controllers.AdminController.Index (Blogifier.Core)'
Error: The attribute route 'admin/{page:int?}' cannot contain a parameter named '{page}'. Use '[page]' in the route template to insert the value ''
etc.
Regards, Senad

Post subtitle or description

It would be nice if there was an option to provide a subtitle or description for a blog post. If this value is set, the post list would display this value instead of just selecting the first 300 characters of the blog post.

Profile photo and Blog Description

So I've added the Profile Photo on the Author page, but need the right URL for each author.
Also now the Blog Description is the Author About, we have to have a separate textarea for the author about in Profile page.

PostListItem Description Field

The PostListItem should have a post description field, and this field needs to be populated when a PostListItem is created in the methods in PostRepository

File Picker Pagination

In the File Picker, We shouldn't show pagination if we don't have any pages.
I added a comment which div we have to hide.

Exception after using mysql

Exception :Message "An item with the same key has already been added. Key: Microsoft.EntityFrameworkCore.Infrastructure.Internal.MySqlOptionsExtension" string

Startup:
image

image

Mime types on scripts and css

Was unable to implement application options to prevent sniffing files and overriding the Content-Type header when using the standard admin Views because mime types are not set for the css and script content.

As a workaround I used a custom version of the admin app and added type="text/css" and type="text/javascript" tags where needed.

Should blogifier.core have these set by default?

Simon

postsController

js lint picked up a couple of (small) problems in postsController.js

function fail(jqXHR, exception) {
    var msg = '';
    if (jqXHR.status === 0) { msg = 'Not connect.\n Verify Network.'; }
    else if (jqXHR.status == 404) { msg = 'Requested page not found. [404]'; }
    else if (jqXHR.status == 500) { msg = 'Internal Server Error [500].'; }

I'm not sure if those last two should read jqXHRstatus === 404 and jqXHRstatus === 500, but I know nothing about js and type conversions.

Also, there might be a missing semi colon at around line 67 or 68.

Cheers.
Simon

Lots of .Result usages in awaitable methods

Looking at the code and finding lots of .Result usages when calling methods that return Task. This should be changed to avoid potential deadlock issues. These should be awaited and the controller actions be modified to be async and return Task<..model..>.

MySQL support

I have to use MySQL instead of SQLServer or Postgres.
Does Blogifier support MySQL?
If not how can I do that?

tinymce editor settings

It would be helpful if we had more control of the HTML that can go inside the tinymce editor. I was recently attempting to format the posts I imported from BlogEngine, and noticed that by default I cannot add my own SCRIPT or STYLE tags.

I fixed this by adding the following to tinymce.init() in editorController.js:

extended_valid_elements: '+*[*]', valid_children: '+body[style]',

Compiler Error in Production

I'm getting this error in my Production environment when I try to load the Admin app (it doesn't occur in my Development environment). Any thoughts?

Assembly 'Blogifier.Core' with identity 'Blogifier.Core, Version=1.4.5.0, Culture=neutral, PublicKeyToken=null' uses 'System.Runtime, Version=4.2.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' which has a higher version than referenced assembly 'System.Runtime' with identity 'System.Runtime, Version=4.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'

Add CORS

Currently it is not possible to call the public API without being in the same domain, for Javascript clients.
I know this is just the sample app but I think it's helpful to have CORS if someone wants to build a javascript app using the API.

Ex:
`

<script> fetch("http://blogifier.azurewebsites.net/blogifier/api/public/posts") .then(response => response.json()) .then(data => { console.log(data) }) .catch(err => { console.log(err) }) </script> `

Set up continuous integration

Would be nice to have some kind of automated build & unit test runner for each commit.
Orchard for example uses Travis Ci and Appveyor: https://ci.appveyor.com/project/alexbocharov/orchard2/branch/master

I can help setting up Appveyor (free to use for Open Source projects). I will set the appveyour Yaml file in my fork of Blogifier.Core and submit a PR.

Then you can go to https://ci.appveyor.com/signup and chose Free - for open source projects and set it up, it will hook to your github account and do continuos builds and run tests depending on the yaml config for each commit.

Asset Storage

Asset storage should be more flexible. Right now, it assumes all files (such as themes, profile logos, post images, etc) are stored in the same location (because they all use the same Blogifier.Core.Services.FileSystem.BlogStorage class). For hosts like Azure it might be fine to assume that themes are in the application directory, but post images would probably be better in a blob.

We should be able to configure which IBlobStorage providers are used for assets and themes.

I'm guessing it would probably be most appropriate to create an AzureBlob storage provider that implements IBlobStorage in the WebApp, and pass it into Blogifier, so that Blogifier.Core wouldn't have any dependencies on Azure.

This might already be on your to-do list, but I thought I'd create an issue in case it is not.

Featured Posts Migration

To get version 1.3 up and running you'll need to apply database migrations in order to add new columns to the Blogifier tables. You may find this useful if you're struggling with the commands.

My project structure is:

-PBSB_Core (startup project which depends on Blogifier.Core)
-Blogifier.Core

This is the PowerShell command I ended up using in order to apply the FeaturedPosts migration to the development database:

Update-Database -Migration FeaturedPosts -Project Blogifier.Core -StartupProject PBSB_Core -Context BlogifierDbContext

Cheers,
Simon

PostgreSql Question

I'm trying to switch over from using Azure to using Digital Ocean. I want to switch from SqlServer to PostgreSql, but I'm not sure what exactly is needed. I'm not getting the code from Nuget - I'm getting it directly from github so that I can modify stuff.

I have a version of linux running, and .net core is running as well. I'm just not clear on how to connect to the database.

Is the code for Blogifier.Core.PostgreSql available somewhere? Can I just use the Blogifier.Core project and point my webapp to PostgreSql for the database? I guess I'm not exactly clear on how to make this work on Linux with a different type of database.

Cover Post

There is a problem with selecting the image from file picker for "Cover" in the "New post".
but it works in the "Edit Post".

Profile Photo

when we remove the source file of the Profile Photo from "Files", I think we could replace it with default photo.

Link from BlogEngine to this repo?

Maybe it's a good idea to put up a link in the BlogEngine repo that informs visitors about this repo? I think BlogEngine still ranks pretty well in search engines, so it might drive more users to this project. Just a thought.

Blogifier Running in Production - some notes that might be helpful

I've just finished re-launching my blog using Blogifier so that it's now an integrated part of my main website at https://portraitsbysimonbland.com

I wanted to pass on some things that I came across that might be helpful. These are mostly just work-arounds, but I hit a problem with the RSS feed which is worth knowing about in advance.

I'm running this as a single blog application with a custom theme for the blog, standard theme for admin.

  1. In order to keep the same URLs as in BE, and also have the same view functionality, I ended up importing blogifier.core as a project (although there is probably an easier way to do this).

  2. I made small changes to PostRepository.cs because I wanted the default page to have the full content of each post, rather than the description.

     private List<PostListItem> GetItems(List<BlogPost> postList)
     {
         return postList.Select(p => new PostListItem
         {
             BlogPostId = p.Id,
             Slug = p.Slug,
             Title = p.Title,
             //Image = string.IsNullOrEmpty(p.Image) ? ApplicationSettings.PostImage : p.Image,  not used
             //Content = p.Description,   replaced this line with the one below
             Content = p.Content,
             Published = p.Published,
             AuthorName = p.Profile.AuthorName,
             AuthorEmail = p.Profile.AuthorEmail,
             BlogSlug = p.Profile.Slug,
             PostViews = p.PostViews
         }).ToList();
     }
    
  3. Commented out this controller: public IActionResult PostsByAuthor(string slug, int page = 1) because it would otherwise create duplicate URLs for the same content.

  4. Modified the categories controller so that the category page URLs will be the same as I had in BE:

    [Route("category/{cat}/{page:int?}")] //changed this attribute
    public IActionResult PostsByCategory(string cat, int page = 1) //removed slug parameter
    {
    string slug = "simon-bland"; //added parameter here with my blog name
    var model = _ds.GetPostsByCategory(slug, cat, page);
    if(model == null)
    return View(_theme + "Error.cshtml", 404);
    return View("~/Views/Blogifier/Blog/" + model.Profile.BlogTheme + "/Category.cshtml", model);
    }

  5. Added a bit of custom js because image classes work much better if they are set to img-responsive, also I needed to change the pager hrefs in the category view and this was the easiest way to do it.

$(function () {
//Change embedded image classes in blog posts to Bootstrap standard
$('img:not([class=""])').addClass("img-responsive center-block").css('width', '');
//Change pager button href for category paging
$('a[href^="/blog/simon-bland"]').each(function () {
var oldUrl = $(this).attr("href"); // Get current url
var newUrl = oldUrl.replace("/blog/simon-bland", "/blog/category"); // Create new url
$(this).attr("href", newUrl); // Set href value
});
});

  1. RSS Import. When importing from the old BE instance to the blogifier development database I found that I had a few posts with duplicate titles. The import failed after each duplicate was found, but the duplicate record was written to the Blogifier database. When the feed was restarted the first blog post was then duplicated and the feed failed again. I ended up using SSMS to delete all posts directly from the database. After repeating this a few times I was able to clean up the feed by changing the original titles in BE.

  2. I couldn't get RSS import to work on my production instance. I probably have too-tight restrictions on what is allowed. The RSS just gives me a message of "Failed" so I'm not sure what is going on. I worked around this problem by scripting the records from the development database in SSMS and imported the records directly into the production database from the scripts.

Hope that helps,
Simon

Suggestions for improvements

I know you guys are trying to finish up v1.2, but here's some suggestions for features/updated for 1.3 (or whatever version will be next):

  • Single Blog features are currently missing. There's no way to set/get the custom fields & get posts by category when in Single Blog mode. Perhaps the way to address that is to make the "admin" (or first) profile the default profile if no other profile is chosen?

  • Create a setting for "AdminRoute" that is equivalent to "BlogRoute" so that we can customize the blog admin path.

  • Add a (tinymce) field to "Profile" settings so that authors can write up a description for themselves. Then, clicking on the name of the author on a post (for example) could take you to their public profile page which talks about the author. From there, you could view their posts, etc.

  • Featured posts support

I've slowly been making progress on creating my own theme for Blogifier. There are still some public APIs that I needed to create to make this happen. Some of them are meant to address the points I raised above. I have a github repo for my theme. If you're interested in which APIs I needed to add (in case you want to add something similar to Blogifier), you can find them at https://github.com/murst/Blogifier-Angular-Material

Wrong theme in SettingsController

The SettingsController uses the following to set the theme:

_theme = string.Format("~/Views/Blogifier/Admin/{0}/Settings/", 
                ApplicationSettings.BlogTheme);

However, it should use the ApplicationSettings.AdminTheme instead. When creating a new theme for a blog, I might not want to mess with the AdminTheme at all - just the BlogTheme. Those files won't be there in such a scenario in the "admin" folder.

styles and javascript file manage

always need manually copy static file to embedded's folder,when styles file change or add new feature to js

can use add as link from wwwroot/*? or pre-build event or same new way auto do it when building?

Files Pagination

In the Edit Files, we have Pagination that belongs to the Files list, that shouldn't be in the Edit Files.

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.