GithubHelp home page GithubHelp logo

mudkipme / moememosandroid Goto Github PK

View Code? Open in Web Editor NEW
446.0 446.0 52.0 3.65 MB

An app to help you capture thoughts and ideas

Home Page: http://memos.moe

License: GNU General Public License v3.0

Kotlin 100.00%
android-application f-droid fdroid jetpack-compose kotlin-android memo note-taking self-hosted

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

moememosandroid's Issues

Copy local URL of attached images from editing window

Hello. Thanks for cool app.

I am expiriensing chalange to add images within notes. For example I need to put an image between text blocks:

Some text block
![](url)
Some text block

It better to add the item "Copu URL" to context menu under "Remove" attachment. It will help to add images inside notes, but not only in attachment.

Thanks

[request]Add more locale language

Sir, I love memos, and I found this app, its good to use, can you add new locale like Chinese( zh-cn and zh-tw) for this app? I can offer translated texts. Thanks.

Tablet support

The app could benefit from a multi-column view for notes on tablet devices.

color of the tag

IMG_20230523_202557.jpg

当前tag的文字颜色和其他文字相同,能否做不同颜色的区分?

Rendering Markdown Headings

Thank you for this beautiful app! At present, markdown headings seem to be rendered the same as regular text. Could it be possible to render headings differently?

图片放大有bug

复现: 单击图片放大时,图片会闪一下然后消失

手机是realme neo2 android 13

Local memos

Do you have intrest on making the app function with the device's storage?

New tag does not appear in the tag list

MoeMemosAndroid and MoeMemos will not add new tag to Memos tag list when adding new Memos (which have tags). I try to capture the network package and found:

When using the web page to publish memo, its behavior is POST /api/memo, and then POST /api/tag for the tags you added. But the behavior of the MoeMemos client is only the previous one, that is, only POST /api/memo. usememos/memos#1310 (comment)

How can I help to fix it? I found MemoInputPage.kt:MemoInputPage:submit in MoeMemosAndroid:

    fun submit() = coroutineScope.launch {
        memo?.let {
            viewModel.editMemo(memo.id, text.text).suspendOnSuccess {
                navController.popBackStack()
            }.suspendOnErrorMessage { message ->
                snackbarState.showSnackbar(message)
            }
            return@launch
        }

        viewModel.createMemo(text.text).suspendOnSuccess {
            text = TextFieldValue("")
            viewModel.updateDraft("")
            navController.popBackStack()
        }.suspendOnErrorMessage { message ->
            snackbarState.showSnackbar(message)
        }
    }

which will only call editMemo or createMemo method. But when I read memos web src, I found it upsert new tag after create or edit memos (in web/src/components/MemoEditor.tsx:handleSaveBtnClick): https://github.com/usememos/memos/blob/ca6839f59399d02723b9dce43ab3d6ee8cc98490/web/src/components/MemoEditor.tsx#L276

Do we need to accomplish a similar behavior like memos web API? I'm not sure if I can update tags in submit method, and I'm glad to add this feature after discussing with you.

cannot click urls

It appears I cannot click URLs with the app. Forcing me to click edit then 'copy/paste' by hand.
Please add this enhancement. TIA.

Upload photos not working

Not able to upload images, API returns error

POST "/api/resource"
Malformatted post resource request

Switching to /api/resource/blob seems to fix the issue

EDIT log from my memos server:

method=POST uri=/api/resource status=400 error=code=400, message=Malformatted post resource request, internal=invalid character '-' in numeric literal

Crashes on camera button clicked

adb logcat reports,

02-28 17:19:04.954 17947 17947 E AndroidRuntime: FATAL EXCEPTION: main
02-28 17:19:04.954 17947 17947 E AndroidRuntime: Process: me.mudkip.moememos, PID: 17947
02-28 17:19:04.954 17947 17947 E AndroidRuntime: android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.media.action.IMAGE_CAPTURE flg=0x3 clip={text/uri-list hasLabel(0) {U(content)}} (has extras) }
02-28 17:19:04.954 17947 17947 E AndroidRuntime: 	at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:2117)
02-28 17:19:04.954 17947 17947 E AndroidRuntime: 	at android.app.Instrumentation.execStartActivity(Instrumentation.java:1762)
02-28 17:19:04.954 17947 17947 E AndroidRuntime: 	at android.app.Activity.startActivityForResult(Activity.java:5410)
02-28 17:19:04.954 17947 17947 E AndroidRuntime: 	at androidx.activity.ComponentActivity.startActivityForResult(Unknown Source:0)
02-28 17:19:04.954 17947 17947 E AndroidRuntime: 	at d2.a$a.b(Unknown Source:0)
02-28 17:19:04.954 17947 17947 E AndroidRuntime: 	at androidx.activity.ComponentActivity$b.b(Unknown Source:261)
02-28 17:19:04.954 17947 17947 E AndroidRuntime: 	at androidx.activity.result.c.Q(Unknown Source:25)
02-28 17:19:04.954 17947 17947 E AndroidRuntime: 	at a.a.a(Unknown Source:4)
02-28 17:19:04.954 17947 17947 E AndroidRuntime: 	at a.l.Q(Unknown Source:2)
02-28 17:19:04.954 17947 17947 E AndroidRuntime: 	at v8.n.G(Unknown Source:73)
02-28 17:19:04.954 17947 17947 E AndroidRuntime: 	at k.x$b.h0(Unknown Source:16)
02-28 17:19:04.954 17947 17947 E AndroidRuntime: 	at l.e1$a$a.m(Unknown Source:123)
02-28 17:19:04.954 17947 17947 E AndroidRuntime: 	at d5.a.w(Unknown Source:8)
02-28 17:19:04.954 17947 17947 E AndroidRuntime: 	at b0.h1.a0(Unknown Source:77)
02-28 17:19:04.954 17947 17947 E AndroidRuntime: 	at b8.j.o(Unknown Source:128)
02-28 17:19:04.954 17947 17947 E AndroidRuntime: 	at b8.j.C(Unknown Source:43)
02-28 17:19:04.954 17947 17947 E AndroidRuntime: 	at b8.j.w(Unknown Source:16)
02-28 17:19:04.954 17947 17947 E AndroidRuntime: 	at d1.z.h(Unknown Source:55)
02-28 17:19:04.954 17947 17947 E AndroidRuntime: 	at d1.z.G(Unknown Source:8)
02-28 17:19:04.954 17947 17947 E AndroidRuntime: 	at i1.c.i(Unknown Source:13)
02-28 17:19:04.954 17947 17947 E AndroidRuntime: 	at d1.i.e(Unknown Source:89)
02-28 17:19:04.954 17947 17947 E AndroidRuntime: 	at d1.i.e(Unknown Source:75)
02-28 17:19:04.954 17947 17947 E AndroidRuntime: 	at d1.i.e(Unknown Source:75)
02-28 17:19:04.954 17947 17947 E AndroidRuntime: 	at d1.i.e(Unknown Source:75)
02-28 17:19:04.954 17947 17947 E AndroidRuntime: 	at d1.j.e(Unknown Source:30)
02-28 17:19:04.954 17947 17947 E AndroidRuntime: 	at r.w.d(Unknown Source:208)
02-28 17:19:04.954 17947 17947 E AndroidRuntime: 	at androidx.compose.ui.platform.AndroidComposeView.M(Unknown Source:77)
02-28 17:19:04.954 17947 17947 E AndroidRuntime: 	at androidx.compose.ui.platform.AndroidComposeView.C(Unknown Source:226)
02-28 17:19:04.954 17947 17947 E AndroidRuntime: 	at androidx.compose.ui.platform.AndroidComposeView.dispatchTouchEvent(Unknown Source:87)
02-28 17:19:04.954 17947 17947 E AndroidRuntime: 	at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3120)
02-28 17:19:04.954 17947 17947 E AndroidRuntime: 	at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2801)
02-28 17:19:04.954 17947 17947 E AndroidRuntime: 	at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3120)
02-28 17:19:04.954 17947 17947 E AndroidRuntime: 	at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2801)
02-28 17:19:04.954 17947 17947 E AndroidRuntime: 	at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3120)
02-28 17:19:04.954 17947 17947 E AndroidRuntime: 	at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2801)
02-28 17:19:04.954 17947 17947 E AndroidRuntime: 	at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3120)
02-28 17:19:04.954 17947 17947 E AndroidRuntime: 	at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2801)
02-28 17:19:04.954 17947 17947 E AndroidRuntime: 	at com.android.internal.policy.DecorView.superDispatchTouchEvent(DecorView.java:498)
02-28 17:19:04.954 17947 17947 E AndroidRuntime: 	at com.android.internal.policy.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1890)
02-28 17:19:04.954 17947 17947 E AndroidRuntime: 	at android.app.Activity.dispatchTouchEvent(Activity.java:4202)
02-28 17:19:04.954 17947 17947 E AndroidRuntime: 	at com.android.internal.policy.DecorView.dispatchTouchEvent(DecorView.java:456)
02-28 17:19:04.954 17947 17947 E AndroidRuntime: 	at android.view.View.dispatchPointerEvent(View.java:14858)
02-28 17:19:04.954 17947 17947 E AndroidRuntime: 	at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:6452)
02-28 17:19:04.954 17947 17947 E AndroidRuntime: 	at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:6253)
02-28 17:19:04.954 17947 17947 E AndroidRuntime: 	at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:5731)
02-28 17:19:04.954 17947 17947 E AndroidRuntime: 	at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:5788)
02-28 17:19:04.954 17947 17947 E AndroidRuntime: 	at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:5754)
02-28 17:19:04.954 17947 17947 E AndroidRuntime: 	at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:5919)
02-28 17:19:04.954 17947 17947 E AndroidRuntime: 	at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:5762)
02-28 17:19:04.954 17947 17947 E AndroidRuntime: 	at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:5976)
02-28 17:19:04.954 17947 17947 E AndroidRuntime: 	at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:5735)
02-28 17:19:04.954 17947 17947 E AndroidRuntime: 	at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:5788)
02-28 17:19:04.954 17947 17947 E AndroidRuntime: 	at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:5754)
02-28 17:19:04.954 17947 17947 E AndroidRuntime: 	at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:5762)
02-28 17:19:04.954 17947 17947 E AndroidRuntime: 	at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:5735)
02-28 17:19:04.954 17947 17947 E AndroidRuntime: 	at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:8702)
02-28 17:19:04.954 17947 17947 E AndroidRuntime: 	at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:8653)
02-28 17:19:04.954 17947 17947 E AndroidRuntime: 	at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:8622)
02-28 17:19:04.954 17947 17947 E AndroidRuntime: 	at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:8825)
02-28 17:19:04.954 17947 17947 E AndroidRuntime: 	at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:259)
02-28 17:19:04.954 17947 17947 E AndroidRuntime: 	at android.os.MessageQueue.nativePollOnce(Native Method)
02-28 17:19:04.954 17947 17947 E AndroidRuntime: 	at android.os.MessageQueue.next(MessageQueue.java:335)
02-28 17:19:04.958  1602  1661 W ActivityTaskManager:   Force finishing activity me.mudkip.moememos/.MainActivity
02-28 17:19:04.989  1602  5684 I ActivityManager: Process me.mudkip.moememos (pid 17947) has died: fg  TOP 
02-28 17:19:04.990  1602  2531 I WindowManager: WIN DEATH: Window{5cd6d22 u0 me.mudkip.moememos/me.mudkip.moememos.MainActivity}
02-28 17:19:04.990  1602  2531 W InputManager-JNI: Input channel object '5cd6d22 me.mudkip.moememos/me.mudkip.moememos.MainActivity (client)' was disposed without first being removed with the input manager!
02-28 17:19:05.034  1602  1676 W WindowManager: Failed to deliver inset state change to w=Window{5cd6d22 u0 me.mudkip.moememos/me.mudkip.moememos.MainActivity EXITING}
02-28 17:19:05.034  1602  1676 W WindowManager: android.os.DeadObjectException
02-28 17:19:05.034  1602  1676 W WindowManager: 	at android.os.BinderProxy.transactNative(Native Method)
02-28 17:19:05.034  1602  1676 W WindowManager: 	at android.os.BinderProxy.transact(BinderProxy.java:571)
02-28 17:19:05.034  1602  1676 W WindowManager: 	at android.view.IWindow$Stub$Proxy.insetsControlChanged(IWindow.java:687)
02-28 17:19:05.034  1602  1676 W WindowManager: 	at com.android.server.wm.WindowState.notifyInsetsControlChanged(WindowState.java:4037)
02-28 17:19:05.034  1602  1676 W WindowManager: 	at com.android.server.wm.InsetsStateController.lambda$notifyPendingInsetsControlChanged$6$InsetsStateController(InsetsStateController.java:552)
02-28 17:19:05.034  1602  1676 W WindowManager: 	at com.android.server.wm.InsetsStateController$$ExternalSyntheticLambda1.run(Unknown Source:2)
02-28 17:19:05.034  1602  1676 W WindowManager: 	at com.android.server.wm.WindowAnimator.executeAfterPrepareSurfacesRunnables(WindowAnimator.java:345)
02-28 17:19:05.034  1602  1676 W WindowManager: 	at com.android.server.wm.RootWindowContainer.performSurfacePlacementNoTrace(RootWindowContainer.java:887)
02-28 17:19:05.034  1602  1676 W WindowManager: 	at com.android.server.wm.RootWindowContainer.performSurfacePlacement(RootWindowContainer.java:824)
02-28 17:19:05.034  1602  1676 W WindowManager: 	at com.android.server.wm.WindowSurfacePlacer.performSurfacePlacementLoop(WindowSurfacePlacer.java:177)
02-28 17:19:05.034  1602  1676 W WindowManager: 	at com.android.server.wm.WindowSurfacePlacer.performSurfacePlacement(WindowSurfacePlacer.java:126)
02-28 17:19:05.034  1602  1676 W WindowManager: 	at com.android.server.wm.WindowSurfacePlacer.performSurfacePlacement(WindowSurfacePlacer.java:115)
02-28 17:19:05.034  1602  1676 W WindowManager: 	at com.android.server.wm.WindowSurfacePlacer$Traverser.run(WindowSurfacePlacer.java:57)
02-28 17:19:05.034  1602  1676 W WindowManager: 	at android.os.Handler.handleCallback(Handler.java:938)
02-28 17:19:05.034  1602  1676 W WindowManager: 	at android.os.Handler.dispatchMessage(Handler.java:99)
02-28 17:19:05.034  1602  1676 W WindowManager: 	at android.os.Looper.loopOnce(Looper.java:201)
02-28 17:19:05.034  1602  1676 W WindowManager: 	at android.os.Looper.loop(Looper.java:288)
02-28 17:19:05.034  1602  1676 W WindowManager: 	at android.os.HandlerThread.run(HandlerThread.java:67)
02-28 17:19:05.034  1602  1676 W WindowManager: 	at com.android.server.ServiceThread.run(ServiceThread.java:44)
02-28 17:19:05.460  1602  1675 W ActivityTaskManager: Activity top resumed state loss timeout for ActivityRecord{9421ee6 u0 me.mudkip.moememos/.MainActivity t-1 f}}

My Android runs LineageOS 19L.

Tags don't register at end of memo

If I'm writing a memo with a tag at the end, the tag isn't activated unless there's a following character (like a trailing space).

For example, "This is my memo #tagone #tagtwo" will activate #tagone but not #tagtwo.

If you add a trailing space, e.g. "This is my memo #tagone #tagtwo " now both tags will be active.

upload image with auto compression?

The storage of memos is minio. When I upload an image in moe, the image is compression automatically, any setting can upload image without xompression?

Link in MoeMemos renders strange

I write a link in Memos:

[[TEST] Google](https://www.google.com/)

and it will render like this on web page:

image

but in MoeMemos, characters after right bracket are lost:

image

Option to share link

Could it be possible to add an option to share the link to the note in the note context menu? The mobile UI's share sheet offers a link option.

Newline copy world

Hello thanks to make memos much better with this app !
Am on android 11
Last version of MoeMemos installed (0.6.0)
My memos self hosted is on last too !

When am typing and hit Enter to break a line the last word is copied on the new line !
Very enoying
Very but works if I add a Space at the end of my line
Screenshot_20230403-101316.png

Tanks again

折叠帖子以节省手机屏幕空间

使用时发现,长文帖子在手机上观看时,会直接占据整个屏幕,向下拖动很久才能划到其他帖子,很不方便。

因此想到,能否将长帖子进行折叠?比如指定一个长度,超过该长度的都进行折叠,用户需要点击展开查看全文;或者点入帖子查看详情,才能看到全文。后一种实现方式好像更好,可以完全规避长文划不到头的问题,按返回键即可回到帖子列表页面。

Compact View

Fantastic job on the Markdown headings :D They're a treat!

Would you consider adding an optional compact view? Presently, the list view shows the entirety of each note and this results in a lot of scrolling if even a single long note is involved. The compact view could just show the first line of a note along with date and/or tags.

Login fails with invalid access token on memos 0.13.2

Since upgrading to Memos 0.13.2, I cannot log into memos with the Moe Memos app. I always get an "Invalid access token" error. I am not sure if this is a Memos issue or a Moe Memos issue and so opened an issue in both places Note that I can access 0.13.2 via the web client with no issues and that things work normally when I roll back to 0.13.1.

I noticed that in the 0.13.2 changelog, they made some access token changes and am wondering if that is the issue.

Update: According to the memos team, the issue relates to API changes in memos that the Moe Memos team needs to implement. See this closed issue.

Add local functions.

I prefer to use local services with backup capabilities. Hopefully developers will consider native features. Thanks for your hard work

SSO support?

0.12.0 was released with OAuth2 support. To make it work, I think you'll need to persist the OAuth 2 code and POST it to /api/auth/signin/sso. The JSON body needs 3 fields:

  • The ID of the identity server configuration, not sure how to get that
  • A redirect URI. Could this be a custom app URI, something like me.mudkip.moememos//sso-redirect? Or maybe use the memos.moe domain? That way, the app can register and handle the URI rather than opening the web browser.
  • The OAuth2 code. Many providers support passing it as a query string parameter so extracting it from that may be the path.

Looking into how the JS interacts with the SSO, it calls an API method /api/idp which is not authenticated to get the list of configured SSO providers. Included in the response is the ID which is needed before.

Implement checklists

The app currently does not support checklist, it would be really useful to support them for my grocery list 😁

Screenshot_2022-11-22-21-50-27-20_ce65f4715c7a7a11bce05c685360eaee

Support for TLS with own CA

Hello,

I tried using Moe Memos, but my memos server uses an TLS certificate from my internal CA. My phone (Pixel 6) trusts this CA (ca cert imported to cert store), which works fine, I can access memos in the browser without certificate warnings. But Moe Memos won't connect and just says:

java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.

This should be fixable by adding a network service config which allows the app to trust user installed CA certificates, as it was by default before API level 24, as documented here: https://developer.android.com/training/articles/security-config#base-config .

It would be really nice if Moe Memos could support user installed CA certs :)

Timeline in MoeMemosAndroid displays abnormally

Thank you for fixing bugs! When I use MoeMemos 0.5.4 (installed by release apk) I may have found a timeline display bug. Timeline on webpages displays as follows:

IMG_20230226_002450

A memo sets as top, memos below published on several seconds ago; six minutes ago and an hour ago. But tineline in MoeMemos displays abnormally:

IMG_20230226_002500

Two memos not set as top but display on the top.

I don't know if it's a common problem, and I didn't find where to change ways of timeline display, how can I fix it? Thanks for.your reading!

Add todo items to list

Hello, thank you for the work on this application.

While I do appreciate being able to cross items off of a todo list, I would also like to be able to add to them easily.

In the desktop memos standard web interface there is a button to create a new check box, where that seems to be missing here.

Preferably it would be nice to be able to press enter and another check box will be created, but one thing at a time.

I would like to help out, however I am not a dev, nor do I know anything in Kotlin or Jetpack Compose.

I hope this is not too much to ask, thank you for your time.

"Protected" notes not shown

Hi!
Recently I discover both Memos and MoeMemos. Love they!

But I miss the "protected" notes to be shown to users others than propietary, or to be able to write they in the app.
Is there any plan to support this feature?
I believe is an important one.

Support offline use

This is a great app, I wish I could use it offline and automatically sync to memos when connected to the network.

For example, I'm writing some reading notes on the plane, but I don't have internet, so I can't use this app.

Widget

A home screen widget showing the latest memos and a button to add a new one would be great.

I can help with building that, if you want - I've been wanting to get into building Android widgets for some time now.

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.